Kubernetes Pod 完全指南:从入门到实战,轻松掌握容器编排核心
Kubernetes Pod 完全指南从入门到实战轻松掌握容器编排核心详解 Pod 概念、生命周期、多容器协同、静态 Pod 与资源文件编写附 Python 开发环境搭建写在前面在 Kubernetes 的世界里Pod是最核心、最基础的概念。它是你部署应用的最小单元也是学习 K8s 必须迈过的第一道坎。很多初学者容易把 Pod 和容器混为一谈或者搞不清楚为什么要有 Pod 这个东西。今天这篇文章我会从“为什么需要 Pod”讲起带你彻底搞懂Pod 是什么和容器有什么区别如何创建、查看、操作 Pod多容器 Pod 的设计模式Init Container 的使用场景静态 Pod 的秘密重启策略和生命周期管理如何用 PyCharm 高效编写 Kubernetes 资源文件无论你是准备 CKA 考试还是即将在生产环境部署应用这篇文章都能帮你打下扎实的基础。一、Pod 是什么为什么 Kubernetes 要管理 Pod 而不是容器1.1 从容器到 Pod先看一张经典对比图特性容器ContainerPodK8s 最小调度单位❌✅独立 IP✅✅多容器协同❌✅天然支持共享网络/存储❌✅内部容器可共享生命周期管理弱完整重启、自愈属于谁运行时Docker/containerdKubernetesPod 是 K8s 独有的抽象它把一个或多个容器打包成一个“逻辑主机”这些容器共享Network Namespace同一个 IP、端口空间可用 127.0.0.1 互访IPC Namespace进程间通信Volume存储卷形象比喻Pod 是一个“豌豆荚”里面的容器就是“豆子”它们共享营养网络、存储一起被调度、一起销毁。1.2 为什么 K8s 不直接管理容器容器太“原子”不适合直接调度。K8s 需要一个有完整身份、可独立调度的对象 —— 就是 Pod。支持多容器协同。很多场景需要 Sidecar日志、监控、Init Container初始化它们必须共享网络和存储。统一生命周期。Pod 提供统一的重启、滚动更新、扩缩容语义。解耦底层运行时。Pod 屏蔽了 Docker、containerd、CRI-O 的差异K8s 只跟 CRI 打交道。1.3 每个 Pod 里都有个“隐形”的 pause 容器每个 Pod 启动时会先创建一个pause 容器也叫 infra 容器它的作用是持有 Pod 的网络命名空间IP、端口保证 Pod 的生命周期独立于业务容器业务容器重启时IP 和网络不变可以理解为pause 房东业务容器 租客。房东占好房子命名空间租客随意换房子始终在。二、环境准备本文实验基于之前搭建的 Kubernetes 1.30 集群三个节点。为方便管理先创建一个专用命名空间kubectl create ns pods kubectl config set-context--current--namespacepods所有操作默认都在pods命名空间下进行。三、Pod 基本操作手把手实战3.1 创建 Pod命令行方式最简单的创建方式kubectl run web--imagenginx查看 Pod 状态kubectl get pod-owide你会看到 Pod 被调度到某个 worker 节点并分配了一个 Cluster IP10.224.x.x。3.2 查看 Pod 详情kubectl describe pod web# 详细信息事件、状态kubectl get pod web-oyaml# 完整 YAML 定义kubectl logs-fweb# 查看标准输出实时3.3 在 Pod 中执行命令kubectlexecweb --hostnamekubectlexec-itweb --bashkubectlexecweb --id3.4 复制文件到 Podkubectlcp/etc/hosts web:/new-hosts kubectlexecweb --ls/new-hosts3.5 删除 Podkubectl delete pod web默认有 30 秒优雅终止时间terminationGracePeriodSeconds。四、使用 YAML 文件创建 Pod推荐4.1 生成 YAML 模板kubectl run web--imagenginx --dry-runclient-oyamlweb.yaml生成的 YAML 类似apiVersion:v1kind:Podmetadata:labels:run:webname:webspec:containers:-image:nginxname:web应用 YAMLkubectl apply-fweb.yaml4.2 综合实战部署 WordPress MySQL两个独立 Pod步骤 1创建 MySQL Podkubectl run wordpress-db--imagemysql--envMYSQL_ROOT_PASSWORD123步骤 2创建 WordPress Podkubectl run wordpress-app--imagewordpress步骤 3端口转发临时对外暴露kubectl port-forward pod/wordpress-app--address10.1.8.308080:80步骤 4在 MySQL 中创建数据库和用户先获取 MySQL Pod 的 IPkubectl get pods-owide然后登录 MySQL 并创建库和用户可用kubectl exec -it wordpress-db -- mysql -uroot -p123进入容器。步骤 5访问http://10.1.8.30:8080完成 WordPress 安装。五、多容器 PodSidecar 模式一个 Pod 里可以跑多个容器它们共享网络和存储。典型的例子是Web 容器 日志收集容器。5.1 示例WordPress MySQL 放在同一个 Pod创建pod-blog.yamlapiVersion:v1kind:Podmetadata:name:bbslabels:run:bbsspec:containers:-name:mysqlimage:mysqlenv:-name:MYSQL_ROOT_PASSWORDvalue:123-name:MYSQL_DATABASEvalue:bbs-name:MYSQL_USERvalue:tom-name:MYSQL_PASSWORDvalue:123ports:-containerPort:3306-name:wordpressimage:wordpressenv:-name:WORDPRESS_DB_USERvalue:tom-name:WORDPRESS_DB_PASSWORDvalue:123-name:WORDPRESS_DB_NAMEvalue:bbs-name:WORDPRESS_DB_HOSTvalue:127.0.0.1# 关键使用 localhost 访问同一 Pod 内的 MySQLports:-containerPort:80hostPort:80# 直接暴露到宿主机 80 端口部署并访问宿主机 IP 即可看到 WordPress 安装界面。多容器 Pod 操作kubectlexecbbs-cwordpress --hostname# 指定容器执行kubectlcp/etc/hosts bbs:/new-hosts-cwordpress六、Pod 生命周期与状态6.1 常见 Pod 状态状态含义Pending正在调度或拉取镜像ContainerCreating正在创建容器Running正常运行Completed正常退出任务完成Error启动失败或异常退出CrashLoopBackOff反复重启失败ImagePullBackOff镜像拉取失败Terminating正在被删除6.2 重启策略restartPolicyPod 级别的重启策略影响所有容器Always只要容器退出就重启默认OnFailure只有非正常退出返回非 0才重启Never从不重启实验验证创建一个执行sleep 10的 busybox 容器分别测试三种策略观察 Pod 是否反复重建。6.3 Init Container初始化容器Init Container 在普通容器之前启动并且按顺序执行全部成功后方可启动主容器。典型应用场景等待依赖服务如数据库就绪执行数据初始化脚本克隆 Git 仓库到共享卷示例等待 Service 解析成功apiVersion:v1kind:Podmetadata:name:myapp-podspec:initContainers:-name:init-myserviceimage:busyboxcommand:[sh,-c,until nslookup myservice; do sleep 2; done;]-name:init-mydbimage:busyboxcommand:[sh,-c,until nslookup mydb; do sleep 2; done;]containers:-name:myappimage:busyboxcommand:[sh,-c,echo App started sleep 3600]先创建两个 Servicemyservice和mydb再创建这个 Pod观察 Init Container 如何阻塞等待 Service 就绪。七、静态 PodStatic Pod7.1 什么是静态 Pod静态 Pod 是由 kubelet 直接管理的 Pod不经过 API Server。Master 节点上的核心组件kube-apiserver、etcd 等就是以静态 Pod 方式运行的。7.2 查看静态 Pod 目录kubelet 的配置文件中staticPodPath指定了静态 Pod 清单目录grepstaticPodPath /var/lib/kubelet/config.yaml# 输出staticPodPath: /etc/kubernetes/manifests该目录下的 YAML 文件会被 kubelet 自动创建为 Pod这些 Pod 无法通过kubectl delete删除只能删除文件。注意不要随意修改这个目录下的文件否则会导致集群组件异常。八、高效编写 Kubernetes 资源文件PyCharm 环境为了方便编写 YAML我们可以在 PyCharm 中配置 Kubernetes 插件享受自动补全和语法高亮。8.1 安装 Python 和 PyCharm简要从 Python 官网下载 3.14.x 安装包务必勾选 “Add Python to PATH”安装 PyCharm Community 版建议 2025.3 及以上8.2 激活 PyCharm社区版无需激活专业版请使用正版授权这里提供一种临时激活方式仅供学习请支持正版获取激活插件老师提供先执行uninstall-all-users.vbs清理旧环境变量再执行install-current-user.vbs注入激活信息重启 PyCharm输入激活码即可8.3 安装 Kubernetes 插件打开 PyCharm →文件→设置→插件搜索KubernetesJetBrains 官方插件点击安装重启 IDE若网络问题无法在线安装可从官网下载对应版本的插件 ZIP然后通过从磁盘安装插件导入。8.4 创建 Kubernetes 资源文件右键项目 →新建→Kubernetes Resource选择资源类型如 Pod自动生成骨架如果文件未识别为 Kubernetes YAML可右键文件 →重写文件类型→Kubernetes Yaml现在编写 YAML 时输入apiVersion、kind等字段会有智能补全极大提升效率。九、思考题面试常问9.1 Pod 和容器的区别容器是运行时进程环境Pod 是K8s 的调度和管理单元Pod 可包含多个容器共享网络和存储Pod 有独立的 IP 和生命周期9.2 为什么 K8s 不直接管理容器容器太细粒度不适合多容器协同Pod 封装了网络、存储、生命周期提供统一管理接口解耦底层运行时9.3 pause 容器的作用持有 Pod 的 Network Namespace确保 Pod IP 和网络在业务容器重启时不变作为 Pod 中所有容器的“基础设施”十、总结与下篇预告本文从零开始详细讲解了 Kubernetes Pod 的概念、创建、操作、多容器设计、生命周期、静态 Pod以及如何用 PyCharm 高效编写资源文件。通过大量实战案例相信你已经对 Pod 有了深刻理解。接下来你可以继续学习Pod 的调度策略nodeSelector、亲和性控制器Deployment、StatefulSet、DaemonSetService 与 Ingress服务发现与负载均衡如果你觉得这篇文章对你有帮助欢迎点赞、收藏、评论你的支持是我持续输出的动力本文所有命令和 YAML 均基于 Kubernetes v1.30.2 containerd 1.7.20 实测如有版本差异请适当调整。