【星海出品】pod管理

pod在整个生命周期过程中总会处于以下几个状态:

Pending: 创建pod资源并存入etcd中,但尚未完成调度。
ContainerCreating: pod调度完成,处于容器创建的过程中,通常是在拉取镜像的过程中。
Running: pod中所有容器都已经成功创建,并且成功运行起来。
Succeeded: pod中所有容器都已成功终止并不会被重启。
Failed: 所有容器都已经终止,但至少有一个容器终止失败,也就是说容器返回了非0值的退出状态或者已经被系统终止。
Unknown: 因为某些原因无法获取pod的状态,这种情况通常是因为与pod所在的主机通信失败。

初始化容器(initcontainer)
一个pod可以拥有任意数量的init容器。
init容器是按照顺序以此执行的,并且仅当最后一个init容器执行完毕才会去启动主容器。

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#init-containers-in-use

对Pod健康状态诊断,分为3种: StartupProbe(启动探测)、LivenessProbe(存活性探测)、ReadinessProbe(就绪性探测)

Startup(启动探测):探测容器是否正常运行
Liveness(存活性探测):判断容器是否处于runnning状态,根据重启策略决定是否重启容器
Readiness(就绪性检测):判断容器是否准备就绪并对外提供服务,将容器设置为不可用,不接受service转发的请求

存活探针:用于检测容器是否正在运行。如果失败,Kubelet 将杀死容器并根据重启策略重启。
就绪探针:用于检测容器是否准备好服务请求。如果失败,Pod 的 IP 地址将从 Service 的端点中移除。
启动探针:用于检测容器是否已经启动。如果失败,Kubelet 将杀死容器并重启。

三种探针用于Pod检测:

ExecAction:在容器中执行一个命令,并根据返回的状态码进行诊断,只有返回0为成功
TCPSocketAction:通过与容器的某TCP端口尝试建立连接
HTTPGetAction:通过向容器IP地址的某指定端口的path发起HTTP GET请求。

存活探针的核心作用

存活探针用于定期检查容器是否健康运行。如果检测失败(如应用无响应),Kubernetes 会:
终止当前容器
根据 Pod 的 restartPolicy 策略(默认 Always)重启容器

apiVersion: v1
kind: Pod
metadata:
  name: liveness
spec:
  containers:
  - name: myapp
    image: myapp:v1
    livenessProbe:
      tcpSocket:          # 探针类型:TCP 端口检查
        port: 8080        # 检查目标端口
      initialDelaySeconds: 3  # 容器启动后等待 3 秒再开始首次检查
      periodSeconds: 1        # 每隔 1 秒检查一次
      timeoutSeconds: 1       # 每次检查超时时间为 1 秒

扩展

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 5
livenessProbe:
  exec:
    command: ["cat", "/tmp/healthy"]

参数

initialDelaySeconds 0 容器启动后等待多久开始首次检查(需覆盖应用启动时间,避免误判)
periodSeconds 10 检查间隔(建议 ≥5 秒,避免频繁检查增加负载)
timeoutSeconds 1 单次检查超时时间(需 ≤ periodSeconds)
failureThreshold 3 连续失败次数阈值(达到后触发重启)
successThreshold 1 失败后恢复所需的连续成功次数(通常无需修改)

将 livenessProbe 块添加到目标容器的定义中
设置 initialDelaySeconds 略大于容器初始化时间。

kubectl describe pod liveness | grep -A 10 "Liveness"
常见问题与解决方案
  1. 探针误判健康
    现象:应用未就绪时探针已开始检查。
    解决:增大 initialDelaySeconds(如设为应用启动时间 + 2 秒)。
  2. 探针过于频繁
    现象:应用负载高时探针检查导致性能下降。
    解决:增大 periodSeconds(如设为 10 秒)。
  3. 探针超时
    现象:应用响应慢导致探针失败。
    解决:增大 timeoutSeconds 或优化应用性能。

示例

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp
    image: myapp:v1
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 3
    readinessProbe:  # 就绪探针(控制流量接入)
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5

kubectl logs 和事件分析 kubectl describe pod 进行查看

容器的重启策略

定义是否重启Pod对象。

Always:但凡Pod对象终止就重启,默认设置。
OnFailure:仅在Pod出现错误时才重启。
Never:从不。

注:一旦pod绑定到一个节点上,就不会重新绑定到另一个节点上,要么重启,要么终止

pod终止过程

  1. 用户发出删除pod命令:kubectl delete pod、kubectl delete -f
  2. pod对象随着时间的推移更新,在宽限期内(默认情况下30秒),pod被视为dead状态
  3. 将pod标记为Terminating状态,同时启动pod关闭过程。
  4. endpoints控制器监控到pod对象关闭,将pod与service匹配的endpoints列表中删除
  5. 如果pod中定义了preStop钩子处理程序,则pod被标记为Terminating状态时以同步的方式启动执行;若宽限期结束后,preStop仍未结束执行,第二步会重新执行并额外获得一个2秒的小宽限期
  6. pod内对象的容器收到TERM信号
  7. 宽限期结束后,若存在任何一个运行的进程,pod会收到SIGKILL信号
  8. kubelet请求API Server将此pod资源宽限期设置为0从而完成删除操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值