2-Pod生命周期和重启策略

1、Kubernetes 中创建 Pod 的完整流程

  1. 用户使用kubectl apply 命令提交创建请求
  2. 请求首先到达API Server,进行认证(Authentication)和授权(Authorization)检查,通过准入控制(Admission Control)进行验证和修改(如设置默认值)。通过验证后,API Server 将 Pod 配置信息写入etcd存储,此时 Pod 状态为 "Pending"
  3. 调度器(Scheduler)监视 API Server 获取未调度的Pod,(spec.nodeName 为空)调度器根据一些策略完成pod的调度,之后调度器将节点信息绑定到 Pod (更新 Pod 的 spec.nodeName),以下是调度时需要考虑的因素:
    • 资源请求和限制(cpu/memory)
    • 节点选择器(nodeSelector)和节点亲和性(affinity)
    • 污点(taints)和容忍(tolerations)
  4. Kubelet 接管 Pod,目标节点上的 Kubelet 通过 API Server 监测到有新的 Pod 被调度到本节点,Kubelet 开始创建 Pod 所需的环境:
    • 创建 Pod 沙盒环境(通常通过 CRI 接口调用容器运行时)
    • 挂载卷(通过 CSI 接口)
    • 拉取容器镜像(通过镜像服务)
  5. 容器运行时(如 containerd、Docker)根据 Kubelet 的指令创建并启动容器。如果本地没有镜像,还回去拉取镜像
  6. Pod 状态更新,Kubelet 持续监控 Pod 状态并上报给 API Server,Pod 状态从 Pending → ContainerCreating → Running,最后将状态信息写入 etcd
  7. CNI 网络插件为 Pod 配置网络,包括分配 IP 地址、设置网络接口、配置路由规则。至此pod启动完成

2、Pod常见状态

生命周期状态

  • Pending:这个状态表明API Server已经创建了该Pod,但Pod内还有容器没有创建(pod调度或镜像拉取中都有可能是pending状态)
  • Running:所有主容器成功启动,且通过了就绪检查(readiness probe)
  • Succeeded:Pod内所有容器均成功执行退出,且不会再重启
  • Failed:Pod内至少有一个容器退出为失败状态
  • Unknown:由于某种原因无法获取该Pod的状态

微观健康条件

  • PodScheduled:Pod 是否已成功分配到某个节点3。
  • PodReadyToStartContainers:Pod 的沙箱(Sandbox)是否已创建且网络配置就绪。
  • Initialized:所有的初始化容器(Init Containers)是否都已成功完成。
  • ContainersReady:Pod 内的所有容器是否都已准备就绪。
  • Ready:Pod 是否准备好接收外部流量(会被加入 Service 的负载均衡池)

细分阶段(kubectl get pod 显示)

kubectl get pods 的 STATUS 列显示的是一个综合状态,

  • ContainerCreating:容器正在创建中(拉取镜像、挂载卷、配置网络等)
  • Init:N/M:Pod 有 M 个 Init 容器,当前正在运行第 N 个。
  • PodInitializing:Init 容器已完成,主容器正在启动中。
  • CrashLoopBackOff:容器反复崩溃并重启,kubelet 正在以退避(BackOff)策略等待下一次重启。
  • ImagePullBackOff / ErrImagePull:镜像拉取失败,kubelet 正在退避重试。
  • OOMKilled:容器因内存使用超过了设定的 limits,被操作系统的 OOM Killer 杀掉。
  • CreateContainerConfigError:容器配置出错,通常是引用的 ConfigMap 或 Secret 不存在。
  • InvalidImageName:镜像名称格式非法。
  • Evicted:由于节点资源(如磁盘、内存)不足,Pod 被节点驱逐。
  • Terminating:Pod 正在被删除,处于优雅终止过程中(等待 preStop 钩子执行或超时)。
  • Completed:与 Succeeded 类似,表示容器正常退出,通常见于 Job 场景。

3、Pod 处于 Pending 状态的原因

  • 资源不足
    • 节点 CPU / 内存不足
    • Pod 请求资源超过节点可用资源
    • 调度限制
    • nodeSelector 不匹配
    • affinity 不满足
    • 存在 taint,但无对应 toleration
  • 存储问题
    • PVC 未绑定(无可用 PV)
    • StorageClass 配置错误或不存在
    • 镜像拉取失败
    • 镜像仓库不可达或过慢
  • 配额限制
    • ResourceQuota 已用尽
    • Pod 数量达到上限

Pending 排查方法

kubectl describe pod <pod> -n <ns>     # 查看 Events(最关键)
kubectl describe node <node>           # 检查资源情况
kubectl get resourcequota -n <ns>      # 检查配额
kubectl get pvc -n <ns>                # 检查存储
kubectl get events -n <ns>             # 查看集群事件

4、Pod 重启策略

  • 重启策略由 kubelet 执行,只作用于 Pod 内的容器
- Always       # 默认,容器退出就重启
- OnFailure    # 仅失败(非0退出码)才重启
- Never        # 不重启

5、控制器与重启策略限制

  • Deployment / ReplicaSet / DaemonSet:必须 Always
  • Job / CronJob:OnFailure 或 Never
  • 说明:
    • 控制器负责 Pod 重建
    • kubelet 负责容器重启
    • kubelet 本身不做健康检查(健康检查由 Probe 机制实现)
posted @ 2024-05-10 10:24  立勋  阅读(55)  评论(0)    收藏  举报