当前位置: 首页 > news >正文

Kubernetes Pod 全面详解(基础 + 进阶)

一、Pod 基础核心概念

1. 什么是 Pod?

Pod 是 Kubernetes 中最小部署单元,代表集群中的一个运行进程,可包含一个或多个紧密耦合的容器,这些容器共享网络、存储资源和 Linux 命名空间。

  • 不是直接管理容器,而是通过 Pod 封装容器;
  • 其他控制器(Deployment、StatefulSet 等)均围绕 Pod 扩展。

2. Pod 中的容器分类

Pod 包含三类容器,各司其职:

容器类型作用特点
基础容器(Infrastructure Container)提供 Pod 网络和存储基础(Pause 容器)每个 Pod 自动创建,用户透明;镜像为 pause-amd64,维护命名空间共享
初始化容器(InitContainers)容器启动前执行初始化任务(如等待依赖服务、配置初始化)按顺序执行,必须全部成功;失败则 Pod 重启(需配合 restartPolicy
应用容器(Main Containers)运行核心业务逻辑(如 Nginx、MySQL)初始化容器完成后并行启动;支持多容器协作(如日志收集 + 业务应用)

3. Pod 存在的核心意义

  1. 资源共享:多容器共享 IP(Pod IP)、端口、存储卷,避免容器间网络隔离带来的通信复杂问题;
  2. 生命周期绑定:同一 Pod 内的容器 “同生共死”(如日志容器与业务容器同时启动 / 停止);
  3. 简化管理:将紧密耦合的组件封装为一个单元,降低调度和运维复杂度。

4. Pod 实现机制(Pause 容器的作用)

在 Kubernetes 中,Pause 容器(也叫 “基础容器” 或 “暂停容器”)是每个 Pod 启动时自动创建的特殊容器,它不运行业务逻辑,而是为 Pod 内的所有应用容器提供 网络、存储和命名空间的基础支撑,是 Pod 实现 “多容器资源共享” 的核心载体。

Pause 容器的核心作用

Pause 容器的本质是通过 “抢占” Pod 的基础资源配置,让后续启动的应用容器能共享这些配置,具体作用可拆解为 3 点:

1. 提供 Pod 统一的网络命名空间

  • 当 Pod 启动时,Kubernetes 会先创建 Pause 容器,由它初始化一个 独立的网络命名空间(包含唯一的 Pod IP、端口范围等);

  • 后续 Pod 内的所有应用容器(如 Nginx、日志收集容器)会 “加入” 这个网络命名空间,共享同一个 Pod IP 和端口资源;

  • 这就实现了 “Pod 内多容器用 localhost 通信”(如日志容器通过 localhost:80 访问 Nginx 容器),且对外仅暴露一个 Pod IP,避免多容器网络隔离的复杂问题。

2. 维护 Pod 统一的存储命名空间

  • Pause 容器会先挂载 Pod 定义的所有存储卷(如 EmptyDir、PVC);

  • 应用容器通过 “复用相同的存储挂载配置”,可以访问同一个卷中的数据(如 Nginx 容器写入日志到 /var/log/nginx,日志容器从同一个路径读取日志);

  • 确保 Pod 内多容器的数据共享和持久化(即使某个应用容器重启,数据仍保存在共享卷中)。

3. 作为 Pod 的 “根进程”,稳定管理容器生命周期

  • Pause 容器的核心进程是 pause(一个极简的睡眠进程,几乎不占用资源),它会成为 Pod 内所有容器的 “父进程”;

  • 当 Pod 需终止时,Kubernetes 只需终止 Pause 容器,就能触发所有应用容器的优雅退出(避免部分容器遗漏终止);

  • 同时,Pause 容器的稳定运行(几乎不会崩溃)也确保了 Pod 网络 / 存储命名空间的持续存在,避免应用容器重启导致资源配置丢失。

Pause 容器的特点

  1. 资源占用极低:Pause 容器的镜像体积极小(仅几 KB 到几十 KB),运行时仅占用微量 CPU 和内存(几乎可忽略),不会对集群资源造成负担。

  2. 用户透明:Pause 容器由 Kubernetes 自动创建和管理,用户无需手动配置(通过 docker ps 可在 Node 节点上看到,但在 kubectl get pods 中不会显示,仅显示应用容器)。

  3. 与 Pod 生命周期绑定:Pause 容器与 Pod 同生共死 ——Pod 创建时它先启动,Pod 删除时它最后终止,确保整个 Pod 生命周期内资源配置的一致性。

如何查看 Pause 容器

1. 在 Node 节点上查看 Pause 容器进程

Pause 容器本质是一个 Docker 容器(或其他容器运行时的容器),可通过容器运行时命令查看:

# 1. 使用 docker 查看(若用 Docker 作为容器运行时)
docker ps | grep pause
# 输出示例(镜像名通常含 pause-amd64 或 pause)
# a1b2c3d4e5f6   registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"   2h ago   Up 2h   k8s_POD_nginx-pod_default_123456-7890_0# 2. 使用 crictl 查看(若用 containerd 作为容器运行时)
crictl ps | grep pause

2. 查看 Pause 容器的配置来源

Kubernetes 通过 kubelet 的启动参数指定 Pause 容器的镜像,可在 Node 节点上查看:

# 查看 kubelet 配置,找到 Pause 镜像参数
cat /etc/kubernetes/kubelet.conf | grep pod-infra-container-image
# 或直接查看 kubelet 启动命令(不同部署方式路径可能不同)
cat /opt/kubernetes/cfg/kubelet | grep pod-infra-container-image# 输出示例(使用阿里云镜像源,避免国外镜像拉取失败)
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0

为什么需要 Pause 容器?

如果没有 Pause 容器,Pod 内的多容器将面临两个核心问题:

  1. 网络混乱:每个容器会有独立的 IP,多容器间通信需跨网络,且对外暴露多个 IP,无法实现 “Pod 作为单一网络单元”;
  2. 资源管理失控:多容器的网络 / 存储配置需单独维护,容器重启后配置可能丢失,无法保证资源共享的稳定性。

Pause 容器通过 “统一资源配置 + 极简进程” 的设计,完美解决了这些问题,是 Kubernetes 实现 “Pod 作为最小部署单元” 的关键技术之一。

每个 Pod 启动时,Kubernetes 先创建 Pause 容器,再启动应用容器:

  • 网络隔离:Pause 容器创建 Pod 专属的网络命名空间,应用容器共享该命名空间(统一 Pod IP);
  • 存储共享:Pause 容器挂载存储卷,应用容器通过挂载同一卷实现数据共享;
  • 进程管理:Pause 容器作为 Pod 的 “根进程”,统一管理应用容器的生命周期。

示例:Node 节点查看 Pause 容器

# 查看 Pause 容器配置(kubelet 启动参数)
cat /opt/kubernetes/cfg/kubelet | grep pod-infra-container-image
# 查看运行中的 Pause 容器
docker ps | grep pause-amd64

5. Pod 的两种使用方式

类型特点适用场景
自主式 Pod无自我修复能力;节点故障后 Pod 被删除,不会重建临时测试、一次性任务
控制器管理的 Pod通过 Deployment/StatefulSet 等控制器创建;支持副本管理、自动修复、滚动更新生产环境业务(如 Web 服务、数据库)

二、Pod 关键配置(镜像 / 重启 / 健康检查)

1. 镜像拉取策略(imagePullPolicy)

定义容器启动时如何拉取镜像,可选值:

策略值作用适用场景
IfNotPresent(默认)本地有镜像则复用,无则拉取稳定版本镜像(避免重复拉取)
Always每次启动 Pod 都重新拉取镜像开发环境(需实时获取最新镜像)
Never仅使用本地镜像,不拉取远程镜像离线环境、固定版本镜像

示例配置:

spec:containers:- name: nginximage: nginx:1.14imagePullPolicy: Always  # 每次启动拉取镜像

2. 重启策略(restartPolicy)

定义容器退出后 Kubernetes 是否重启,作用于 Pod 内所有容器:

策略值作用适用场景
Always(默认)无论容器退出状态码如何,均重启生产环境服务(如 Web 应用)
OnFailure仅容器异常退出(状态码非 0)时重启批处理任务(正常结束不重启)
Never容器退出后不重启一次性测试任务

示例配置:

spec:restartPolicy: OnFailure  # 仅异常退出时重启containers:- name: busyboximage: busyboxargs: ["/bin/sh", "-c", "sleep 30; exit 3"]  # 30秒后异常退出(状态码3)

3. 健康检查(探针 Probe)

kubelet 定期诊断容器状态,避免 “假活”(容器运行但服务不可用)或 “僵死”(容器退出未重启),支持三种探针:

3.1 探针类型及作用
探针类型作用失败处理逻辑
livenessProbe(存活探针)检测容器是否 “存活”(如服务是否能响应)失败则杀死容器,按 restartPolicy 重启
readinessProbe(就绪探针)检测容器是否 “就绪”(如是否能接受请求)失败则从 Service 端点中剔除该 Pod
startupProbe(启动探针)检测应用是否启动完成(针对启动慢的应用,如 Java 服务)失败则重启容器;启动成功前其他探针无效
3.2 探针检查方式
检查方式原理示例配置
exec在容器内执行命令,返回码 0 为成功command: ["test", "-e", "/tmp/live"](检查文件是否存在)
httpGet发送 HTTP 请求,状态码 200-399 为成功path: /index.htmlport: 80(检查 Nginx 首页)
tcpSocket尝试 TCP 连接端口,连接成功为成功port: 3306(检查 MySQL 端口)
3.3 探针核心参数
参数作用默认值
initialDelaySeconds容器启动后延迟多久开始探测(秒)0
periodSeconds探测频率(秒)10
timeoutSeconds探测超时时间(秒)1
failureThreshold探测失败多少次后判定为失败3
3.4 示例:存活探针(exec 方式)
apiVersion: v1
kind: Pod
metadata:name: liveness-exec
spec:containers:- name: busyboximage: busyboxargs: ["/bin/sh", "-c", "touch /tmp/live; sleep 30; rm -rf /tmp/live; sleep 3600"]livenessProbe:exec:command: ["test", "-e", "/tmp/live"]  # 检查 /tmp/live 是否存在initialDelaySeconds: 5  # 启动 5 秒后开始探测periodSeconds: 3        # 每 3 秒探测一次
  • 前 30 秒:文件存在,探测成功;
  • 30 秒后:文件被删除,探测失败,kubelet 重启容器。

三、Pod 进阶配置(资源限制 / 生命周期钩子)

1. 资源限制(Requests & Limits)

为容器分配 CPU / 内存资源,避免资源争抢,保障集群稳定性:

  • Requests(请求):容器启动时最少需要的资源(调度依据,如节点必须有足够资源才能调度);
  • Limits(限制):容器运行时最多允许使用的资源(超出则 CPU 被限制、内存被 OOM 杀死)。
1.1 资源单位
资源类型单位说明示例
CPU1 CPU = 1 vCore;支持毫核(m),1000m = 1 CPU250m(0.25 CPU)、1(1 CPU)
内存支持二进制单位(Gi/Mi/Ki)或十进制单位(GB/MB/KB),推荐二进制(系统适配)64Mi(64 兆)、1Gi(1 吉)
1.2 示例配置
apiVersion: v1
kind: Pod
metadata:name: frontend
spec:containers:- name: app  # 业务容器image: my-app:v4resources:requests:  # 最少需求:0.25 CPU + 64Mi 内存cpu: "250m"memory: "64Mi"limits:   # 最大限制:0.5 CPU + 128Mi 内存cpu: "500m"memory: "128Mi"- name: log-aggregator  # 日志容器image: log-collector:v6resources:requests:cpu: "250m"memory: "64Mi"limits:cpu: "500m"memory: "128Mi"
1.3 查看资源使用情况
# 查看节点资源分配
kubectl describe node node01
# 查看 Pod 资源配置
kubectl describe pod frontend

2. 容器生命周期钩子(Lifecycle Hooks)

在容器启动后 / 终止前执行自定义操作,支持 postStart(启动后)和 preStop(终止前):

钩子类型执行时机作用示例
postStart容器创建后立即执行(不保证与容器内进程同步)初始化配置文件、注册服务到注册中心
preStop容器终止前执行(如 SIGTERM 信号发送前)关闭数据库连接、清理临时文件
示例配置
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demo
spec:containers:- name: nginximage: soscscs/myapp:v1lifecycle:postStart:  # 启动后执行:写入启动日志exec:command: ["/bin/sh", "-c", "echo '容器启动' >> /var/log/nginx/start.log"]preStop:   # 终止前执行:写入停止日志exec:command: ["/bin/sh", "-c", "echo '容器停止' >> /var/log/nginx/stop.log"]volumeMounts:  # 挂载存储卷,持久化日志- name: log-volumemountPath: /var/log/nginxvolumes:- name: log-volumehostPath:path: /data/nginx/logtype: DirectoryOrCreate  # 目录不存在则创建

四、Pod 状态与容器生命周期

1. Pod 状态(Phase)

Pod 从创建到终止的完整生命周期包含 5 种状态:

状态值含义常见原因
PendingPod 已被集群接受,但容器未全部创建(如调度中、镜像拉取中)镜像拉取慢、节点资源不足、调度规则不匹配
RunningPod 已调度到节点,所有容器启动完成,至少一个容器运行中正常运行状态
Succeeded所有容器正常终止(状态码 0),且不会重启一次性任务完成(如批处理脚本执行结束)
Failed所有容器终止,至少一个容器异常退出(状态码非 0)或被系统杀死应用崩溃、资源超出限制(OOM)
Unknown无法获取 Pod 状态(如节点通信故障)节点离线、kubelet 服务异常

2. 容器生命周期状态

容器在 Pod 内的状态细分,反映容器内部进程状态:

状态值含义过渡逻辑
Waiting容器启动中(如镜像拉取、初始化),未就绪Pending → Waiting → Running(成功);Waiting → Terminated(失败)
Running容器运行正常,业务进程正常提供服务需配合就绪探针判断是否可接受请求
Terminated容器终止(正常 / 异常)正常终止(状态码 0)、异常终止(状态码非 0,如应用崩溃)

五、核心操作命令(Pod 管理)

# 1. 创建 Pod(基于 YAML)
kubectl apply -f pod.yaml# 2. 查看 Pod 列表
kubectl get pods [-n 命名空间] [-o wide]  # -o wide 显示 Pod IP、所在节点# 3. 查看 Pod 详细信息(含事件、容器配置)
kubectl describe pod <pod-name> [-n 命名空间]# 4. 进入 Pod 内容器(-c 指定容器,多容器时必填)
kubectl exec -it <pod-name> [-c <container-name>] -- bash# 5. 查看容器日志(-f 实时跟踪)
kubectl logs <pod-name> [-c <container-name>] [-f]# 6. 删除 Pod
kubectl delete pod <pod-name> [-n 命名空间]
# 强制删除(卡在 Terminating 状态时)
kubectl delete pod <pod-name> --force --grace-period=0# 7. 查看 Pod 资源使用情况
kubectl top pod <pod-name>

Pod 的创建是一个多组件协同工作的过程,基于 Kubernetes 核心的 List-Watch 事件驱动模型,确保集群状态始终与期望状态一致。以下是完整流程解析:

一、核心前提:组件监听机制(List-Watch)

Kubernetes 集群启动后,三大核心组件通过 HTTPS 6443 端口 持续监听 API Server 的资源事件变化,形成闭环控制:

组件

监听对象

核心职责

Controller Manager

副本控制类资源(Deployment、ReplicaSet 等)

确保 Pod 副本数量、状态符合期望

Scheduler

未调度的 Pod(Pending 状态)

为 Pod 选择最优运行节点

kubelet

分配到本节点的 Pod

在节点上创建、运行容器,并维护 Pod 生命周期

二、Pod 创建完整流程(13 步骤)

1. 用户发起创建请求用户通过 kubectl 或 API 客户端提交 Pod 配置(如 kubectl apply -f pod.yaml),请求发送至 API Server。2. API Server 验证与存储API Server 校验请求合法性(如字段格式、权限),通过后将 Pod 元数据(名称、标签、规格等)写入 etcd。写入成功后,API Server 向客户端返回确认信息。3. etcd 触发创建事件etcd 存储 Pod 信息后,触发 Create 事件,并将事件推送至 API Server。4. Controller Manager 处理事件Controller Manager 通过 Watch 机制感知到新 Pod 创建事件。若 Pod 由控制器(如 Deployment)管理,ReplicaSet 会检查当前副本数是否符合期望,自动创建 / 删除 Pod 以补全数量(扩缩容逻辑)。5. API Server 更新 etcd 信息Controller Manager 完成副本调整后,API Server 将 Pod 详细信息(副本数、容器规格等)更新至 etcd。6. etcd 触发更新事件etcd 确认信息更新后,再次向 API Server 发送 Update 事件。7. Scheduler 调度 PodScheduler 监听至处于 Pending 状态(未分配节点)的 Pod。基于调度算法(节点资源、亲和性、污点容忍度等)筛选最优节点,确定 Pod 运行位置。8. 记录调度结果Scheduler 将选定的节点信息提交至 API Server,API Server 更新 etcd 中 Pod 的 Node 绑定关系。9. etcd 确认调度结果etcd 同步 Pod 与节点的绑定信息,返回确认给 API Server。10. kubelet 接收 Pod 任务目标节点的 kubelet 通过 Watch 机制发现分配给自己的新 Pod。11. kubelet 启动容器kubelet 调用容器运行时(Docker/containerd)执行以下操作:拉取容器镜像(根据 imagePullPolicy 策略);创建并启动 Pause 容器(初始化网络和存储命名空间);启动应用容器(共享 Pause 容器的网络和存储)。12. 上报 Pod 状态容器启动成功后,kubelet 将 Pod 状态(如 Running)上报至 API Server。13. 同步最终状态API Server 将 Pod 最新状态(Running/Failed 等)写入 etcd,集群状态完成同步。

三、kubelet 持续监听的原因

Pod 创建完成后,kubelet 仍持续监听 Pod 事件,核心目的是 保证集群状态的动态一致性

  1. 应对副本变化:当用户通过控制器(如 Deployment)调整副本数时,kubelet 会感知新 Pod 并在节点上创建,或删除多余 Pod。

  2. 处理镜像更新:若 Pod 配置中的镜像版本更新(如 nginx:1.14 → nginx:1.21),kubelet 会自动拉取新镜像并重启容器。

  3. 维护容器健康:通过存活探针(livenessProbe)检测容器状态,异常时按 restartPolicy 重启容器。

  4. 响应节点资源变化:若节点资源不足或故障,kubelet 会上报状态,触发 Scheduler 重新调度 Pod。

总结

Pod 的创建流程是 Kubernetes 声明式 API 和 事件驱动模型 的典型体现:

  • 所有操作通过 API Server 作为统一入口,确保数据一致性;

  • 组件间通过 List-Watch 机制松耦合协作,无需直接通信;

  • 最终由 kubelet 负责在节点上落地执行,完成容器生命周期管理。

这种设计保证了集群的高可用性和动态扩展性,即使面对节点故障、资源变化等场景,也能自动恢复至期望状态。

http://www.dtcms.com/a/478677.html

相关文章:

  • JAVA算法练习题day40
  • 电子电气架构 --- 车载多系统架构
  • JVM 垃圾回收算法
  • 宁波企业如何建网站网站 提示危险
  • 嵌入式开发--STM32H7系列的硬件SPI的读写函数问题
  • printk 使用技巧
  • 深度学习入门(六)——模块、正则化与工程调优全解析
  • python高级05——HTTP协议和静态服务器
  • 现在网站一般做多大的南沙网站建设哪家好
  • 使用Mathematica做Lorenz系统的稳定性分析
  • centos升级redis至最新版(绿色版)
  • 做logo宣传语的网站电影网页设计素材
  • 从C++开始的编程生活(11)——string类基本语法和string类的基本实现
  • 南宁网站建设策划外包培训机构营销方案
  • 建站用什么搭建比较好网站后台是什么
  • 官方网站开发与定制广州网道营销广告有限公司
  • 设置 windows nginx.exe 每天 重启
  • 优先级队列(堆)-703.数据流中的最大值-力扣(LeetCode)
  • 亚马逊自养号测评新手从零起步:环境搭建全流程指南
  • 数据结构_栈和队列
  • 江苏优化网站关键词wordpress子域
  • 怎么用Visio studio做网站北京网页网站设计制作
  • html css网页制作成品——HTML+CSS盐津铺子网页设计(5页)附源码
  • 网站编辑简历网站建设域名什么意思
  • 如何做网站内链优化个人网站建设咨询电话
  • 网站色彩搭配原则拼多多 wordpress
  • 网站建站网站设计公司深圳网站建设 龙华信科
  • 花瓣网是仿国外那个网站做的深圳全网营销方案
  • 网站首页引导页 模版网站制作类软件推荐
  • 【LeetCode】71. 简化路径