尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Kubernetes Pod 管理从入门到实战:命令、YAML 与生命周期全解析

Kubernetes Pod 管理从入门到实战:命令、YAML 与生命周期全解析 前言为什么 Pod 是 K8s 的灵魂在 Kubernetes 的世界里Pod 是最小的部署单元也是绝大多数运维和开发人员最先接触的核心概念。如果把 K8s 集群比作一个操作系统那么 Pod 就是运行在其中的“进程”——但它又不仅仅是容器而是一组共享网络、存储和命名空间的容器集合。本文基于真实的生产级操作文档结合官方最佳实践系统梳理了 Pod 管理的命令式操作、声明式 YAML 配置、控制器管理以及生命周期探针等核心知识。无论你是刚入门 K8s 的新手还是希望夯实基础的老手这篇文章都会让你对 Pod 的理解更上一层楼。一、资源管理与三种操作模式Kubernetes 将一切抽象为资源——Pod、Service、Deployment、Namespace 等都是资源。管理这些资源有三种主流方式各有适用场景方式适用环境优点缺点命令式对象管理测试、调试简单直接快速验证无法审计、难以版本控制命令式对象配置开发环境可审计、可追溯配置文件多时操作繁琐声明式对象配置生产环境支持目录操作、声明期望状态意外情况下调试较复杂生产环境强烈推荐声明式配置kubectl apply -f它能让你像管理代码一样管理基础设施。二、命令式对象管理快速上手2.1 Namespace 管理Namespace 是 K8s 中实现多租户隔离的基础资源# 查看所有命名空间 kubectl get namespaces # 创建命名空间 kubectl create namespace timinglee # 删除命名空间会一并删除其下的所有资源 kubectl delete namespace timinglee2.2 Pod 的增删查改# 查看 Pod-o wide 显示 IP 和节点信息 kubectl get pods -o wide # 创建 Podrun 命令快速启动 kubectl run lee --image nginx:latest # 查看 Pod 详细状态排错利器 kubectl describe pod error # 删除 Pod kubectl delete pod error kubectl delete pods --all # 删除当前 namespace 下所有 Pod排错提示当 Pod 处于ImagePullBackOff或ErrImagePull状态时describe命令会直接告诉你镜像拉取失败的原因这是最常用的排错第一步。三、kubectl 八大实操命令3.1 create — 创建资源# 创建 Deployment控制器 kubectl create deployment webcluster --replicas 2 --image myapp:v1 # 查看控制器和 Pod kubectl get deployments.apps kubectl get pods3.2 edit — 在线编辑配置# 直接编辑运行中的 Deployment kubectl edit deployments.apps webcluster # 修改 replicas: 2 后保存即生效3.3 patch — 补丁式更新# 无需编辑完整文件只改一个字段 kubectl patch deployment webcluster -p {spec:{replicas:1}}3.4 expose — 暴露服务# 将 Deployment 暴露为 ServiceClusterIP 类型 kubectl expose deployment webcluster --port 80 --target-port 80 # 查看服务及端点 kubectl get svc kubectl describe svc webcluster # 通过 ClusterIP 访问 curl 10.97.61.108/hostname.html3.5 logs — 查看日志# 查看 Pod 日志 kubectl logs pod/webcluster-77c87d9946-gh9v73.6 attach exec — 进入容器# 交互式运行类似 docker run -it kubectl run -it testpod --image busybox:latest # 附加到运行中的容器 kubectl attach pod/testpod -it # 在容器中执行命令最常用 kubectl exec -it pod/testpod -- /bin/bash3.7 cp — 文件拷贝# 从 Pod 拷贝到宿主机 kubectl cp testpod:/usr/share/nginx/html/index.html /mnt/test # 从宿主机拷贝到 Pod kubectl cp /mnt/index.html testpod:/usr/share/nginx/html/index.html3.8 rollout — 版本管理# 查看滚动更新状态 kubectl rollout status deployment webcluster # 重启 Deployment滚动重启 kubectl rollout restart deployment webcluster # 查看历史版本 kubectl rollout history deployment webcluster3.9 scale — 扩缩容# 扩容到 4 个副本 kubectl scale deployment webcluster --replicas 4 # 缩容到 1 个副本 kubectl scale deployment webcluster --replicas 13.10 label — 标签管理# 查看 Pod 标签 kubectl get pods --show-labels # 添加标签 kubectl label pod webcluster-xxx appwebcluster # 删除标签key 后面加 - kubectl label pod webcluster-xxx app-标签是 K8s 中服务发现和控制器关联的核心机制Service 通过 selector 匹配 Pod 标签Deployment 通过标签管理自己的 Pod 集合。四、利用控制器实现版本更新与回滚4.1 创建带版本的 Deployment# 生成 YAML 模板dry-run 模式 kubectl create deployment webcluster --image myapp:v1 --replicas 2 \ --dry-runclient -o yaml webcluster.yml # 应用配置 kubectl apply -f webcluster.yml # 暴露为 NodePort 类型服务外部可访问 kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort # 访问测试 curl http://172.25.254.100:30713/hostname.html4.2 更新镜像版本# 更新镜像到 v2 kubectl set image deployment webcluster myappmyapp:v2 # 为此次更新添加变更记录便于审计 kubectl annotate deployment webcluster \ kubernetes.io/change-cause升级到 myapp:v2 --overwrite # 验证版本 curl http://172.25.254.100:30713 # 输出Hello MyApp | Version: v24.3 版本回滚# 查看历史版本 kubectl rollout history deployment webcluster # 回滚到指定版本 kubectl rollout undo deployment webcluster --to-revision 1 # 验证回滚结果 curl http://172.25.254.100:30713 # 输出Hello MyApp | Version: v1核心机制Deployment 每次变更都会生成一个新的 ReplicaSet旧的 ReplicaSet 保留默认保留 10 个历史版本从而实现秒级回滚。五、YAML 声明式配置生产级的正确姿势5.1 多容器 Pod同一个 Pod 中的容器共享网络和 IPC 命名空间可以通过localhost互相访问apiVersion: v1 kind: Pod metadata: name: testpod spec: containers: - image: myapp:v1 name: myapp1 - image: busyboxplus:latest name: busybox command: [/bin/sh, -c, sleep 10000]# 验证网络互通 kubectl exec -it pod/testpod -c busybox -- curl localhost # 返回 myapp:v1 的页面内容注意多容器 Pod 要避免端口冲突否则会报Address already in use。5.2 端口暴露hostPortspec: containers: - image: myapp:v1 name: myapp ports: - name: http containerPort: 80 hostPort: 80 # 绑定到宿主机端口 protocol: TCP配置后可直接通过节点 IP访问服务适用于调试或特定网络场景。5.3 环境变量注入spec: containers: - image: mysql:8.0 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: lee5.4 节点选择nodeSelectorspec: nodeSelector: kubernetes.io/hostname: k8s-node2 containers: - image: myapp:v1 name: myapp5.5 共享宿主机网络hostNetworkspec: hostNetwork: true containers: - image: busybox name: busybox command: [/bin/sh, -c, sleep 10000]启用后 Pod 直接使用宿主机网络栈ifconfig看到的将是宿主机的网卡信息。六、Pod 服务质量QoS等级QoS 等级决定了资源紧张时 Pod 被驱逐的优先级QoS 等级条件驱逐优先级Guaranteedlimits requestsCPU 和内存都设置且相等最低最安全Burstable设置了 requests 和 limits但不完全相等中等BestEffort未设置任何资源限制最高最先被驱逐# Guaranteed 示例 resources: limits: cpu: 500m memory: 100M requests: cpu: 500m memory: 100M # Burstable 示例 resources: limits: cpu: 700m memory: 200M requests: cpu: 500m memory: 100M生产建议关键业务 Pod 务必配置 Guaranteed 级别的资源限制。七、Pod 生命周期与探针7.1 Init 容器Init 容器在应用容器启动之前顺序执行且必须全部成功完成spec: initContainers: - name: init-check image: busybox command: [sh, -c, until test -e /testfile; do sleep 2; done] containers: - image: myapp:v1 name: myapp典型场景等待数据库就绪初始化配置文件执行数据迁移脚本7.2 存活探针livenessProbe检测容器是否活着失败则重启容器livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 3 periodSeconds: 1 timeoutSeconds: 1三种检测方式tcpSocketTCP 端口存活检测httpGetHTTP 请求返回 200-399 为成功exec在容器内执行命令返回 0 为成功7.3 就绪探针readinessProbe检测容器是否准备好接收流量失败则从 Service 的 Endpoints 中摘除readinessProbe: httpGet: path: /index.html port: 80 initialDelaySeconds: 3 periodSeconds: 2 timeoutSeconds: 1实战验证创建带 readinessProbe 的 Pod 并暴露 Service删除 Pod 内的index.html文件观察 Service 的 Endpoints 自动移除该 Pod IP重新创建文件后Pod 自动恢复流量接收7.4 三种探针的启动顺序Pod 启动 → startupProbe如配置→ 成功后 → livenessProbe readinessProbe 并行工作startupProbe用于慢启动应用成功之前禁用其他探针livenessProbe持续检查失败则重启readinessProbe持续检查失败则摘除流量八、重启策略restartPolicy策略行为Always无论什么原因退出都重启默认OnFailure仅当非正常退出退出码非 0时重启Never退出后不重启spec: restartPolicy: OnFailure总结与最佳实践场景推荐方式快速测试命令式kubectl run开发调试命令式对象配置kubectl create -f生产部署声明式kubectl apply -f服务暴露ServiceClusterIP/NodePort/LoadBalancer版本管理Deployment 滚动更新健康检查配置 livenessProbe readinessProbe资源控制设置 requests 和 limits尽量 Guaranteed容器初始化使用 Init 容器处理前置条件Kubernetes Pod 管理看似繁杂实则内核清晰声明期望状态让控制器自动调和。掌握命令是入门理解 YAML 是进阶精通探针和生命周期管理才是真正驾驭 K8s 的标志。希望这篇博客能成为你 K8s 学习路上的一个实用路标。文中所有示例均基于 Kubernetes v1.30 环境验证Harbor 仓库镜像myapp:v1/v2可自行构建或替换为任意 Nginx 镜像测试。延伸阅读Kubernetes 官方文档 - Podkubectl 命令参考
返回列表