<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubernetes on 吾爱主机</title><link>https://blog.waihost.com/categories/kubernetes/</link><description>Recent content in Kubernetes on 吾爱主机</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 19 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.waihost.com/categories/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubernetes 探针机制：Liveness / Readiness / Startup 原理与工程实践</title><link>https://blog.waihost.com/posts/kubernetes-probes-liveness-readiness-startup/</link><pubDate>Sun, 19 Jul 2026 00:00:00 +0800</pubDate><guid>https://blog.waihost.com/posts/kubernetes-probes-liveness-readiness-startup/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/kubernetes-probes-liveness-readiness-startup.svg" alt="Featured image of post Kubernetes 探针机制：Liveness / Readiness / Startup 原理与工程实践" /&gt;&lt;p&gt;上线后 Pod 进程还在、端口也开着，但线程死锁、缓存预热未完成、依赖库未就绪——这类“半死不活”状态，单靠进程退出码抓不住。Kubernetes 用 &lt;strong&gt;探针（Probe）&lt;/strong&gt; 让 kubelet 周期性诊断容器，并据此决定：&lt;strong&gt;是否重启&lt;/strong&gt;、&lt;strong&gt;是否继续接流量&lt;/strong&gt;、&lt;strong&gt;是否允许启动阶段慢慢就绪&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文基于 Kubernetes 官方概念文档 &lt;em&gt;Liveness, Readiness, and Startup Probes&lt;/em&gt;、任务文档 &lt;em&gt;Configure Liveness, Readiness and Startup Probes&lt;/em&gt; 与 &lt;em&gt;Pod Lifecycle&lt;/em&gt;，把三类探针的职责边界、四种检查机制、默认参数、典型 YAML 与线上排错清单讲清楚，方便直接落地到业务 Deployment。&lt;/p&gt;
&lt;h2 id="一问题背景进程存活--服务可用"&gt;&lt;a href="#%e4%b8%80%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af%e8%bf%9b%e7%a8%8b%e5%ad%98%e6%b4%bb--%e6%9c%8d%e5%8a%a1%e5%8f%af%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;一、问题背景：进程存活 ≠ 服务可用
&lt;/h2&gt;&lt;p&gt;常见误区：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;只看 &lt;code&gt;Running&lt;/code&gt;&lt;/strong&gt;：容器主进程没挂，业务已卡死在死锁或无限重试里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把启动慢当成故障&lt;/strong&gt;：JVM 冷启动、大配置加载、数据预热需要数分钟，却用过激 liveness 把容器反复杀掉，进入 &lt;code&gt;CrashLoopBackOff&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;就绪与存活混用&lt;/strong&gt;：依赖短暂不可用时杀进程，反而放大级联故障。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;官方定位很清晰：探针是 kubelet 对容器做的&lt;strong&gt;周期性诊断&lt;/strong&gt;；根据结果，Kubernetes 可以&lt;strong&gt;重启不健康容器&lt;/strong&gt;，或&lt;strong&gt;停止向未就绪容器发送流量&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="二三类探针职责完全不同"&gt;&lt;a href="#%e4%ba%8c%e4%b8%89%e7%b1%bb%e6%8e%a2%e9%92%88%e8%81%8c%e8%b4%a3%e5%ae%8c%e5%85%a8%e4%b8%8d%e5%90%8c" class="header-anchor"&gt;&lt;/a&gt;二、三类探针：职责完全不同
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;探针&lt;/th&gt;
					&lt;th&gt;回答的问题&lt;/th&gt;
					&lt;th&gt;失败后果（概要）&lt;/th&gt;
					&lt;th&gt;生命周期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Startup&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;应用&lt;strong&gt;是否已经完成启动&lt;/strong&gt;？&lt;/td&gt;
					&lt;td&gt;kubelet &lt;strong&gt;杀死容器&lt;/strong&gt;，按 Pod &lt;code&gt;restartPolicy&lt;/code&gt; 处理&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;仅启动阶段&lt;/strong&gt;；成功后不再执行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Liveness&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;容器是否仍&lt;strong&gt;活着、值得保留&lt;/strong&gt;？&lt;/td&gt;
					&lt;td&gt;连续失败超过阈值后 &lt;strong&gt;重启该容器&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;启动探针成功后（或无 startup 时）&lt;strong&gt;周期执行&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Readiness&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;容器是否&lt;strong&gt;可以接流量&lt;/strong&gt;？&lt;/td&gt;
					&lt;td&gt;从匹配 Service 的 &lt;strong&gt;EndpointSlice 中摘掉 Pod IP&lt;/strong&gt;；&lt;strong&gt;不重启&lt;/strong&gt;容器&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;整个生命周期&lt;/strong&gt;周期执行&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="1-startup给慢启动留窗口"&gt;&lt;a href="#1-startup%e7%bb%99%e6%85%a2%e5%90%af%e5%8a%a8%e7%95%99%e7%aa%97%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;1. Startup：给慢启动留窗口
&lt;/h3&gt;&lt;p&gt;配置了 &lt;code&gt;startupProbe&lt;/code&gt; 后，&lt;strong&gt;在它成功之前，不会执行 liveness / readiness&lt;/strong&gt;，避免启动期误杀。&lt;/p&gt;
&lt;p&gt;适合：首次初始化很慢、但稳态后希望 liveness &lt;strong&gt;快速&lt;/strong&gt;发现死锁的应用。官方建议：用与 liveness &lt;strong&gt;相同的检查&lt;/strong&gt;，但把 &lt;code&gt;failureThreshold * periodSeconds&lt;/code&gt; 拉长到覆盖最坏启动时间。示例（30 × 10s = 300s）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;startupProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/healthz&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;livenessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/healthz&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动探针一旦成功一次，liveness 接管；若 300s 内始终失败，容器被杀死并受 &lt;code&gt;restartPolicy&lt;/code&gt; 约束。&lt;/p&gt;
&lt;h3 id="2-liveness死锁与不可恢复故障的硬重启"&gt;&lt;a href="#2-liveness%e6%ad%bb%e9%94%81%e4%b8%8e%e4%b8%8d%e5%8f%af%e6%81%a2%e5%a4%8d%e6%95%85%e9%9a%9c%e7%9a%84%e7%a1%ac%e9%87%8d%e5%90%af" class="header-anchor"&gt;&lt;/a&gt;2. Liveness：死锁与不可恢复故障的“硬重启”
&lt;/h3&gt;&lt;p&gt;典型用途：进程还在，但&lt;strong&gt;无法推进业务&lt;/strong&gt;（死锁、事件循环卡死）。重启可能比挂着更可用。&lt;/p&gt;
&lt;p&gt;官方提醒：liveness &lt;strong&gt;必须&lt;/strong&gt;表示&lt;strong&gt;不可恢复&lt;/strong&gt;失败。配置过激会在高压时连环重启、请求失败、剩余 Pod 压力更大——&lt;strong&gt;级联故障&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;若进程自己会在异常时崩溃退出，不一定需要 liveness；kubelet 会按 &lt;code&gt;restartPolicy&lt;/code&gt; 处理退出。需要“探测失败就杀并重启”时，再配 liveness，且 &lt;code&gt;restartPolicy&lt;/code&gt; 一般为 &lt;code&gt;Always&lt;/code&gt; 或 &lt;code&gt;OnFailure&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="3-readiness接不接流量而不是杀不杀进程"&gt;&lt;a href="#3-readiness%e6%8e%a5%e4%b8%8d%e6%8e%a5%e6%b5%81%e9%87%8f%e8%80%8c%e4%b8%8d%e6%98%af%e6%9d%80%e4%b8%8d%e6%9d%80%e8%bf%9b%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;3. Readiness：接不接流量，而不是杀不杀进程
&lt;/h3&gt;&lt;p&gt;适用：加载大文件、预热缓存、建立连接、临时过载或依赖抖动——&lt;strong&gt;暂时不想接流量，但也不该被杀掉&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;失败时，控制器从所有匹配 Service 的 &lt;strong&gt;EndpointSlice&lt;/strong&gt; 中移除该 Pod IP，流量不再打到它。删除 Pod 做摘流时，EndpointSlice 条件也会更新，&lt;strong&gt;不一定非要&lt;/strong&gt; readiness 才能排空；readiness 更适合&lt;strong&gt;运行期&lt;/strong&gt;的“维护摘流 / 依赖未就绪摘流”。&lt;/p&gt;
&lt;p&gt;官方还提到一种模式：依赖后端时，&lt;strong&gt;liveness 只表示本进程健康&lt;/strong&gt;，&lt;strong&gt;readiness 额外检查后端是否可用&lt;/strong&gt;，避免把只能回错误的 Pod 继续挂在 Service 上。&lt;/p&gt;
&lt;h2 id="三四种检查机制"&gt;&lt;a href="#%e4%b8%89%e5%9b%9b%e7%a7%8d%e6%a3%80%e6%9f%a5%e6%9c%ba%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;三、四种检查机制
&lt;/h2&gt;&lt;p&gt;每个探针必须且只能配置一种机制：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;机制&lt;/th&gt;
					&lt;th&gt;成功条件&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;exec&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;容器内命令退出码 &lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;文件标志、本地 CLI 自检&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;httpGet&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;HTTP 状态码 &lt;strong&gt;≥ 200 且 &amp;lt; 400&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;业务 &lt;code&gt;/healthz&lt;/code&gt;、&lt;code&gt;/ready&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;tcpSocket&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;端口可建立 TCP 连接（对端立刻关闭也算健康）&lt;/td&gt;
					&lt;td&gt;只关心端口是否监听&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;grpc&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;gRPC Health Checking 返回 &lt;strong&gt;&lt;code&gt;SERVING&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;原生 gRPC 服务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP&lt;/strong&gt;：路径/端口/命名端口均可；v1.13 之后本地 HTTP 代理环境变量&lt;strong&gt;不影响&lt;/strong&gt; HTTP liveness。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP&lt;/strong&gt;：端口通了就算成功，&lt;strong&gt;不验证&lt;/strong&gt;应用协议是否正常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gRPC&lt;/strong&gt;：需实现官方 health 协议；探针打到 Pod IP/主机名；&lt;strong&gt;不支持&lt;/strong&gt;认证参数；gRPC &lt;strong&gt;不支持命名端口&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;exec 开销&lt;/strong&gt;：每次探测会创建/派生进程；高密度集群 + 短 &lt;code&gt;periodSeconds&lt;/code&gt; 会抬高节点 CPU，优先考虑 HTTP/TCP/gRPC。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四关键参数与默认值"&gt;&lt;a href="#%e5%9b%9b%e5%85%b3%e9%94%ae%e5%8f%82%e6%95%b0%e4%b8%8e%e9%bb%98%e8%ae%a4%e5%80%bc" class="header-anchor"&gt;&lt;/a&gt;四、关键参数与默认值
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;字段&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;默认（官方）&lt;/th&gt;
					&lt;th&gt;注意&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;initialDelaySeconds&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;容器启动后延迟多久开始探测&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;有 startup 时，liveness/readiness 的延迟从 &lt;strong&gt;startup 成功后&lt;/strong&gt;再算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;periodSeconds&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;探测间隔&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最小 1；未 Ready 时 readiness 可能&lt;strong&gt;更密&lt;/strong&gt;探测以尽快就绪&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;timeoutSeconds&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单次超时&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最小 1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;successThreshold&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;失败后需连续成功几次才算恢复&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;liveness/startup 必须为 1&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;failureThreshold&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;连续失败几次判定整体失败&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最小 1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;探针触发关闭时的宽限期&lt;/td&gt;
					&lt;td&gt;继承 Pod 级（未设则 &lt;strong&gt;30s&lt;/strong&gt;）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;≥1.25&lt;/strong&gt; 可在 &lt;strong&gt;liveness/startup&lt;/strong&gt; 上覆盖；&lt;strong&gt;不能&lt;/strong&gt;设在 readiness&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;失败后的行为差异：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;startup / liveness&lt;/strong&gt;：达到 &lt;code&gt;failureThreshold&lt;/code&gt; → 视为不健康 → &lt;strong&gt;重启该容器&lt;/strong&gt;；kubelet 会尊重（探针级或 Pod 级）&lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;readiness&lt;/strong&gt;：失败 → 容器继续跑、探针继续做，但 Pod 的 &lt;strong&gt;Ready 条件为 false&lt;/strong&gt;，从 Service 摘流。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;未配置某类探针时，kubelet 对该类结果视为 &lt;strong&gt;Success&lt;/strong&gt;；对 readiness，&lt;strong&gt;初始延迟结束前&lt;/strong&gt;结果按 &lt;strong&gt;Failure&lt;/strong&gt; 处理（避免过早接流）。&lt;/p&gt;
&lt;h2 id="五可落地的组合配置"&gt;&lt;a href="#%e4%ba%94%e5%8f%af%e8%90%bd%e5%9c%b0%e7%9a%84%e7%bb%84%e5%90%88%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;五、可落地的组合配置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;probe-example&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;terminationGracePeriodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;registry.k8s.io/e2e-test-images/agnhost:2.40&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;startupProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/healthz&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;livenessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/healthz&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeoutSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;readinessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/ready&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;工程约定建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/healthz&lt;/code&gt;（liveness）&lt;/strong&gt;：只查本进程/关键本地资源，&lt;strong&gt;不要&lt;/strong&gt;把下游超时算作“该死”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/ready&lt;/code&gt;（readiness）&lt;/strong&gt;：可查依赖、连接池、预热是否完成；失败只摘流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;慢启动&lt;/strong&gt;：用 &lt;code&gt;startupProbe&lt;/code&gt; 拉长启动窗口，而不是把 liveness 的 &lt;code&gt;initialDelaySeconds&lt;/code&gt; 拉到数分钟还丢掉快速失败能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同路径不同阈值&lt;/strong&gt;：官方常见模式是 readiness 与 liveness 可共用低成本 HTTP 端点，但 liveness 使用&lt;strong&gt;更高&lt;/strong&gt; &lt;code&gt;failureThreshold&lt;/code&gt;，先摘流再硬杀。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;官方 exec 示例可快速验证“失败 → 重启”链路：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f https://k8s.io/examples/pods/probe/exec-liveness.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe pod liveness-exec
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 约 30s 后会出现 Liveness probe failed / Container ... will be restarted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pod liveness-exec &lt;span class="c1"&gt;# RESTARTS 递增&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTP / TCP / gRPC 示例清单同在官方 task 文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://k8s.io/examples/pods/probe/http-liveness.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://k8s.io/examples/pods/probe/grpc-liveness.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六常见坑与排查"&gt;&lt;a href="#%e5%85%ad%e5%b8%b8%e8%a7%81%e5%9d%91%e4%b8%8e%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;六、常见坑与排查
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;现象&lt;/th&gt;
					&lt;th&gt;可能原因&lt;/th&gt;
					&lt;th&gt;处理思路&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;启动即 &lt;code&gt;CrashLoopBackOff&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;liveness 在应用未就绪时过早失败&lt;/td&gt;
					&lt;td&gt;加 &lt;code&gt;startupProbe&lt;/code&gt; 或合理 &lt;code&gt;initialDelaySeconds&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;READY 长期 0/1&lt;/td&gt;
					&lt;td&gt;readiness 过严或依赖一直失败&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl describe&lt;/code&gt; 看 Unhealthy；区分依赖故障 vs 端点写错&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;高压时批量重启&lt;/td&gt;
					&lt;td&gt;liveness 把“忙/慢”当“死”&lt;/td&gt;
					&lt;td&gt;收紧 liveness 语义；用 readiness 摘流 + HPA/限流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;节点 CPU 被探针打高&lt;/td&gt;
					&lt;td&gt;大量 &lt;code&gt;exec&lt;/code&gt; + 短周期&lt;/td&gt;
					&lt;td&gt;改 HTTP/TCP/gRPC，增大 &lt;code&gt;periodSeconds&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;探针失败但业务浏览器可访问&lt;/td&gt;
					&lt;td&gt;探针打容器网络命名空间路径/端口与外部不一致&lt;/td&gt;
					&lt;td&gt;确认 &lt;code&gt;port&lt;/code&gt;/&lt;code&gt;host&lt;/code&gt;、命名端口、监听 &lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gRPC 探针总失败&lt;/td&gt;
					&lt;td&gt;未实现 health 协议或只监听 localhost&lt;/td&gt;
					&lt;td&gt;按官方 gRPC health 检查协议暴露，监听 Pod IP 可达地址&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;重启过猛、优雅退出不够&lt;/td&gt;
					&lt;td&gt;宽限期过短&lt;/td&gt;
					&lt;td&gt;Pod 级或 &lt;strong&gt;liveness 探针级&lt;/strong&gt; &lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt;（≥1.25）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;排错命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe pod &amp;lt;pod&amp;gt; &lt;span class="c1"&gt;# Events: Unhealthy / Killing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pod &amp;lt;pod&amp;gt; -o wide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs &amp;lt;pod&amp;gt; --previous &lt;span class="c1"&gt;# 被重启前的日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get endpointslices -l kubernetes.io/service-name&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;svc&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;describe&lt;/code&gt; 中典型事件类似：&lt;code&gt;Liveness probe failed: ...&lt;/code&gt;，随后 &lt;code&gt;Container ... failed liveness probe, will be restarted&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="七选型速查"&gt;&lt;a href="#%e4%b8%83%e9%80%89%e5%9e%8b%e9%80%9f%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;七、选型速查
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;推荐&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;进程自己会崩&lt;/td&gt;
					&lt;td&gt;可不配 liveness，依赖 &lt;code&gt;restartPolicy&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;可能死锁但不退出&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;liveness&lt;/strong&gt;（轻量、本地）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;启动慢（分钟级）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;startup&lt;/strong&gt; + 稳态 &lt;strong&gt;liveness&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;预热/依赖未齐不想接流量&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;readiness&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;维护窗口主动摘流&lt;/td&gt;
					&lt;td&gt;readiness 独立端点返回失败&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;仅端口监听即可&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;tcpSocket&lt;/code&gt;（认知其浅）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;标准 HTTP API&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;httpGet&lt;/code&gt; 200–399&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gRPC 微服务&lt;/td&gt;
					&lt;td&gt;实现 health 协议 + &lt;code&gt;grpc&lt;/code&gt; 探针&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="八总结"&gt;&lt;a href="#%e5%85%ab%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;八、总结
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Startup&lt;/strong&gt; 管“能不能开始正经跑”，失败会杀容器；成功前挡住 liveness/readiness。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Liveness&lt;/strong&gt; 管“还值不值得活着”，失败会重启——语义必须严格，防止级联重启。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness&lt;/strong&gt; 管“能不能接流量”，失败只摘 EndpointSlice，不重启。&lt;/li&gt;
&lt;li&gt;机制选 &lt;strong&gt;httpGet / tcpSocket / grpc / exec&lt;/strong&gt; 时，优先低开销网络探针；exec 要注意节点开销。&lt;/li&gt;
&lt;li&gt;调参抓住：&lt;code&gt;periodSeconds&lt;/code&gt;、&lt;code&gt;failureThreshold&lt;/code&gt;、&lt;code&gt;timeoutSeconds&lt;/code&gt; 与 startup 窗口 &lt;code&gt;failureThreshold × periodSeconds&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;把三类探针当成&lt;strong&gt;三个独立控制面&lt;/strong&gt;来设计端点与阈值，比“抄一段 YAML 三个探针同路径同阈值”更接近生产稳态。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Kubernetes 官方概念文档：&lt;a class="link" href="https://kubernetes.io/docs/concepts/workloads/pods/probes/" target="_blank" rel="noopener"
 &gt;Liveness, Readiness, and Startup Probes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 官方任务文档：&lt;a class="link" href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/" target="_blank" rel="noopener"
 &gt;Configure Liveness, Readiness and Startup Probes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 官方概念文档：&lt;a class="link" href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/" target="_blank" rel="noopener"
 &gt;Pod Lifecycle（Container probes）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes API 参考：&lt;a class="link" href="https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/" target="_blank" rel="noopener"
 &gt;Probe / Container（Pod v1）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gRPC Health Checking 协议：&lt;a class="link" href="https://github.com/grpc/grpc/blob/master/doc/health-checking.md" target="_blank" rel="noopener"
 &gt;grpc/grpc health-checking.md&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Kubernetes 1.36.2 补丁升级实战：DRA、CSI 与控制面稳定性检查清单</title><link>https://blog.waihost.com/posts/kubernetes-1-36-2-upgrade-checklist/</link><pubDate>Sat, 11 Jul 2026 09:03:43 +0800</pubDate><guid>https://blog.waihost.com/posts/kubernetes-1-36-2-upgrade-checklist/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/kubernetes-1-36-2-upgrade-checklist.svg" alt="Featured image of post Kubernetes 1.36.2 补丁升级实战：DRA、CSI 与控制面稳定性检查清单" /&gt;&lt;p&gt;Kubernetes 1.36.2 是 1.36 分支的补丁版本，官方 GitHub Release 发布于 2026-06-12。它不是一个“炫技型”的大版本，而是非常适合平台团队纳入日常升级窗口的稳定性修复版本：其中包含 Dynamic Resource Allocation（DRA）调度路径、CSI 卷重新发布、Endpoint Controller、Secret 环境变量处理以及 kubeadm 证书 dry-run 等多个容易在生产环境放大的边界问题。&lt;/p&gt;
&lt;p&gt;本文基于 Kubernetes 官方 Release、1.36 分支 CHANGELOG 与官方版本支持说明整理，面向正在运行 1.36.x、准备从 1.35/1.34 规划升级，或正在试点 GPU、DPU、RDMA 等设备资源编排能力的团队，给出一份可执行的升级与验证清单。&lt;/p&gt;
&lt;h2 id="为什么这个补丁版本值得关注"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%99%e4%b8%aa%e8%a1%a5%e4%b8%81%e7%89%88%e6%9c%ac%e5%80%bc%e5%be%97%e5%85%b3%e6%b3%a8" class="header-anchor"&gt;&lt;/a&gt;为什么这个补丁版本值得关注
&lt;/h2&gt;&lt;p&gt;Kubernetes 补丁版本通常不会引入破坏性 API 变化，但它会修复控制面和节点侧的真实缺陷。1.36.2 的重点可以概括为三类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;调度正确性&lt;/strong&gt;：DRA 相关修复覆盖设备分区、共享计数器、多 allocatable 设备以及 ResourceClaim &lt;code&gt;allocationMode: All&lt;/code&gt; 等场景。对于使用新资源模型管理 GPU、加速卡或其他专用设备的集群，这类问题可能导致 Pod 错误分配、长时间 Pending，甚至设备冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储与节点稳定性&lt;/strong&gt;：kubelet 在 CSI &lt;code&gt;requiresRepublish=true&lt;/code&gt; 周期性 &lt;code&gt;NodePublishVolume&lt;/code&gt; 失败时，曾可能删除挂载目录并让 Pod 继续看到陈旧卷内容。该类问题不一定马上表现为 CrashLoop，却可能带来数据一致性和排障难度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制面兼容性&lt;/strong&gt;：Endpoint Controller 处理早期未更新过 &lt;code&gt;ipFamilies&lt;/code&gt; 字段的 Service 时可能 panic；另外还修复了 Secret 二进制非 UTF-8 数据作为环境变量来源时的回归问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与此同时，官方发布说明显示 Kubernetes 1.36.2 构建使用 Go 1.26.4。对自建发行包、二次编译或维护私有镜像仓库的团队来说，这意味着需要同步确认构建链、制品校验与 SBOM 记录。&lt;/p&gt;
&lt;h2 id="核心修复解读"&gt;&lt;a href="#%e6%a0%b8%e5%bf%83%e4%bf%ae%e5%a4%8d%e8%a7%a3%e8%af%bb" class="header-anchor"&gt;&lt;/a&gt;核心修复解读
&lt;/h2&gt;&lt;h3 id="1-dra-调度从能调度到调度正确"&gt;&lt;a href="#1-dra-%e8%b0%83%e5%ba%a6%e4%bb%8e%e8%83%bd%e8%b0%83%e5%ba%a6%e5%88%b0%e8%b0%83%e5%ba%a6%e6%ad%a3%e7%a1%ae" class="header-anchor"&gt;&lt;/a&gt;1. DRA 调度：从“能调度”到“调度正确”
&lt;/h3&gt;&lt;p&gt;Dynamic Resource Allocation 是 Kubernetes 近几个版本持续增强的资源建模能力，用于表达比传统 CPU/Memory 更复杂的设备资源。1.36.2 中有多项 DRA 修复：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修复在 &lt;code&gt;SharedCounters&lt;/code&gt; 与多 allocatable 设备组合下，调度器可能把互斥设备分区分配给多个 Pod 的问题。&lt;/li&gt;
&lt;li&gt;修复同时使用多节点 claim 与 per-node claim 的 Pod 可能卡在 Pending 的问题。&lt;/li&gt;
&lt;li&gt;修复 ResourceClaim 使用 &lt;code&gt;allocationMode: All&lt;/code&gt; 且选择消耗 shared counters 的设备时，kube-scheduler 可能 panic 的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的集群还没有启用 DRA，这些修复可能暂时没有直接影响；但如果你在做 AI 训练、推理平台、边缘设备管理或高性能网络设备调度，建议把 1.36.2 视为 1.36 分支的最低生产基线之一。&lt;/p&gt;
&lt;h3 id="2-csi-republish不要忽略陈旧卷内容"&gt;&lt;a href="#2-csi-republish%e4%b8%8d%e8%a6%81%e5%bf%bd%e7%95%a5%e9%99%88%e6%97%a7%e5%8d%b7%e5%86%85%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;2. CSI republish：不要忽略“陈旧卷内容”
&lt;/h3&gt;&lt;p&gt;CHANGELOG 提到，kubelet 在处理 &lt;code&gt;CSIDriver.spec.requiresRepublish=true&lt;/code&gt; 的周期性 &lt;code&gt;NodePublishVolume&lt;/code&gt; 调用时，如果 republish 返回错误，曾可能删除 CSI mount directory，导致 Pod 继续持有陈旧卷内容，后续成功 republish 也无法自动修复。&lt;/p&gt;
&lt;p&gt;这类问题的危险之处在于：应用容器未必马上退出，监控也未必能通过简单的 Pod 状态发现异常。对依赖 CSI 动态刷新凭据、配置或挂载状态的系统来说，升级后应该重点观察：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get csidriver -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{range .items[*]}{.metadata.name}{&amp;#34;\t&amp;#34;}{.spec.requiresRepublish}{&amp;#34;\n&amp;#34;}{end}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events -A --field-selector involvedObject.kind&lt;span class="o"&gt;=&lt;/span&gt;Pod &lt;span class="p"&gt;|&lt;/span&gt; grep -i &lt;span class="s1"&gt;&amp;#39;NodePublishVolume\|MountVolume&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果存在 &lt;code&gt;requiresRepublish=true&lt;/code&gt; 的驱动，建议在灰度节点上执行挂载异常注入或至少复盘历史 kubelet 日志，确认升级前是否出现过 republish 失败后应用读到旧数据的迹象。&lt;/p&gt;
&lt;h3 id="3-endpoint-controller-与旧-service-兼容性"&gt;&lt;a href="#3-endpoint-controller-%e4%b8%8e%e6%97%a7-service-%e5%85%bc%e5%ae%b9%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;3. Endpoint Controller 与旧 Service 兼容性
&lt;/h3&gt;&lt;p&gt;1.36.2 修复了 Endpoint Controller 在处理 &lt;code&gt;ipFamilies&lt;/code&gt; 为空的 Service 时可能 panic 的问题。官方说明将其描述为 pre-dual-stack services that were never spec-updated，也就是双栈能力引入前创建、之后长期未触碰规格字段的老 Service。&lt;/p&gt;
&lt;p&gt;这对老集群很重要：很多生产集群中存在“创建多年但业务仍在使用”的 Service。升级前可以先做一次巡检：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get svc -A -o json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; .items[] | select((.spec.ipFamilies // []) | length == 0) |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; [.metadata.namespace, .metadata.name, .spec.clusterIP] | @tsv&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果发现命中项，先在测试环境复现或通过无害字段更新触发默认值补齐，再安排控制面升级，会比升级窗口里临时定位 controller panic 更稳妥。&lt;/p&gt;
&lt;h3 id="4-secret-二进制环境变量回归"&gt;&lt;a href="#4-secret-%e4%ba%8c%e8%bf%9b%e5%88%b6%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e5%9b%9e%e5%bd%92" class="header-anchor"&gt;&lt;/a&gt;4. Secret 二进制环境变量回归
&lt;/h3&gt;&lt;p&gt;官方 CHANGELOG 还提到修复了 1.34+ 中一个回归：容器环境变量值来自 Secret API 对象且包含 binary non-UTF8 data 时的处理问题。虽然“二进制 Secret 直接进环境变量”不是推荐实践，但历史系统、第三方 Chart 或迁移遗留配置中并不少见。&lt;/p&gt;
&lt;p&gt;建议升级前用以下思路排查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get deploy,statefulset,daemonset -A -o yaml &lt;span class="p"&gt;|&lt;/span&gt; grep -n &lt;span class="s2"&gt;&amp;#34;secretKeyRef&amp;#34;&lt;/span&gt; -C &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对命中的工作负载，优先确认 Secret 内容是否应改为文件挂载、是否存在非 UTF-8 值，以及应用侧是否真的需要以环境变量方式读取。升级补丁可以修复回归，但配置治理仍应同步推进。&lt;/p&gt;
&lt;h2 id="升级前检查清单"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e5%89%8d%e6%a3%80%e6%9f%a5%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;升级前检查清单
&lt;/h2&gt;&lt;h3 id="确认版本与支持窗口"&gt;&lt;a href="#%e7%a1%ae%e8%ae%a4%e7%89%88%e6%9c%ac%e4%b8%8e%e6%94%af%e6%8c%81%e7%aa%97%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;确认版本与支持窗口
&lt;/h3&gt;&lt;p&gt;Kubernetes 官方 Releases 页面说明，项目维护最近三个 minor release 分支；当前页面描述为 1.36、1.35、1.34。Kubernetes 1.19 及之后版本大约提供 1 年补丁支持。因此，1.36.2 对 1.36 用户是常规补丁升级，对更老分支则应结合版本偏斜策略规划跨 minor 升级。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl version --short
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes -o wide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get --raw /version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果控制面、kubelet、kubectl 或外部组件版本跨度较大，先阅读官方 version skew policy，再决定是否直接升级到 1.36.x。&lt;/p&gt;
&lt;h3 id="备份-etcd-与关键配置"&gt;&lt;a href="#%e5%a4%87%e4%bb%bd-etcd-%e4%b8%8e%e5%85%b3%e9%94%ae%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;备份 etcd 与关键配置
&lt;/h3&gt;&lt;p&gt;补丁升级也要按生产变更对待，至少完成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl snapshot save /backup/etcd-&lt;span class="k"&gt;$(&lt;/span&gt;date +%F-%H%M&lt;span class="k"&gt;)&lt;/span&gt;.db &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --endpoints&lt;span class="o"&gt;=&lt;/span&gt;https://127.0.0.1:2379 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cacert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/ca.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --key&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get all,cm,secret,ingress,pvc -A -o yaml &amp;gt; /backup/k8s-resources-&lt;span class="k"&gt;$(&lt;/span&gt;date +%F&lt;span class="k"&gt;)&lt;/span&gt;.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;托管 Kubernetes 也应在云厂商控制台确认升级回滚策略、节点池灰度能力与控制面维护窗口。&lt;/p&gt;
&lt;h3 id="先升级测试集群或单个节点池"&gt;&lt;a href="#%e5%85%88%e5%8d%87%e7%ba%a7%e6%b5%8b%e8%af%95%e9%9b%86%e7%be%a4%e6%88%96%e5%8d%95%e4%b8%aa%e8%8a%82%e7%82%b9%e6%b1%a0" class="header-anchor"&gt;&lt;/a&gt;先升级测试集群或单个节点池
&lt;/h3&gt;&lt;p&gt;推荐顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在测试集群升级控制面到 1.36.2。&lt;/li&gt;
&lt;li&gt;升级一组低风险节点池。&lt;/li&gt;
&lt;li&gt;验证 DRA、CSI、Service、Job、Secret 相关用例。&lt;/li&gt;
&lt;li&gt;扩大到生产控制面与生产节点池。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对 kubeadm 集群，还应关注 1.36.2 修复的 &lt;code&gt;kubeadm init phase certs --dry-run&lt;/code&gt; 复制现有 CA 文件问题。如果你的自动化流程依赖 dry-run 生成或校验证书，应在升级后重新跑一遍流水线。&lt;/p&gt;
&lt;h2 id="升级后验证清单"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e5%90%8e%e9%aa%8c%e8%af%81%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;升级后验证清单
&lt;/h2&gt;&lt;p&gt;升级完成后，不要只看 &lt;code&gt;kubectl get nodes&lt;/code&gt;。建议至少执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get componentstatuses 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get --raw&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/readyz?verbose&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -A --field-selector&lt;span class="o"&gt;=&lt;/span&gt;status.phase!&lt;span class="o"&gt;=&lt;/span&gt;Running,status.phase!&lt;span class="o"&gt;=&lt;/span&gt;Succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events -A --sort-by&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp &lt;span class="p"&gt;|&lt;/span&gt; tail -n &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl -n kube-system logs -l &lt;span class="nv"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kube-scheduler --tail&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重点观察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kube-scheduler 是否仍出现 DRA ResourceClaim 相关 panic 或调度失败。&lt;/li&gt;
&lt;li&gt;CSI 插件与 kubelet 日志中是否还有 &lt;code&gt;NodePublishVolume&lt;/code&gt; 反复失败。&lt;/li&gt;
&lt;li&gt;老 Service 是否触发 Endpoint/EndpointSlice 控制器异常。&lt;/li&gt;
&lt;li&gt;使用 Secret 环境变量的 Pod 是否能正常启动。&lt;/li&gt;
&lt;li&gt;suspended Job 修改 &lt;code&gt;nodeSelector&lt;/code&gt;、tolerations、node affinity 等 scheduling directives 是否符合预期。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="实践建议"&gt;&lt;a href="#%e5%ae%9e%e8%b7%b5%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;实践建议
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;未使用 DRA 的普通集群&lt;/strong&gt;：可以按常规补丁窗口升级，但仍需完成 etcd 备份、控制面健康检查与节点池灰度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 DRA 或设备插件的集群&lt;/strong&gt;：建议优先升级测试环境，并围绕 ResourceClaim、共享计数器、多 allocatable 设备构造回归用例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSI 驱动复杂的集群&lt;/strong&gt;：重点确认 &lt;code&gt;requiresRepublish=true&lt;/code&gt; 驱动，升级后观察挂载内容刷新是否正常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史包袱较重的老集群&lt;/strong&gt;：先巡检空 &lt;code&gt;ipFamilies&lt;/code&gt; Service、Secret 环境变量与长期未更新的 workload spec，避免把老问题带进升级窗口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;Kubernetes 1.36.2 的价值不在于新功能数量，而在于把 1.36 分支中几个高风险边界问题向前修掉：DRA 调度正确性、CSI republish 行为、Endpoint Controller 兼容性、Secret 二进制数据回归以及 kubeadm dry-run 证书流程。对于平台团队来说，最稳妥的做法是把它纳入一次小而完整的补丁升级：先备份，再灰度，最后用针对性清单验证关键路径。&lt;/p&gt;
&lt;p&gt;如果你的集群已经在 1.36.x，建议优先评估 1.36.2；如果仍在 1.35/1.34，则应结合官方版本支持与版本偏斜策略制定 minor 升级计划，而不是只追补丁号。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Kubernetes GitHub Release：&lt;a class="link" href="https://github.com/kubernetes/kubernetes/releases/tag/v1.36.2" target="_blank" rel="noopener"
 &gt;https://github.com/kubernetes/kubernetes/releases/tag/v1.36.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 1.36 CHANGELOG：&lt;a class="link" href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md" target="_blank" rel="noopener"
 &gt;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 官方 Releases 与支持分支说明：&lt;a class="link" href="https://kubernetes.io/releases/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/releases/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Headlamp Cluster API 插件发布：把多集群生命周期管理搬进 Kubernetes UI</title><link>https://blog.waihost.com/posts/headlamp-cluster-api-plugin-guide/</link><pubDate>Tue, 07 Jul 2026 09:06:20 +0800</pubDate><guid>https://blog.waihost.com/posts/headlamp-cluster-api-plugin-guide/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/headlamp-cluster-api-plugin-guide.svg" alt="Featured image of post Headlamp Cluster API 插件发布：把多集群生命周期管理搬进 Kubernetes UI" /&gt;&lt;p&gt;6 月下旬 Kubernetes 官方博客介绍了 &lt;strong&gt;Headlamp Cluster API 插件&lt;/strong&gt;：它把 Cluster API（CAPI）的集群、机器、控制平面和拓扑关系搬到 Headlamp 的图形界面里。对平台工程团队来说，这不是“再做一个 Kubernetes Dashboard”，而是把原本需要在多个 &lt;code&gt;kubectl&lt;/code&gt; 命令、YAML、OwnerReference 和 Condition 之间来回切换的多集群排障流程，整理成更接近日常运维视角的可视化工作台。&lt;/p&gt;
&lt;p&gt;本文基于 Kubernetes 官方博客、Cluster API 官方文档、Headlamp 插件文档以及插件仓库 README 做多源核验，整理它解决的问题、核心能力、落地前的检查项，以及团队应该如何把它纳入现有的多集群运维流程。&lt;/p&gt;
&lt;h2 id="背景cluster-api-强在声明式弱在人工排障体验"&gt;&lt;a href="#%e8%83%8c%e6%99%afcluster-api-%e5%bc%ba%e5%9c%a8%e5%a3%b0%e6%98%8e%e5%bc%8f%e5%bc%b1%e5%9c%a8%e4%ba%ba%e5%b7%a5%e6%8e%92%e9%9a%9c%e4%bd%93%e9%aa%8c" class="header-anchor"&gt;&lt;/a&gt;背景：Cluster API 强在声明式，弱在人工排障体验
&lt;/h2&gt;&lt;p&gt;Cluster API 是 Kubernetes SIG Cluster Lifecycle 下的项目，目标是用 Kubernetes 风格的 API 和控制器来管理 Kubernetes 集群生命周期。简单说，平台团队可以把“创建集群、升级控制面、扩缩容节点、替换机器模板”等动作表达成 Kubernetes 资源，让管理集群里的控制器去持续调谐。&lt;/p&gt;
&lt;p&gt;典型资源包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cluster&lt;/code&gt;：描述一个工作负载集群；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Machine&lt;/code&gt;、&lt;code&gt;MachineSet&lt;/code&gt;、&lt;code&gt;MachineDeployment&lt;/code&gt;：描述节点及其副本关系；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KubeadmControlPlane&lt;/code&gt;：描述基于 kubeadm 的控制平面；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KubeadmConfig&lt;/code&gt;：描述节点初始化或加入集群的 bootstrap 配置；&lt;/li&gt;
&lt;li&gt;各云厂商或虚拟化平台的 Infrastructure Provider 资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种模式的优点是自动化和可复现，但真实排障时仍然会遇到几个痛点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;关系链长&lt;/strong&gt;：一个集群问题可能同时涉及 Cluster、ControlPlane、MachineDeployment、MachineSet、Machine、BootstrapConfig、InfrastructureMachine 等资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态分散&lt;/strong&gt;：健康度通常藏在 &lt;code&gt;status.conditions&lt;/code&gt;、副本数字、事件、Provider 资源状态中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令切换频繁&lt;/strong&gt;：排查时经常要反复执行 &lt;code&gt;kubectl get&lt;/code&gt;、&lt;code&gt;kubectl describe&lt;/code&gt;、&lt;code&gt;kubectl get -o yaml&lt;/code&gt;，再靠人工拼 OwnerReference。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新成员学习成本高&lt;/strong&gt;：不了解 CAPI 资源层级的人，很难快速判断“是控制面问题、节点问题、模板问题，还是 Provider 问题”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Headlamp Cluster API 插件瞄准的正是这个体验层缺口。&lt;/p&gt;
&lt;h2 id="这次插件带来了什么"&gt;&lt;a href="#%e8%bf%99%e6%ac%a1%e6%8f%92%e4%bb%b6%e5%b8%a6%e6%9d%a5%e4%ba%86%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;这次插件带来了什么
&lt;/h2&gt;&lt;p&gt;根据 Kubernetes 官方博客和插件 README，这个插件会在 Headlamp 中新增一个专门的 &lt;strong&gt;Cluster API&lt;/strong&gt; 区域，并围绕 CAPI 资源提供列表页、详情页、仪表盘和关系图。&lt;/p&gt;
&lt;h3 id="1-集群总览与健康仪表盘"&gt;&lt;a href="#1-%e9%9b%86%e7%be%a4%e6%80%bb%e8%a7%88%e4%b8%8e%e5%81%a5%e5%ba%b7%e4%bb%aa%e8%a1%a8%e7%9b%98" class="header-anchor"&gt;&lt;/a&gt;1. 集群总览与健康仪表盘
&lt;/h3&gt;&lt;p&gt;插件提供集中化的 Cluster API Dashboard，用于汇总：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cluster、Machine、MachineDeployment、MachinePool、MachineSet、ControlPlane 的状态；&lt;/li&gt;
&lt;li&gt;控制面与工作节点副本数；&lt;/li&gt;
&lt;li&gt;Provider、配置模板、资源健康情况；&lt;/li&gt;
&lt;li&gt;当前存在的 Condition 异常与修复提示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对平台团队来说，仪表盘的价值不是取代告警系统，而是把“告警之后进入问题现场”的第一屏做得更清楚。过去你可能需要先列出所有资源，再逐层查看；现在可以先从 Dashboard 判断故障落在哪个层级。&lt;/p&gt;
&lt;h3 id="2-machine-体系的可视化"&gt;&lt;a href="#2-machine-%e4%bd%93%e7%b3%bb%e7%9a%84%e5%8f%af%e8%a7%86%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;2. Machine 体系的可视化
&lt;/h3&gt;&lt;p&gt;插件为 &lt;code&gt;MachineDeployment&lt;/code&gt;、&lt;code&gt;MachineSet&lt;/code&gt;、&lt;code&gt;Machine&lt;/code&gt; 和 &lt;code&gt;MachinePool&lt;/code&gt; 提供专门视图，展示副本、版本、Owner 关系、Provider ID、Condition 等信息。&lt;/p&gt;
&lt;p&gt;这对节点扩缩容和滚动升级尤其有用。例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get machinedeployments.cluster.x-k8s.io -A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get machines.cluster.x-k8s.io -A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe machine &amp;lt;machine-name&amp;gt; -n &amp;lt;namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些命令仍然是自动化和深度排障的基础，但图形界面能更快暴露：哪个 MachineDeployment 没有达到期望副本数，哪些 Machine 没 Ready，资源之间的归属关系是否符合预期。&lt;/p&gt;
&lt;h3 id="3-直接从-ui-扩缩容"&gt;&lt;a href="#3-%e7%9b%b4%e6%8e%a5%e4%bb%8e-ui-%e6%89%a9%e7%bc%a9%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;3. 直接从 UI 扩缩容
&lt;/h3&gt;&lt;p&gt;官方博客提到，插件支持对 MachineDeployments 和 MachineSets 执行 Scale 操作。也就是说，日常节点池扩缩容可以在 Headlamp 中完成，而不必每次手写 &lt;code&gt;kubectl scale&lt;/code&gt; 或修改 YAML。&lt;/p&gt;
&lt;p&gt;但这里要注意两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果集群是 ClusterClass / topology 管理的，扩缩容入口可能应当在更高层级，而不是直接改底层 MachineSet；&lt;/li&gt;
&lt;li&gt;UI 操作必须受 RBAC 控制，生产环境应限制谁能调整节点池规模。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议团队把 UI 操作视为“人工运维入口”，而不是绕过 GitOps 的捷径。如果集群资源已经由 GitOps 管理，仍应优先从 Git 仓库修改声明式配置，Headlamp 用于观察和紧急诊断。&lt;/p&gt;
&lt;h3 id="4-kubeadmconfig-结构化查看"&gt;&lt;a href="#4-kubeadmconfig-%e7%bb%93%e6%9e%84%e5%8c%96%e6%9f%a5%e7%9c%8b" class="header-anchor"&gt;&lt;/a&gt;4. KubeadmConfig 结构化查看
&lt;/h3&gt;&lt;p&gt;在 CAPI 排障中，bootstrap 配置经常决定节点能不能正确加入集群。插件提供了对 KubeadmConfig 的结构化视图，可以查看文件、kubelet 参数、join/init 设置等内容。&lt;/p&gt;
&lt;p&gt;这比直接阅读大段 YAML 更适合快速排查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kubelet 参数是否和集群版本匹配；&lt;/li&gt;
&lt;li&gt;bootstrap 文件是否缺失；&lt;/li&gt;
&lt;li&gt;join 配置是否指向正确控制面；&lt;/li&gt;
&lt;li&gt;是否存在模板更新但 Machine 未滚动的情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不过，结构化 UI 只能提升阅读效率，不能代替对敏感字段的权限治理。涉及 kubeconfig、证书、Token 的资源仍要按最小权限原则配置访问范围。&lt;/p&gt;
&lt;h3 id="5-map-view把-ownerreference-变成关系图"&gt;&lt;a href="#5-map-view%e6%8a%8a-ownerreference-%e5%8f%98%e6%88%90%e5%85%b3%e7%b3%bb%e5%9b%be" class="header-anchor"&gt;&lt;/a&gt;5. Map View：把 OwnerReference 变成关系图
&lt;/h3&gt;&lt;p&gt;CAPI 的核心难点之一是资源关系。Headlamp 的 Map View 可以显示 Cluster、ControlPlane、Worker 等资源之间的关系，让平台工程师不必手工追踪 OwnerReference。&lt;/p&gt;
&lt;p&gt;在以下场景中，关系图特别有价值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新集群创建卡住，需要定位卡在基础设施、控制面还是工作节点；&lt;/li&gt;
&lt;li&gt;节点池升级后副本数异常，需要确认 MachineDeployment → MachineSet → Machine 的链路；&lt;/li&gt;
&lt;li&gt;Provider 资源健康但 CAPI 资源未 Ready，需要确认引用关系是否断裂；&lt;/li&gt;
&lt;li&gt;新成员学习 CAPI 架构，需要直观看到对象层级。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="落地前的检查清单"&gt;&lt;a href="#%e8%90%bd%e5%9c%b0%e5%89%8d%e7%9a%84%e6%a3%80%e6%9f%a5%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;落地前的检查清单
&lt;/h2&gt;&lt;p&gt;如果你已经在用 Cluster API，可以按下面顺序评估是否引入该插件。&lt;/p&gt;
&lt;h3 id="1-确认-capi-crd-存在"&gt;&lt;a href="#1-%e7%a1%ae%e8%ae%a4-capi-crd-%e5%ad%98%e5%9c%a8" class="header-anchor"&gt;&lt;/a&gt;1. 确认 CAPI CRD 存在
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get crd &lt;span class="p"&gt;|&lt;/span&gt; grep cluster.x-k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get clusters.cluster.x-k8s.io -A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get machines.cluster.x-k8s.io -A
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这些资源不存在，说明当前集群并不是 CAPI 管理集群，安装插件也看不到核心数据。&lt;/p&gt;
&lt;h3 id="2-确认-headlamp-部署方式"&gt;&lt;a href="#2-%e7%a1%ae%e8%ae%a4-headlamp-%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;2. 确认 Headlamp 部署方式
&lt;/h3&gt;&lt;p&gt;Headlamp 可以以桌面应用、集群内服务或其他方式运行。对于生产环境，建议优先明确：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问入口是否经过认证；&lt;/li&gt;
&lt;li&gt;是否使用 OIDC 或企业身份系统；&lt;/li&gt;
&lt;li&gt;ServiceAccount 是否按角色区分；&lt;/li&gt;
&lt;li&gt;是否允许跨命名空间查看 CAPI 资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Headlamp 插件机制允许扩展侧边栏、资源详情页、仪表盘和业务逻辑，因此插件能力越强，越需要认真审计安装来源与权限边界。&lt;/p&gt;
&lt;h3 id="3-按-rbac-分层授权"&gt;&lt;a href="#3-%e6%8c%89-rbac-%e5%88%86%e5%b1%82%e6%8e%88%e6%9d%83" class="header-anchor"&gt;&lt;/a&gt;3. 按 RBAC 分层授权
&lt;/h3&gt;&lt;p&gt;不要把所有 Headlamp 用户都绑定成 cluster-admin。可以按角色拆分：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;建议权限&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;观察者&lt;/td&gt;
					&lt;td&gt;只读查看 Cluster、Machine、Condition、事件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;平台运维&lt;/td&gt;
					&lt;td&gt;可扩缩容 MachineDeployment / MachineSet&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;平台管理员&lt;/td&gt;
					&lt;td&gt;可安装插件、调整 Provider、执行升级相关动作&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;只读用户可以先验证 UI 的可观察性价值；有写权限的操作应纳入审计。&lt;/p&gt;
&lt;h3 id="4-与-gitops-流程约定边界"&gt;&lt;a href="#4-%e4%b8%8e-gitops-%e6%b5%81%e7%a8%8b%e7%ba%a6%e5%ae%9a%e8%be%b9%e7%95%8c" class="header-anchor"&gt;&lt;/a&gt;4. 与 GitOps 流程约定边界
&lt;/h3&gt;&lt;p&gt;如果 CAPI 资源由 Argo CD、Flux 或内部平台生成，UI 修改可能被下一次 GitOps 同步覆盖。建议明确三条规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;常规变更走 Git；&lt;/li&gt;
&lt;li&gt;UI 只用于观察、诊断和经过授权的紧急操作；&lt;/li&gt;
&lt;li&gt;紧急操作后必须回写 Git，避免实际状态和声明状态长期漂移。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="一个实用排障流程示例"&gt;&lt;a href="#%e4%b8%80%e4%b8%aa%e5%ae%9e%e7%94%a8%e6%8e%92%e9%9a%9c%e6%b5%81%e7%a8%8b%e7%a4%ba%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;一个实用排障流程示例
&lt;/h2&gt;&lt;p&gt;假设某个工作负载集群扩容后节点迟迟未 Ready，可以这样组合使用 UI 与 CLI。&lt;/p&gt;
&lt;p&gt;先在 Headlamp 的 Cluster API Dashboard 查看该 Cluster 是否有异常 Condition，确认问题集中在 worker 侧还是 control plane 侧。接着打开 MachineDeployment，检查期望副本与当前副本是否一致，再进入相关 MachineSet 和 Machine 页面查看具体状态。&lt;/p&gt;
&lt;p&gt;如果 UI 显示某台 Machine 卡在 bootstrap 或 infrastructure 阶段，再回到 CLI 做深挖：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl describe machine &amp;lt;machine-name&amp;gt; -n &amp;lt;namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events -n &amp;lt;namespace&amp;gt; --sort-by&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get kubeadmconfig -n &amp;lt;namespace&amp;gt; -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get &amp;lt;provider-machine-resource&amp;gt; -n &amp;lt;namespace&amp;gt; -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样做的好处是：先用 UI 缩小范围，再用 CLI 获取完整细节。排障路径会比一开始就从所有 YAML 中搜索更短。&lt;/p&gt;
&lt;h2 id="对平台工程团队的影响"&gt;&lt;a href="#%e5%af%b9%e5%b9%b3%e5%8f%b0%e5%b7%a5%e7%a8%8b%e5%9b%a2%e9%98%9f%e7%9a%84%e5%bd%b1%e5%93%8d" class="header-anchor"&gt;&lt;/a&gt;对平台工程团队的影响
&lt;/h2&gt;&lt;p&gt;这类插件的意义不只是“好看”。它反映了 Kubernetes 平台工程的一个趋势：底层仍然保持声明式 API 和控制器模式，上层则需要更贴近人类操作习惯的可视化、关系图和上下文导航。&lt;/p&gt;
&lt;p&gt;对团队来说，可以预期三类收益：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;降低 CAPI 学习成本&lt;/strong&gt;：新成员更容易理解 Cluster、Machine、ControlPlane 的关系；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缩短人工排障路径&lt;/strong&gt;：状态聚合和 Map View 能减少重复命令；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升操作一致性&lt;/strong&gt;：常见动作如扩缩容被封装在界面中，减少手写 YAML 出错。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同时，也要警惕两类风险：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;权限放大&lt;/strong&gt;：可视化工具一旦具备写操作，就必须严控 RBAC；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流程分叉&lt;/strong&gt;：UI 操作和 GitOps 声明式配置可能产生漂移，需要制度约束。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;Headlamp Cluster API 插件把 CAPI 的资源层级、健康状态、扩缩容动作和拓扑关系集中到 Kubernetes UI 中，适合已经使用 Cluster API 的平台团队试用。它不会替代 &lt;code&gt;kubectl&lt;/code&gt;、GitOps 或告警系统，但能成为告警之后的第一诊断入口，让多集群生命周期管理从“读 YAML 拼关系”逐步走向“看状态、看关系、再深入验证”。&lt;/p&gt;
&lt;p&gt;如果你的团队正在推进 CAPI、多云集群或自助式集群交付，建议先在测试环境启用该插件，以只读方式验证 Dashboard、资源详情页和 Map View 的价值，再逐步开放扩缩容等写操作。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Kubernetes 官方博客：Introducing the Cluster API plugin for Headlamp（2026-06-25） &lt;a class="link" href="https://kubernetes.io/blog/2026/06/25/headlamp-cluster-api-plugin/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/blog/2026/06/25/headlamp-cluster-api-plugin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cluster API 官方文档：Introduction &lt;a class="link" href="https://cluster-api.sigs.k8s.io/introduction" target="_blank" rel="noopener"
 &gt;https://cluster-api.sigs.k8s.io/introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Headlamp 官方文档：Plugins &lt;a class="link" href="https://headlamp.dev/docs/latest/development/plugins/" target="_blank" rel="noopener"
 &gt;https://headlamp.dev/docs/latest/development/plugins/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Headlamp 插件仓库：Cluster API Plugin README &lt;a class="link" href="https://github.com/headlamp-k8s/plugins/blob/main/cluster-api/README.md" target="_blank" rel="noopener"
 &gt;https://github.com/headlamp-k8s/plugins/blob/main/cluster-api/README.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>