<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Health-Checks on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/health-checks/</link><description>Recent content in Health-Checks on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 03 Aug 2026 05:22:16 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/health-checks/index.xml" rel="self" type="application/rss+xml"/><item><title>Liveness Probe vs Readiness Probe: Kubernetes Health Checks Compared</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-liveness-probe-vs-readiness-probe-kubernetes-health-checks-c/</link><pubDate>Mon, 03 Aug 2026 05:22:16 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-liveness-probe-vs-readiness-probe-kubernetes-health-checks-c/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Kubernetes uses liveness and readiness probes to answer two different questions about a running container: is it alive, and is it ready to serve requests. A failed liveness probe triggers a container &lt;strong class="kw"&gt;restart&lt;/strong&gt;, while a failed readiness probe only affects &lt;strong class="kw"&gt;traffic routing&lt;/strong&gt; by pulling the pod out of Service endpoints without killing it.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;line x1="320" y1="10" x2="320" y2="350" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4 4"/&gt;&lt;text x="160" y="26" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Liveness Probe&lt;/text&gt;&lt;text x="480" y="26" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Readiness Probe&lt;/text&gt;&lt;rect x="90" y="42" width="140" height="34" rx="4" style="fill:none;stroke:var(--content)"/&gt;&lt;text x="160" y="63" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Container&lt;/text&gt;&lt;line x1="160" y1="76" x2="160" y2="96" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="60" y="96" width="200" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="119" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;kubelet: is it alive?&lt;/text&gt;&lt;line x1="160" y1="134" x2="160" y2="152" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="160,152 198,180 160,208 122,180" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="184" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;Fails?&lt;/text&gt;&lt;line x1="160" y1="208" x2="160" y2="240" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="172" y="226" style="fill:var(--secondary)" font-size="10"&gt;yes&lt;/text&gt;&lt;rect x="60" y="240" width="200" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="263" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Kill &amp;amp; Restart Container&lt;/text&gt;&lt;path d="M60,259 C15,259 15,59 88,59" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="88,59 78,54 78,64" style="fill:var(--compare-a)"/&gt;&lt;line x1="122" y1="180" x2="90" y2="180" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="105" y="192" text-anchor="end" style="fill:var(--secondary)" font-size="10"&gt;no&lt;/text&gt;&lt;text x="30" y="184" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;stays&lt;/text&gt;&lt;text x="30" y="196" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;running&lt;/text&gt;&lt;text x="160" y="305" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;No effect on Service traffic&lt;/text&gt;&lt;rect x="410" y="42" width="140" height="34" rx="4" style="fill:none;stroke:var(--content)"/&gt;&lt;text x="480" y="63" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Container&lt;/text&gt;&lt;line x1="480" y1="76" x2="480" y2="96" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="380" y="96" width="200" height="38" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="119" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;kubelet: is it ready?&lt;/text&gt;&lt;line x1="480" y1="134" x2="480" y2="152" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polygon points="480,152 518,180 480,208 442,180" style="fill:none;stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="184" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;Ready?&lt;/text&gt;&lt;line x1="480" y1="208" x2="480" y2="240" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="492" y="226" style="fill:var(--secondary)" font-size="10"&gt;yes&lt;/text&gt;&lt;rect x="380" y="240" width="200" height="38" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="263" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Added to Service Endpoints&lt;/text&gt;&lt;line x1="518" y1="180" x2="530" y2="180" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="535" y="175" style="fill:var(--secondary)" font-size="10"&gt;no&lt;/text&gt;&lt;rect x="530" y="186" width="80" height="46" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;&lt;text x="570" y="204" text-anchor="middle" style="fill:var(--content)" font-size="9"&gt;Removed&lt;/text&gt;&lt;text x="570" y="216" text-anchor="middle" style="fill:var(--content)" font-size="9"&gt;(not killed)&lt;/text&gt;&lt;line x1="480" y1="278" x2="480" y2="300" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="390" y="300" width="180" height="34" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="321" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service / Load Balancer&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Liveness Probe&lt;/th&gt;
&lt;th&gt;Readiness Probe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core question&lt;/td&gt;
&lt;td&gt;Is the process still functioning?&lt;/td&gt;
&lt;td&gt;Is the process ready to accept traffic?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action on failure&lt;/td&gt;
&lt;td&gt;kubelet kills and restarts the container&lt;/td&gt;
&lt;td&gt;Container is left running, no restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on Service endpoints&lt;/td&gt;
&lt;td&gt;None directly; pod may keep receiving traffic until restart completes&lt;/td&gt;
&lt;td&gt;Pod is removed from Service endpoints, stops receiving traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on rolling deployments&lt;/td&gt;
&lt;td&gt;Not consulted for rollout progress&lt;/td&gt;
&lt;td&gt;Must pass before the pod counts as available and rollout proceeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart count impact&lt;/td&gt;
&lt;td&gt;Increments the container restart count on each failure&lt;/td&gt;
&lt;td&gt;Never causes a restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical checks used&lt;/td&gt;
&lt;td&gt;Lightweight self-check for hangs or deadlocks&lt;/td&gt;
&lt;td&gt;Checks dependency health: DB connections, cache warm-up, config load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misconfiguration risk&lt;/td&gt;
&lt;td&gt;Too-aggressive thresholds cause restart loops (CrashLoopBackOff)&lt;/td&gt;
&lt;td&gt;Too-aggressive thresholds pull healthy pods out of rotation, cutting capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Liveness failure causes a container &lt;strong class="kw"&gt;restart&lt;/strong&gt;; readiness failure only removes the pod from &lt;strong class="kw"&gt;Service endpoints&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Liveness answers &amp;ldquo;is it alive,&amp;rdquo; readiness answers &amp;ldquo;is it &lt;strong class="kw"&gt;ready for traffic&lt;/strong&gt;.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Readiness gates &lt;strong class="kw"&gt;rolling deployments&lt;/strong&gt;; liveness has no say in rollout progress.&lt;/li&gt;
&lt;li&gt;Using a dependency check as a liveness probe risks a &lt;strong class="kw"&gt;restart loop&lt;/strong&gt; when the real problem is an external service, not the process.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Liveness Probe&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>