飧沾 发表于 2025-6-21 20:04:48

为什么 `kubectl patch` 关闭探针不重启 Pod,重新开启却重启?

揭秘 Kubernetes 探针机制与 Pod 不可变性的博弈
在 Kubernetes 运维中,一个常见现象引发困惑:关闭探针(如 LivenessProbe)时 Pod 不会重启,但重新启用后却触发重启。这看似矛盾的行为,实则是 Kubernetes Pod 不可变性原则与有限原地修改能力共同作用的结果。本文将从原理层拆解其逻辑,并关联 Kubernetes 的原地升级特性。
一、Pod 的不可变性:一切行为的基石

Kubernetes 严格遵循 “Pod 运行时实例不可变” 原则:

[*]核心限制:

[*]Pod 创建后,绝大多数字段(如容器名称、镜像、端口、卷挂载)不可直接修改。
[*]唯一允许原地修改的字段仅有:

[*]spec.containers
[*].image(容器镜像)
[*]spec.initContainers
[*].image(初始化容器镜像)
[*]spec.activeDeadlineSeconds(任务超时时间)
[*]spec.tolerations(污点容忍度,仅允许追加)。


[*]设计目的:

[*]确保状态一致性:避免运行时修改导致不可预测行为。
[*]简化调度逻辑:重建 Pod 可触发完整的调度、网络分配、存储挂载流程。

✅ 关键结论:
探针字段(如 livenessProbe)不属于允许原地修改的字段列表。但为何 kubectl patch 能修改它?
答案在于:kubectl patch 本质是向 API Server 提交合并请求,而 API Server 对探针字段的更新校验较为宽松(仅校验格式,不禁止更新)。
二、探针的关闭为何不重启?无事件+无状态变更

当执行 kubectl patch 移除探针时:
kubectl patch pod/myapp --type='json' -p='[{"op":"remove", "path":"/spec/containers/0/livenessProbe"}]'底层逻辑:

[*]无状态变化:

[*]探针被删除后,kubelet 停止对该容器的健康检查,但容器进程未被干预。

[*]无失败事件:

[*]Kubernetes 仅在探针连续失败达到阈值时触发重启。探针消失后,无失败信号上报。

[*]符合不可变性延伸原则:

[*]此操作未触及容器运行实例(如镜像、资源),属于“无害更新”,kubelet 无需重建容器。

<blockquote>

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

讣丢 发表于 2025-10-31 04:52:51

yyds。多谢分享

氛疵 发表于 2025-12-14 08:09:04

收藏一下   不知道什么时候能用到

龙玮奇 发表于 2025-12-24 10:05:41

感谢发布原创作品,程序园因你更精彩

酒跚骼 发表于 2025-12-27 20:50:08

前排留名,哈哈哈

翁真如 发表于 2026-1-16 20:10:32

鼓励转贴优秀软件安全工具和文档!

阕阵闲 发表于 2026-1-18 03:49:19

热心回复!

鞍注塔 发表于 2026-1-20 15:19:48

感谢,下载保存了

殳世英 发表于 2026-1-21 00:40:12

这个有用。

夔新梅 发表于 2026-1-21 11:56:54

用心讨论,共获提升!

荏牌 发表于 2026-1-22 13:41:39

感谢,下载保存了

水苯 发表于 2026-1-23 06:09:35

谢谢分享,辛苦了

司寇涵涵 发表于 2026-1-23 07:04:04

感谢分享

巫雪艷 发表于 2026-1-24 04:33:32

谢谢楼主提供!

姥恫 发表于 2026-1-28 05:45:24

谢谢分享,试用一下

荡俊屯 发表于 2026-1-31 13:00:52

用心讨论,共获提升!

习和璧 发表于 2026-2-6 10:03:24

感谢分享

翁真如 发表于 2026-2-8 13:01:26

谢谢楼主提供!

注思 发表于 2026-2-8 14:15:27

感谢,下载保存了

秦晓曼 发表于 2026-2-9 02:08:30

收藏一下   不知道什么时候能用到
页: [1] 2
查看完整版本: 为什么 `kubectl patch` 关闭探针不重启 Pod,重新开启却重启?