找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

540

积分

0

好友

73

主题
发表于 2025-11-28 03:19:36 | 查看: 11| 回复: 0

Kubernetes 生产环境中,容器生命周期管理与探针机制是保障服务稳定性和可观测性的核心能力。本文将深入解析以下关键点:

  • 容器生命周期 Hook:PostStart、PreStop
  • 三类核心探针:Liveness、Readiness、Startup
  • 探针的三种检查方式与示例
  • 探针失败会触发什么?
  • 生产级滚动升级与优雅终止(最容易出问题的部分)

一、K8s 容器生命周期 Hook

Kubernetes 为容器提供两个生命周期事件(Hook):

1、PostStart

  • 在容器启动后立即执行
  • 适用于“容器内部初始化逻辑”,如:创建目录、加载依赖、注册服务信息

2、PreStop

  • 在容器终止前执行
  • 用于实现“优雅终止”,如:关闭端口、清理连接、等待存量请求完成

注意:两个 Hook 都不保证一定能成功执行完毕,因此关键逻辑仍建议结合探针。

二、三大探针是什么?分别做什么?

三类探针(Probe)是容器健康检查的基础:

图片

一句话总结:

  • Liveness:死了就重启
  • Readiness:没准备好就不要接流量
  • Startup:启动没完成别急着探活

三、探针的三种检查方式

Kubernetes 提供三种探测方式:

Exec — 通过执行命令检查

用于容器内部文件/状态检查。

livenessProbe:
  exec:
    command: ["test", "-f", "/tmp/healthy"]
  initialDelaySeconds: 5
  periodSeconds: 10

HTTP/HTTPS — 最常用方式(API/Web 服务)

readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 2
  periodSeconds: 5

TCP — 检查端口连通性(DB、MQ 等)

startupProbe:
  tcpSocket:
    port: 6379
  initialDelaySeconds: 3
  periodSeconds: 5
  failureThreshold: 30

四、探针失败会发生什么?

LivenessProbe 失败 → 立即重启容器

适用于判断容器是否死锁、挂住。

ReadinessProbe 失败 → 从负载均衡摘除

不会重启,只是停止接收新请求,适合:

  • 冷启动
  • 后台任务执行
  • 短期不可用

StartupProbe 失败 → 容器启动失败(重启)

  • 用于慢启动应用(例如 Java 大应用)
  • 启动探针成功前,存活探针(livenessProbe)和就绪探针(readinessProbe)会被暂停执行;
  • 只有启动探针检测通过,存活 / 就绪探针才会开始周期性检测;

五、生产级 Pod 滚动升级:如何做到无损?

滚动升级最容易导致用户请求失败,其根本原因往往是:

  • 新 Pod 未 ready 就接到流量
  • 旧 Pod 被强制杀死,存量请求未处理完
  • readiness 与 PreStop 配置不合理

下面给出完整的生产级配置与终止流程。

六、Pod 优雅终止(Graceful Shutdown)——生产最关键的一环

Kubernetes 在终止 Pod 时遵循严格流程:

Pod 优雅终止真实顺序

  1. Pod 被标记为 Terminating
  2. 执行 PreStop Hook(必须执行完才继续)
  3. PreStop 内关闭端口 → Readiness Probe 失败
  4. Pod 被自动从 Endpoint 中摘除(不会再接收新请求)
  5. 等待存量请求(in-flight requests)自然完成
  6. Kubernetes 发送 SIGTERM 给容器
  7. 若超过 terminationGracePeriodSeconds 未退出 → SIGKILL 强杀

默认 terminationGracePeriodSeconds 为 30 秒,很多业务不够,可按业务调整:

# 总优雅时长设为 300 秒(5 分钟,可按业务调整)
terminationGracePeriodSeconds: 300

如果不设置足够长时间,Pod 还没处理完业务就被 SIGKILL 强制杀死,会导致请求失败、任务中断。

PreStop 优雅退出示例

# PreStop:让探针失败 → 摘除 Endpoint → 等待存量请求 → 再退出
lifecycle:
  preStop:
    exec:
      command:
        - /bin/sh
        - -c
        - |
          echo "[PreStop] Start graceful shutdown..."
          # 1. 主动关闭服务端口,使 Readiness 失败
          curl -XPOST http://127.0.0.1:8080/close-port || true
          echo "[PreStop] Port closed. Waiting readiness probe..."
          # 2. 等待 Readiness Probe 检测周期(例如 5 秒)
          sleep 10
          echo "[PreStop] Pod removed from endpoints. Processing in-flight requests..."
          # 3. 等待存量请求继续处理
          sleep 10
          echo "[PreStop] Graceful shutdown completed."

七、滚动升级实践(避免流量中断)

  1. ReadinessProbe 必须配置 → 新版本容器准备好前不接收流量
  2. PreStop 必须有 → 旧 Pod 停止前先退出服务
  3. RollingUpdate 策略优化
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 0   # 不减少实例
    maxSurge: 1         # 允许额外创建 1 个

以上可确保:

  • 新 Pod 能跑稳后才参与服务
  • 旧 Pod 完成存量请求再退出
  • 不中断业务,无流量丢失

总结:生命周期 + 探针 + 优雅终止 = 生产级稳定的核心能力

  • PostStart / PreStop 控制容器生命周期
  • 三类探针决定存活、可服务、启动完成状态
  • 探针失败动作明确可控
  • PreStop + Readiness → 实现真正优雅终止
  • 滚动升级可做到完全无感



上一篇:渗透测试实战:证书站Druid未授权与Swagger UI信息泄露漏洞分析
下一篇:M85内核单片机深度解析:高性能MCU实战应用与厂商产品对比
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-9 01:27 , Processed in 0.076891 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表