pod探针probe

在 Kubernetes 中,​​Pod 探针(Probe)​​ 是用于监控容器健康状态的重要机制。它允许 Kubernetes 判断容器是否健康运行,并根据探针结果决定是否重启容器、终止 Pod 或从 Service 后端移除该 Pod。探针主要分为三种类型:
[[服务健康检测]]

0.1 ​​1. 探针的三种类型​

​(1) Liveness Probe(存活探针)​


<font color="#9bbb59">健康状态检查,周期性检查服务是否存活,检查结果失败,将"重启"容器(删除源容器并重新创建新容器)。</font>
<font color="#9bbb59">- ​​作用​​:检查容器是否仍在运行。如果探测失败,Kubernetes 会​​重启容器​​(认为容器可能卡死或僵死)。</font>
<font color="#9bbb59">- ​​典型场景​​:</font>
<font color="#9bbb59"> – 检查应用主进程是否崩溃(如 Java 应用的 PID 1 是否存活)。</font>
<font color="#9bbb59"> – 检测应用是否进入无响应状态(如 HTTP 服务是否卡死)。</font>

​(2) Readiness Probe(就绪探针)​

<font color="#9bbb59">可用性检查,周期性检查服务是否可用,从而判断容器是否就绪</font>
<font color="#9bbb59">- ​​作用​​:检查容器是否已准备好接收流量。如果探测失败,Kubernetes 会​​从 Service 的 Endpoints 中移除该 Pod​​(暂时不转发流量给它),直到探测成功。</font>
<font color="#9bbb59">- ​​典型场景​​:</font>
<font color="#9bbb59"> – 应用启动后需要完成初始化(如加载缓存、连接数据库)。</font>
<font color="#9bbb59"> – 应用依赖的外部服务(如数据库)是否可用。</font>

​(3) Startup Probe(启动探针)​​(Kubernetes 1.16+ 引入)

如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。
如果启动探测失败,kubelet将杀死容器,而容器依其重启策略进行重启。
如果容器没有提供启动探测,则默认状态为 Success

  • ​典型场景​​:
    • 应用启动时间较长(如 Java 应用需要加载大量依赖)。
    • 避免因启动慢导致 Liveness Probe 过早判定容器死亡。

0.2 ​​2. 探针的探测方式​

每种探针支持以下三种探测方式:

探测方式 说明 适用场景
exec 在容器内执行命令,根据命令退出码判断健康状态(0 表示成功)。 检查文件是否存在、自定义脚本验证等。
httpGet 向容器内的指定端口和路径发送 HTTP GET 请求,根据状态码判断健康状态(2xx3xx 表示成功)。>=400表示失败 HTTP 服务(如 REST API)。
tcpSocket 尝试与容器的指定端口建立 TCP 连接,如果连接成功则认为健康。 数据库、Redis 等基于 TCP 的服务。

0.3 ​​3. 探针的配置参数​

每种探针支持以下关键参数:

参数 说明 默认值
initialDelaySeconds 容器启动后等待多少秒再开始第一次探测。 0
periodSeconds 探测间隔时间(单位:秒)。 10
timeoutSeconds 探测超时时间(单位:秒)。 1
successThreshold 连续多少次探测成功才认为容器健康。 1
failureThreshold 连续多少次探测失败才认为容器不健康。 3

0.4 ​​4. 探针配置示例​

​示例 1:HTTP 服务的探针配置​

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app

spec:
  replicas: 2
  selector:
    matchLabels:
      apps: xiuxian
  template:
    metadata:
      labels:
          apps: xiuxian
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /  # 检查根路径
            port: 80
          initialDelaySeconds: 5  # 容器启动 5 秒后开始探测
          periodSeconds: 10       # 每 10 秒探测一次
        readinessProbe:
          httpGet:
            path: /index.html  # 检查自定义健康检查路径
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 5
---

apiVersion: v1
kind: Service
metadata:
  name: svc-xiuxian
spec:
  type: ClusterIP
  clusterIP: 10.200.0.200
  selector:
     apps: xiuxian
  ports:
  - port: 80
    targetPort: 80

​示例 2:TCP 服务的探针配置(如 Redis)​

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  template:
    spec:
      containers:
      - name: redis
        image: redis
        ports:
        - containerPort: 6379
        livenessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 10
          periodSeconds: 5
        readinessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 5
          periodSeconds: 5

​示例 3:启动探针(避免启动慢导致误杀)​

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30  # 等待 30 秒后再开始 Liveness 探测
  periodSeconds: 10
startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  failureThreshold: 30     # 最多失败 30 次(约 5 分钟,假设 periodSeconds=10)
  periodSeconds: 10

0.5 ​​5. 探针的最佳实践​

  1. ​合理设置 initialDelaySeconds​:
    • 避免应用还未启动完成就被探测(如 Java 应用可能需要几十秒初始化)。
  2. ​区分 Liveness 和 Readiness 探针​​:
    • Liveness 探针应简单快速(如检查端口是否存活)。
    • Readiness 探针可以更严格(如检查数据库连接是否正常)。
  3. ​避免过于频繁的探测​​:
    • periodSeconds 不宜过小(默认 10 秒是合理值),否则会增加系统负载。
  4. ​启动探针用于长启动应用​​:
    • 如 Java 应用、大数据服务(避免 Liveness Probe 因启动慢误判容器死亡)。

0.6 ​​6. 探针与 Pod 生命周期的关系​

  • ​Pod 状态流转​​:

    Pending → (容器启动) → Running → (Liveness Probe 失败) → Restarting
                            ↓
                     (Readiness Probe 失败) → 从 Service Endpoints 移除
    
  • ​关键行为​​:

    • Liveness Probe 失败 → ​​重启容器​​(kubectl get pods 会显示 Restart Count 增加)。
    • Readiness Probe 失败 → ​​流量被移除​​(Pod 仍在运行,但不再接收请求)。

0.7 ​​总结​

探针类型 作用 触发行为
​Liveness Probe​ 检查容器是否存活 失败时重启容器
​Readiness Probe​ 检查容器是否就绪 失败时从 Service 移除流量
​Startup Probe​ 检查容器是否启动完成 失败时不断重试(不触发其他探针)

通过合理配置探针,可以显著提高 Kubernetes 集群的稳定性和可靠性! 🚀

上一篇
下一篇