<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>健康检查 on 吾爱主机</title><link>https://blog.waihost.com/tags/%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5/</link><description>Recent content in 健康检查 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/tags/%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5/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></channel></rss>