健康检查探针 Probe

Kubernetes 如何判断一个容器是「活着但卡死」还是「真的能接流量」?答案是探针(Probe):由 kubelet 周期性对容器发起检查,据此决定重启容器或把 Pod 从 Service 摘除,这是集群自愈与无损发布的基础。

三种探针的区别

探针检查目的失败后果
livenessProbe 存活探针进程在跑但应用是否卡死重启容器
readinessProbe 就绪探针是否准备好接收流量从 Service Endpoint 摘除,不重启
startupProbe 启动探针慢启动应用何时真正就绪保护前两种探针不误杀

三种检查方式

exec 在容器里执行命令、httpGet 请求 HTTP 接口、tcpSocket 建立 TCP 连接,可自由组合:

apiVersion: v1
kind: Pod
metadata:
  name: probe-demo
spec:
  containers:
    - name: app
      image: nginx
      livenessProbe:              # 存活:请求 /healthz
        httpGet:
          path: /healthz
          port: 80
      readinessProbe:             # 就绪:请求 /ready
        httpGet:
          path: /ready
          port: 80
      startupProbe:               # 启动:等文件出现
        exec:
          command: ["sh", "-c", "test -f /tmp/started"]
        failureThreshold: 30      # 慢启动最多等 30×10s

常用参数

参数默认值含义
initialDelaySeconds0容器启动后延迟多少秒再开始探测
periodSeconds10两次探测间隔
timeoutSeconds1单次探测超时
successThreshold1连续成功几次才算健康
failureThreshold3连续失败几次才判定不健康

就绪探针与 Service 摘流

三种探针与流量关系 就绪探针失败后,该 Pod 会立即从 Service 的 Endpoint 中移除,流量只发给就绪的 Pod——滚动更新时新 Pod 不就绪就不会被放流量,这正是「先就绪、后放量」无损发布的机制。

startupProbe 护慢启动

Java 等应用启动可能要几十秒,期间健康接口还没就绪,livenessProbe 会误判并反复重启。用 startupProbe 给足失败次数,存活/就绪探针会等它成功后才开始计时,避免启动期被杀。

误配导致的重启循环

探针路径 404、端口写错、timeoutSeconds 太小、initialDelaySeconds 不够,都会让健康容器被反复重启,表现为 CrashLoopBackOff:

kubectl get pods
# 输出:NAME         READY   STATUS             RESTARTS
#       probe-demo   0/1     CrashLoopBackOff   5
kubectl describe pod probe-demo    # 看探针失败事件与具体原因
kubectl logs probe-demo --previous # 看被杀前应用日志

先用 describe 确认是 liveness 失败,再用日志验证应用健康接口是否真的可用,然后针对性调大 timeoutSeconds 或 initialDelaySeconds。

小结:livenessProbe 管重启、readinessProbe 管摘流量、startupProbe 护慢启动;多数健康接口用 httpGet 即可;容器被反复重启先 describe 看探针事件,再核对路径、端口与参数。

笔记加载中…