<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>K8S Archives - 原立方</title>
	<atom:link href="https://www.atomic-cube.cn/category/k8s/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.atomic-cube.cn/category/k8s/</link>
	<description>技术栈的流动-从零到∞</description>
	<lastBuildDate>Tue, 23 Jun 2026 07:22:48 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>
	<item>
		<title>Kubectl 命令参考手册</title>
		<link>https://www.atomic-cube.cn/kubectl-%e5%91%bd%e4%bb%a4%e5%8f%82%e8%80%83%e6%89%8b%e5%86%8c/</link>
					<comments>https://www.atomic-cube.cn/kubectl-%e5%91%bd%e4%bb%a4%e5%8f%82%e8%80%83%e6%89%8b%e5%86%8c/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 00:00:22 +0000</pubDate>
				<category><![CDATA[K8S]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[k3s]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Minikube]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=2016</guid>

					<description><![CDATA[<p>Kubectl 命令参考手册</p>
<p>The post <a href="https://www.atomic-cube.cn/kubectl-%e5%91%bd%e4%bb%a4%e5%8f%82%e8%80%83%e6%89%8b%e5%86%8c/">Kubectl 命令参考手册</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">K8S 命令老是忘记，索性整理了常用的 kubectl 命令，方便日常 Kubernetes 集群管理使用。</p>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-1024x576.png" alt="" class="wp-image-2028" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-1024x576.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-300x169.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-768x432.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-1536x864.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877-1280x720.png 1280w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/f77c570b1742a4fdddfd34d9f7d68877.png 1801w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h2 class="wp-block-heading"><strong>一：基础命令</strong></h2>



<h2 class="wp-block-heading">1.1 查看集群信息</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看集群信息
kubectl cluster-info

# 查看 Kubernetes 版本
kubectl version

# 查看 API 资源列表
kubectl api-resources

# 查看 API 版本
kubectl api-versions</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看集群信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">info</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Kubernetes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">版本</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">version</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">API</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">资源列表</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">resources</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">API</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">版本</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">versions</span></span></code></pre></div>



<h2 class="wp-block-heading">1.2 查看节点信息</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有节点
kubectl get nodes

# 查看节点详细信息
kubectl get nodes -o wide

# 查看节点详细信息（JSON/YAML）
kubectl get nodes -o json
kubectl get nodes -o yaml

# 查看特定节点
kubectl get node &lt;node-name>

# 描述节点
kubectl describe node &lt;node-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有节点</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看节点详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看节点详细信息</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">JSON</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">YAML</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">json</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定节点</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">node</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述节点</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">node</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>二：资源查看</strong></h2>



<h2 class="wp-block-heading">2.1 Pod 相关：</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有命名空间的 Podkubectl get pods --all-namespaces
kubectl get pods -A

# 查看指定命名空间的 Podkubectl get pods -n &lt;namespace>

# 查看 Pod 详细信息
kubectl get pods -o wide

# 查看 Pod 详细信息（JSON/YAML）
kubectl get pods -o json
kubectl get pods -o yaml

# 查看特定 Podkubectl get pod &lt;pod-name> -n &lt;namespace>

# 查看 Pod 标签
kubectl get pods --show-labels</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有命名空间的</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">A</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看指定命名空间的</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">详细信息</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">JSON</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">YAML</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">json</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">标签</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">show</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">labels</span></span></code></pre></div>



<h2 class="wp-block-heading">2.2 Deployment 相关：</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有 Deploymentkubectl get deployments
kubectl get deploy

# 查看 Deployment 详细信息
kubectl get deployments -o wide

# 查看特定 Deploymentkubectl get deployment &lt;deployment-name> -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deploymentkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployments</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deploy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployments</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deploymentkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">2.3 Service 相关：</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有 Servicekubectl get services
kubectl get svc

# 查看 Service 详细信息
kubectl get services -o wide

# 查看特定 Servicekubectl get service &lt;service-name> -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Servicekubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">services</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">services</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Servicekubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">2.4 其他资源：</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有资源类型
kubectl get all

# 查看 ConfigMapkubectl get configmaps
kubectl get cm

# 查看 Secretkubectl get secrets

# 查看 PersistentVolumekubectl get pv

# 查看 PersistentVolumeClaimkubectl get pvc

# 查看 Ingresskubectl get ingress
kubectl get ing

# 查看 Jobkubectl get jobs

# 查看 CronJobkubectl get cronjobs

# 查看 DaemonSetkubectl get daemonsets
kubectl get ds

# 查看 StatefulSetkubectl get statefulsets
kubectl get sts</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有资源类型</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ConfigMapkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configmaps</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cm</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secretkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secrets</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PersistentVolumekubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pv</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PersistentVolumeClaimkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pvc</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingresskubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ing</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Jobkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jobs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CronJobkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cronjobs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DaemonSetkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">daemonsets</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ds</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">StatefulSetkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">statefulsets</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sts</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>三：资源操作</strong></p>



<h2 class="wp-block-heading">3.1 创建资源</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 从文件创建资源
kubectl create -f &lt;file.yaml>

# 从 URL 创建资源
kubectl create -f &lt;url>

# 从目录创建所有资源
kubectl create -f &lt;directory>/

# 创建命名空间
kubectl create namespace &lt;namespace-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">从文件创建资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">从</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">URL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">创建资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">url</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">从目录创建所有资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">directory</span><span style="color: #81A1C1">&gt;/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">创建命名空间</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">3.2 应用资源</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 应用配置文件（推荐）
kubectl apply -f &lt;file.yaml>

# 应用目录下所有文件
kubectl apply -f &lt;directory>/

# 应用并记录配置
kubectl apply -f &lt;file.yaml> --record

# 强制替换资源
kubectl apply -f &lt;file.yaml> --force</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">应用配置文件</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">推荐</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">应用目录下所有文件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">directory</span><span style="color: #81A1C1">&gt;/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">应用并记录配置</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">record</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">强制替换资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">force</span></span></code></pre></div>



<h2 class="wp-block-heading">3.3 删除资源</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 删除资源
kubectl delete -f &lt;file.yaml>

# 删除特定资源
kubectl delete pod &lt;pod-name> -n &lt;namespace>
kubectl delete deployment &lt;deployment-name> -n &lt;namespace>
kubectl delete service &lt;service-name> -n &lt;namespace>

# 删除所有资源
kubectl delete all --all -n &lt;namespace>

# 删除命名空间（会删除命名空间下所有资源）
kubectl delete namespace &lt;namespace-name>

# 强制删除 Podkubectl delete pod &lt;pod-name> --force --grace-period=0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除特定资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除所有资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除命名空间</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">会删除命名空间下所有资源</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">强制删除</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">force</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">grace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">period</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span></span></code></pre></div>



<h2 class="wp-block-heading">3.4 编辑资源</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 编辑资源（使用默认编辑器）
kubectl edit pod &lt;pod-name> -n &lt;namespace>
kubectl edit deployment &lt;deployment-name> -n &lt;namespace>

# 编辑并应用
kubectl edit -f &lt;file.yaml></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">编辑资源</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">使用默认编辑器</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">edit</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">edit</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">编辑并应用</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">edit</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">3.5 替换资源</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 替换资源
kubectl replace -f &lt;file.yaml>

# 强制替换
kubectl replace -f &lt;file.yaml> --force</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">替换资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">replace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">强制替换</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">replace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">force</span></span></code></pre></div>



<h1 class="wp-block-heading"><strong>四：调试和日志</strong></h1>



<h2 class="wp-block-heading">4.1查看日志</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看 Pod 日志
kubectl logs &lt;pod-name> -n &lt;namespace>

# 查看前 N 行日志
kubectl logs &lt;pod-name> -n &lt;namespace> --tail=100

# 实时跟踪日志
kubectl logs &lt;pod-name> -n &lt;namespace> -f

# 查看之前容器的日志
kubectl logs &lt;pod-name> -n &lt;namespace> --previous

# 查看多容器 Pod 中特定容器的日志
kubectl logs &lt;pod-name> -c &lt;container-name> -n &lt;namespace>

# 查看指定时间范围的日志
kubectl logs &lt;pod-name> -n &lt;namespace> --since=1h
kubectl logs &lt;pod-name> -n &lt;namespace> --since-time="2024-01-01T00:00:00Z"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看前</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">行日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">tail</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">100</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">实时跟踪日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看之前容器的日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">previous</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看多容器</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">中特定容器的日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">c</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">container</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看指定时间范围的日志</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">since</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">1</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">since</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">time</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">2024-01-01T00:00:00Z</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<h2 class="wp-block-heading">4.2 进入容器</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 进入 Pod 容器（交互式）
kubectl exec -it &lt;pod-name> -n &lt;namespace> -- /bin/bash
kubectl exec -it &lt;pod-name> -n &lt;namespace> -- /bin/sh

# 在容器中执行命令
kubectl exec &lt;pod-name> -n &lt;namespace> -- &lt;command>

# 在特定容器中执行命令
kubectl exec &lt;pod-name> -c &lt;container-name> -n &lt;namespace> -- &lt;command></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">进入</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">容器</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">交互式</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">it</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bin</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bash</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">it</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bin</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sh</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">在容器中执行命令</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">command</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">在特定容器中执行命令</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">c</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">container</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">command</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">4.3 调试工具</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看 Pod 详细信息
kubectl describe pod &lt;pod-name> -n &lt;namespace>

# 查看事件
kubectl get events -n &lt;namespace> --sort-by='.lastTimestamp'

# 查看资源使用情况
kubectl top nodes
kubectl top pods -n &lt;namespace>

# 查看资源使用情况（所有命名空间）
kubectl top pods --all-namespaces</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看事件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">sort</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">by</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">.lastTimestamp</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看资源使用情况</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看资源使用情况</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">所有命名空间</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span></code></pre></div>



<h1 class="wp-block-heading"><strong>五: 配置管理</strong></h1>



<h2 class="wp-block-heading">5.1 ConfigMap 操作</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看 ConfigMapkubectl get configmap &lt;configmap-name> -n &lt;namespace>

# 查看 ConfigMap 内容
kubectl get configmap &lt;configmap-name> -n &lt;namespace> -o yaml

# 从文件创建 ConfigMapkubectl create configmap &lt;configmap-name> --from-file=&lt;file-path>

# 从目录创建 ConfigMapkubectl create configmap &lt;configmap-name> --from-file=&lt;directory>/

# 从字面量创建 ConfigMapkubectl create configmap &lt;configmap-name> --from-literal=key1=value1 --from-literal=key2=value2

# 编辑 ConfigMapkubectl edit configmap &lt;configmap-name> -n &lt;namespace>

# 删除 ConfigMapkubectl delete configmap &lt;configmap-name> -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ConfigMapkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configmap</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">configmap</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ConfigMap</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">内容</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configmap</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">configmap</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">从文件创建</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ConfigMapkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configmap</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">configmap</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">from</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">file</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">file-path</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 从目录创建 ConfigMapkubectl create configmap </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">configmap-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> --from-file=</span><span style="color: #81A1C1">&lt;directory&gt;</span><span style="color: #D8DEE9FF">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 从字面量创建 ConfigMapkubectl create configmap </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">configmap-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> --from-literal=key1=value1 --from-literal=key2=value2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 编辑 ConfigMapkubectl edit configmap </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">configmap-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 删除 ConfigMapkubectl delete configmap </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">configmap-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.2 Secret 操作</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看 Secretkubectl get secret &lt;secret-name> -n &lt;namespace>

# 查看 Secret 内容（Base64 编码）
kubectl get secret &lt;secret-name> -n &lt;namespace> -o yaml

# 解码 Secretkubectl get secret &lt;secret-name> -n &lt;namespace> -o jsonpath='{.data.&lt;key>}' | base64 -d

# 从文件创建 Secretkubectl create secret generic &lt;secret-name> --from-file=&lt;file-path>

# 从字面量创建 Secretkubectl create secret generic &lt;secret-name> --from-literal=username=admin --from-literal=password=secret

# 从 Docker 注册表创建 Secretkubectl create secret docker-registry &lt;secret-name> --docker-server=&lt;server> --docker-username=&lt;username> --docker-password=&lt;password>

# 编辑 Secretkubectl edit secret &lt;secret-name> -n &lt;namespace>

# 删除 Secretkubectl delete secret &lt;secret-name> -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secretkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">secret</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">内容</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">Base64</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">编码</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">secret</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">解码</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secretkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">secret</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jsonpath</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{.data.&lt;key&gt;}</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">base64</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">d</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">从文件创建</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secretkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">generic</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">secret</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">from</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">file</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">file-path</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 从字面量创建 Secretkubectl create secret generic </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">secret-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> --from-literal=username=admin --from-literal=password=secret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 从 Docker 注册表创建 Secretkubectl create secret docker-registry </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">secret-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> --docker-server=</span><span style="color: #81A1C1">&lt;server&gt;</span><span style="color: #D8DEE9FF"> --docker-username=</span><span style="color: #81A1C1">&lt;username&gt;</span><span style="color: #D8DEE9FF"> --docker-password=</span><span style="color: #81A1C1">&lt;password&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 编辑 Secretkubectl edit secret </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">secret-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 删除 Secretkubectl delete secret </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">secret-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.3 端口转发</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 转发 Pod 端口到本地
kubectl port-forward &lt;pod-name> &lt;local-port>:&lt;pod-port> -n &lt;namespace>

# 转发 Service 端口到本地
kubectl port-forward service/&lt;service-name> &lt;local-port>:&lt;service-port> -n &lt;namespace>

# 转发 Deployment 端口到本地
kubectl port-forward deployment/&lt;deployment-name> &lt;local-port>:&lt;container-port> -n &lt;namespace>

# 示例：转发 MySQL 服务
kubectl port-forward service/mysql 3306:3306 -n default</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">转发</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">端口到本地</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">forward</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">local-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">:</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">pod-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 转发 Service 端口到本地</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl port-forward service/</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">service-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">local-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">:</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">service-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 转发 Deployment 端口到本地</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl port-forward deployment/</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">deployment-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">local-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">:</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">container-port</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 示例：转发 MySQL 服务</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl port-forward service/mysql 3306:3306 -n default</span></span></code></pre></div>



<h2 class="wp-block-heading">5.4 执行命令</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 在 Pod 中执行命令
kubectl exec &lt;pod-name> -n &lt;namespace> -- &lt;command>

# 在 Pod 中执行交互式命令
kubectl exec -it &lt;pod-name> -n &lt;namespace> -- &lt;command>

# 在特定容器中执行命令
kubectl exec &lt;pod-name> -c &lt;container-name> -n &lt;namespace> -- &lt;command>

# 示例
kubectl exec my-pod -- ls /tmp
kubectl exec -it my-pod -- /bin/bash</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">在</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">中执行命令</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">command</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">在</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">中执行交互式命令</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">it</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">command</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">在特定容器中执行命令</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">c</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">container</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">command</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">示例</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">my</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ls</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">tmp</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">it</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">my</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bin</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bash</span></span></code></pre></div>



<h2 class="wp-block-heading">5.5 标签和选择器</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看资源标签
kubectl get pods --show-labels

# 给资源添加标签
kubectl label pod &lt;pod-name> app=myapp -n &lt;namespace>

# 更新标签
kubectl label pod &lt;pod-name> app=newapp --overwrite -n &lt;namespace>

# 删除标签
kubectl label pod &lt;pod-name> app- -n &lt;namespace>

# 使用标签选择器查询
kubectl get pods -l app=myapp -n &lt;namespace>
kubectl get pods -l 'app in (myapp,yourapp)' -n &lt;namespace>
kubectl get pods -l 'app=myapp,version=v1' -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看资源标签</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">show</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">labels</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">给资源添加标签</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">label</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">myapp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">更新标签</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">label</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">newapp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">overwrite</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除标签</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">label</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">使用标签选择器查询</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">myapp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">app in (myapp,yourapp)</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">app=myapp,version=v1</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.6 滚动更新</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看滚动更新状态
kubectl rollout status deployment/&lt;deployment-name> -n &lt;namespace>

# 查看滚动更新历史
kubectl rollout history deployment/&lt;deployment-name> -n &lt;namespace>

# 回滚到上一个版本
kubectl rollout undo deployment/&lt;deployment-name> -n &lt;namespace>

# 回滚到指定版本
kubectl rollout undo deployment/&lt;deployment-name> --to-revision=&lt;revision-number> -n &lt;namespace>

# 暂停滚动更新
kubectl rollout pause deployment/&lt;deployment-name> -n &lt;namespace>

# 恢复滚动更新
kubectl rollout resume deployment/&lt;deployment-name> -n &lt;namespace>

# 扩展 Deploymentkubectl scale deployment/&lt;deployment-name> --replicas=&lt;number> -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看滚动更新状态</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rollout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">status</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">/&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看滚动更新历史</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rollout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">history</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">/&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">回滚到上一个版本</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rollout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">undo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">/&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">回滚到指定版本</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rollout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">undo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">/&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">to</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">revision</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">revision-number</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 暂停滚动更新</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl rollout pause deployment/</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">deployment-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 恢复滚动更新</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl rollout resume deployment/</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">deployment-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 扩展 Deploymentkubectl scale deployment/</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">deployment-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> --replicas=</span><span style="color: #81A1C1">&lt;number&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.7 资源描述</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 描述 Podkubectl describe pod &lt;pod-name> -n &lt;namespace>

# 描述 Deploymentkubectl describe deployment &lt;deployment-name> -n &lt;namespace>

# 描述 Servicekubectl describe service &lt;service-name> -n &lt;namespace>

# 描述 Nodekubectl describe node &lt;node-name>

# 描述命名空间
kubectl describe namespace &lt;namespace-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deploymentkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Servicekubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Nodekubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">node</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">描述命名空间</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.8 事件查看</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有事件
kubectl get events -n &lt;namespace>

# 查看所有命名空间的事件
kubectl get events --all-namespaces

# 按时间排序查看事件
kubectl get events -n &lt;namespace> --sort-by='.lastTimestamp'

# 查看特定资源的事件
kubectl get events --field-selector involvedObject.name=&lt;pod-name> -n &lt;namespace>

# 实时监控事件
kubectl get events -n &lt;namespace> --watch</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有事件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有命名空间的事件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">按时间排序查看事件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">sort</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">by</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">.lastTimestamp</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定资源的事件</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">field</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">selector</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">involvedObject</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">pod-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 实时监控事件</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl get events -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span><span style="color: #D8DEE9FF"> --watch</span></span></code></pre></div>



<h2 class="wp-block-heading">5.9 命名空间管理</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看所有命名空间
kubectl get namespaces
kubectl get ns

# 查看命名空间详细信息
kubectl get namespace &lt;namespace-name> -o yaml

# 创建命名空间
kubectl create namespace &lt;namespace-name>

# 删除命名空间
kubectl delete namespace &lt;namespace-name>

# 切换到命名空间（使用 kubectx/kubens 工具）
# 或者使用上下文
kubectl config set-context --current --namespace=&lt;namespace-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有命名空间</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看命名空间详细信息</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">创建命名空间</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除命名空间</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">切换到命名空间</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">使用</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kubens</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">工具</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">或者使用上下文</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">set</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">current</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">namespace-name</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">5.10 上下文和配置</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 查看当前上下文
kubectl config current-context

# 查看所有上下文
kubectl config get-contexts

# 切换上下文
kubectl config use-context &lt;context-name>

# 查看配置
kubectl config view

# 查看特定上下文的配置
kubectl config view --context=&lt;context-name>

# 设置默认命名空间
kubectl config set-context --current --namespace=&lt;namespace-name>

# 查看集群信息
kubectl config view --minify

# 重命名上下文
kubectl config rename-context &lt;old-name> &lt;new-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看当前上下文</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">current</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">context</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看所有上下文</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">contexts</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">切换上下文</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">use</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">context</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看配置</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">view</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">查看特定上下文的配置</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">view</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">context</span><span style="color: #81A1C1">=&lt;</span><span style="color: #8FBCBB">context-name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 设置默认命名空间</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl config set-context --current --namespace=</span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">namespace-name</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 查看集群信息</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl config view --minify</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># 重命名上下文</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl config rename-context </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">old-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">new-name</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h1 class="wp-block-heading"><strong>六: 实用技巧</strong></h1>



<h2 class="wp-block-heading">6.1 输出格式</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># JSON 格式
kubectl get pods -o json

# YAML 格式
kubectl get pods -o yaml

# 自定义列
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase

# JSONPath
kubectl get pods -o jsonpath='{.items&#91;*&#93;.metadata.name}'

# 表格格式（默认）
kubectl get pods</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">JSON</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">格式</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">json</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">YAML</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">格式</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">自定义列</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">custom</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">columns</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">NAME</span><span style="color: #ECEFF4">:.</span><span style="color: #D8DEE9">metadata</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">name</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">STATUS</span><span style="color: #ECEFF4">:.</span><span style="color: #D8DEE9">status</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">phase</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">JSONPath</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jsonpath</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{.items&#91;*&#93;.metadata.name}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">表格格式</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">默认</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span></span></code></pre></div>



<h2 class="wp-block-heading">6.2 过滤和搜索</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 按标签过滤
kubectl get pods -l app=myapp

# 按字段选择器过滤
kubectl get pods --field-selector status.phase=Running

# 搜索资源
kubectl get all | grep &lt;keyword></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">按标签过滤</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">myapp</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">按字段选择器过滤</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">field</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">selector</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">status</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">phase</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">Running</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">搜索资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">keyword</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading">6.3 批量操作</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 删除所有命名空间下的所有 Podkubectl delete pods --all --all-namespaces

# 删除所有命名空间下的所有 Deploymentkubectl delete deployments --all --all-namespaces

# 删除命名空间下的所有资源
kubectl delete all --all -n &lt;namespace></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除所有命名空间下的所有</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Podkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除所有命名空间下的所有</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deploymentkubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployments</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">删除命名空间下的所有资源</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading" id="导出资源">6.4 导出资源<a href="http://is.iceymoss.com/blog/1#%E5%AF%BC%E5%87%BA%E8%B5%84%E6%BA%90"></a></h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 导出资源为 YAMLkubectl get pod &lt;pod-name> -n &lt;namespace> -o yaml > pod.yaml&lt;/em>

&lt;em># 导出资源为 JSONkubectl get pod &lt;pod-name> -n &lt;namespace> -o json > pod.json&lt;/em>

&lt;em># 导出并移除集群特定信息&lt;/em>
kubectl get pod &lt;pod-name> -n &lt;namespace> -o yaml --export > pod.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 导出资源为 YAMLkubectl get pod </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">pod-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span><span style="color: #D8DEE9FF"> -o yaml &gt; pod.yaml</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 导出资源为 JSONkubectl get pod </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">pod-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span><span style="color: #D8DEE9FF"> -o json &gt; pod.json</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 导出并移除集群特定信息</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl get pod </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">pod-name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> -n </span><span style="color: #81A1C1">&lt;namespace&gt;</span><span style="color: #D8DEE9FF"> -o yaml --export &gt; pod.yaml</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading" id="补丁操作">6.5 补丁操作<a href="http://is.iceymoss.com/blog/1#%E8%A1%A5%E4%B8%81%E6%93%8D%E4%BD%9C"></a></h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 使用 JSON 补丁&lt;/em>
kubectl patch pod &lt;pod-name> -p '{"spec":{"containers":&#91;{"name":"mycontainer","image":"newimage"}&#93;}}'

&lt;em># 使用策略性合并补丁&lt;/em>
kubectl patch deployment &lt;deployment-name> -p '{"spec":{"replicas":3}}'

&lt;em># 使用 JSON 补丁文件&lt;/em>
kubectl patch pod &lt;pod-name> --patch-file=patch.json
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 使用 JSON 补丁</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;:{&quot;containers&quot;:&#91;{&quot;name&quot;:&quot;mycontainer&quot;,&quot;image&quot;:&quot;newimage&quot;}&#93;}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 使用策略性合并补丁</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;:{&quot;replicas&quot;:3}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 使用 JSON 补丁文件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">patch</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">file</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">patch</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">json</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading" id="常用组合命令">七: 常用组合命令<a href="http://is.iceymoss.com/blog/1#%E5%B8%B8%E7%94%A8%E7%BB%84%E5%90%88%E5%91%BD%E4%BB%A4"></a></h1>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 查看 Pod 并显示标签&lt;/em>
kubectl get pods --show-labels -n &lt;namespace>

&lt;em># 查看所有命名空间的资源&lt;/em>
kubectl get all --all-namespaces

&lt;em># 查看资源并持续监控&lt;/em>
kubectl get pods -w -n &lt;namespace>

&lt;em># 查看资源并排序&lt;/em>
kubectl get pods --sort-by=.metadata.creationTimestamp -n &lt;namespace>

&lt;em># 查看资源使用情况&lt;/em>
kubectl top pods --sort-by=memory -n &lt;namespace>

&lt;em># 查看资源并过滤&lt;/em>
kubectl get pods -n &lt;namespace> | grep &lt;keyword>

&lt;em># 查看资源并导出&lt;/em>
kubectl get deployment &lt;deployment-name> -n &lt;namespace> -o yaml > deployment.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Pod 并显示标签</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">show</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">labels</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看所有命名空间的资源</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源并持续监控</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">w</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源并排序</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">sort</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">by</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">metadata</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">creationTimestamp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源使用情况</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">sort</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">by</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">memory</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源并过滤</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">keyword</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源并导出</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading" id="故障排查命令">八: 故障排查命令<a href="http://is.iceymoss.com/blog/1#%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5%E5%91%BD%E4%BB%A4"></a></h1>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 查看 Pod 状态和事件&lt;/em>
kubectl describe pod &lt;pod-name> -n &lt;namespace>

&lt;em># 查看 Pod 日志&lt;/em>
kubectl logs &lt;pod-name> -n &lt;namespace> --previous

&lt;em># 查看所有命名空间的错误 Podkubectl get pods --all-namespaces --field-selector status.phase!=Running&lt;/em>

&lt;em># 查看节点资源使用&lt;/em>
kubectl top nodes

&lt;em># 查看集群事件&lt;/em>
kubectl get events --all-namespaces --sort-by='.lastTimestamp'

&lt;em># 检查 API 服务器连接&lt;/em>
kubectl cluster-info dump

&lt;em># 查看资源配额&lt;/em>
kubectl describe quota -n &lt;namespace>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Pod 状态和事件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Pod 日志</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">previous</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看所有命名空间的错误 Podkubectl get pods --all-namespaces --field-selector status.phase!=Running</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看节点资源使用</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看集群事件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">namespaces</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">sort</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">by</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">.lastTimestamp</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 API 服务器连接</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">info</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dump</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看资源配额</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">quota</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading" id="注意事项">注意事项<a href="http://is.iceymoss.com/blog/1#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9"></a></h1>



<p class="wp-block-paragraph">1.&nbsp;<strong>命名空间</strong>：大多数命令需要指定&nbsp;<code>-n &lt;namespace&gt;</code>&nbsp;或&nbsp;<code>--namespace=&lt;namespace&gt;</code>，如果不指定则使用默认命名空间（通常是&nbsp;<code>default</code>）</p>



<p class="wp-block-paragraph">2.&nbsp;<strong>资源名称</strong>：可以使用完整名称或简写形式，例如：</p>



<ul class="wp-block-list">
<li><code>pods</code>&nbsp;或&nbsp;<code>po</code></li>



<li><code>services</code>&nbsp;或&nbsp;<code>svc</code></li>



<li><code>deployments</code>&nbsp;或&nbsp;<code>deploy</code></li>



<li><code>namespaces</code>&nbsp;或&nbsp;<code>ns</code></li>
</ul>



<p class="wp-block-paragraph">3.&nbsp;<strong>输出格式</strong>：使用&nbsp;<code>-o</code>&nbsp;参数指定输出格式，常用格式包括：</p>



<ul class="wp-block-list">
<li><code>yaml</code></li>



<li><code>json</code></li>



<li><code>wide</code></li>



<li><code>custom-columns</code></li>
</ul>



<p class="wp-block-paragraph">4.&nbsp;<strong>强制删除</strong>：删除资源时，如果 Pod 处于&nbsp;<code>Terminating</code>&nbsp;状态，可以使用：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl delete pod &lt;pod-name> --force --grace-period=0 -n &lt;namespace>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">force</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">grace</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">period</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">5.&nbsp;<strong>权限</strong>：某些命令可能需要相应的 RBAC 权限，确保当前用户有足够的权限执行操作</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading" id="参考资源">参考资源<a href="http://is.iceymoss.com/blog/1#%E5%8F%82%E8%80%83%E8%B5%84%E6%BA%90"></a></h1>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/">Kubernetes 官方文档</a></li>



<li><a href="https://kubernetes.io/docs/reference/kubectl/">kubectl 官方文档</a></li>



<li><a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/">kubectl 备忘单</a></li>
</ul>
<p>The post <a href="https://www.atomic-cube.cn/kubectl-%e5%91%bd%e4%bb%a4%e5%8f%82%e8%80%83%e6%89%8b%e5%86%8c/">Kubectl 命令参考手册</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/kubectl-%e5%91%bd%e4%bb%a4%e5%8f%82%e8%80%83%e6%89%8b%e5%86%8c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>本地安装Minikube部署Kubernetes环境</title>
		<link>https://www.atomic-cube.cn/apple-chip%e5%ae%89%e8%a3%85minikube/</link>
					<comments>https://www.atomic-cube.cn/apple-chip%e5%ae%89%e8%a3%85minikube/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 23:20:00 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[K8S]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[k3s]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Minikube]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=1685</guid>

					<description><![CDATA[<p>Minikube&#160;是一个工具，它为本地环境提供了一种轻量化的&#160;Kubernetes&#160;集群实现。通过 Minikube，用户可以在本地机器上快速启动并运行一个 Kubernetes 环境，用来学习、测试和开发。Minikube支持Kubernetes的所有主要功能，包括Dashboard、DNS、容器运行时（如Docker、containerd、CRI-O）等。这种本地化的 Kubernetes 环境主要为开发者提供了便捷，不再需要花费额外的精力去搭建和维护一个庞大的远程集群。 1.安装 Docker Desktop 作为官方推荐的容器化平台，安装Docker Desktop能让你顺利使用Docker驱动。 2. 安装 Minikube 和 kubectl 使用 Homebrew 可以一键安装这两个核心工具。 使用 Homebrew 安装：在终端中执行以下命令： 验证安装：运行以下命令，确认版本信息能正常输出： 3. 启动你的 Kubernetes 集群 启动命令是最关键的一步。对于国内的网络环境，强烈建议配置阿里云的镜像加速，这能显著提升启动速度和成功率。 推荐方案：使用 Docker 驱动 + 阿里云镜像/dl.k8s.io加速：使用以下命令启动 Minikube： 4.验证并开始使用 如果看到节点状态为&#160;Ready，就说明你的单节点 Kubernetes 集群已经成功运行了。 5. (可选) 启用 Minikube 插件 Minikube 提供了许多插件来扩展功能，最常用的是仪表盘（Dashboard）。 启用仪表盘 (Dashboard)：执行以下命令，浏览器将自动打开 Kubernetes 的 Web UI 界面，方便你直观地管理集群。 更多插件：执行&#160;minikube addons list&#160;可以查看所有可用插件，例如&#160;ingress&#160;用于管理入站网络流量。 [&#8230;]</p>
<p>The post <a href="https://www.atomic-cube.cn/apple-chip%e5%ae%89%e8%a3%85minikube/">本地安装Minikube部署Kubernetes环境</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Minikube&nbsp;是一个工具，它为本地环境提供了一种轻量化的&nbsp;Kubernetes&nbsp;集群实现。通过 Minikube，用户可以在本地机器上快速启动并运行一个 Kubernetes 环境，用来学习、测试和开发。Minikube支持Kubernetes的所有主要功能，包括Dashboard、DNS、容器运行时（如Docker、containerd、CRI-O）等。这种本地化的 Kubernetes 环境主要为开发者提供了便捷，不再需要花费额外的精力去搭建和维护一个庞大的远程集群。</p>



<h4 class="wp-block-heading" id="mR92-1776855755612"><strong>1.安装 Docker Desktop</strong></h4>



<p class="wp-block-paragraph">作为官方推荐的容器化平台，安装Docker Desktop能让你顺利使用Docker驱动<a href="https://developer.baidu.com/article/detail.html?id=3189546"></a>。</p>



<ul class="wp-block-list">
<li><strong>下载与安装</strong>：访问&nbsp;<a href="https://www.docker.com/products/docker-desktop/">Docker 官网</a>，我使用的是Mac M2，需要下载适用于&nbsp;<strong>Apple Chip</strong>&nbsp;的安装包并进行安装<a href="https://blog.csdn.net/hiliang521/article/details/158770295"></a><a href="https://www.e-com-net.com/article/1739862094263631872.htm"></a>。</li>



<li><strong>启动与验证</strong>：安装完成后，启动 Docker Desktop，并确保它在后台正常运行，状态显示为&nbsp;Running<a href="https://blog.csdn.net/hiliang521/article/details/158770295"></a>。</li>
</ul>



<p class="wp-block-paragraph"><strong>2. 安装 Minikube 和 kubectl</strong></p>



<p class="wp-block-paragraph">使用 Homebrew 可以一键安装这两个核心工具<a href="https://blog.csdn.net/hiliang521/article/details/158770295"></a><a href="https://developer.baidu.com/article/detail.html?id=3189546"></a>。</p>



<p class="wp-block-paragraph"><strong>使用 Homebrew 安装</strong>：在终端中执行以下命令：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install kubectl
brew install minikube</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">brew</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectl</span></span>
<span class="line"><span style="color: #D8DEE9">brew</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span></span></code></pre></div>



<p class="wp-block-paragraph"><br><strong>验证安装</strong>：运行以下命令，确认版本信息能正常输出：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl version --client
minikube version</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">version</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">client</span></span>
<span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">version</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="860" height="216" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image.png" alt="" class="wp-image-1686" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image.png 860w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-300x75.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-768x193.png 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>



<p class="wp-block-paragraph"><strong>3. 启动你的 Kubernetes 集群</strong></p>



<p class="wp-block-paragraph">启动命令是最关键的一步。对于国内的网络环境，强烈建议配置阿里云的镜像加速，这能显著提升启动速度和成功率。</p>



<p class="wp-block-paragraph"><strong>推荐方案：使用 Docker 驱动 + 阿里云镜像/dl.k8s.io加速</strong>：使用以下命令启动 Minikube：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>docker配置使用国内镜像源后，可直接运行：
minikube start --driver=docker

可以手动指定其他源，可尝试多次下载：
minikube start --driver=docker --kubernetes-version='v1.35.1' --binary-mirror='https://dl.k8s.io'

如出现下载失败或者下载超时，可采用以下方式彻底清除现有集群和缓存，然后重新执行上面的命令进行下载：
minikube delete --all --purge
rm -rf ~/.minikube   # 可选，彻底清理残留配置</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">docker配置使用国内镜像源后</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">可直接运行</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">start</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">driver</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">docker</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">可以手动指定其他源</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">可尝试多次下载</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">start</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">driver</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">version</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">v1.35.1</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">binary</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">mirror</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">https://dl.k8s.io</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">如出现下载失败或者下载超时</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">可采用以下方式彻底清除现有集群和缓存</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">然后重新执行上面的命令进行下载</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">purge</span></span>
<span class="line"><span style="color: #D8DEE9">rm</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">rf</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF">   # </span><span style="color: #D8DEE9">可选</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">彻底清理残留配置</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>4.验证并开始使用</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>minikube status
kubectl get nodes</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">status</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span></span></code></pre></div>



<p class="wp-block-paragraph">如果看到节点状态为&nbsp;Ready，就说明你的单节点 Kubernetes 集群已经成功运行了<a href="https://blog.csdn.net/hiliang521/article/details/158770295"></a>。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="984" height="384" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-1.png" alt="" class="wp-image-1690" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-1.png 984w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-1-300x117.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-1-768x300.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></figure>



<p class="wp-block-paragraph"><strong>5. (可选) 启用 Minikube 插件</strong></p>



<p class="wp-block-paragraph">Minikube 提供了许多插件来扩展功能，最常用的是仪表盘（Dashboard）。</p>



<p class="wp-block-paragraph"><strong>启用仪表盘 (Dashboard)</strong>：执行以下命令，浏览器将自动打开 Kubernetes 的 Web UI 界面，方便你直观地管理集群。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>minikube addons enable dashboard
启用可能会失败：
# 拉取 dashboard 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.7.0

# 拉取 metrics-scraper 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8

将拉取下来的国内镜像，标记为 Kubernetes 期望的官方镜像名：
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.7.0 kubernetes/dashboard:v2.7.0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8 kubernetes/metrics-scraper:v1.0.8

删除失败的 Pod，让它们重新创建
kubectl delete pod -n kubernetes-dashboard --all

kubectl get pods -n kubernetes-dashboard

minikube dashboard</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">addons</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">enable</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dashboard</span></span>
<span class="line"><span style="color: #D8DEE9">启用可能会失败</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">拉取</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dashboard</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">镜像</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">cn</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">hangzhou</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">aliyuncs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">google_containers</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">dashboard</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v2</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">7.0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">拉取</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">metrics</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">scraper</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">镜像</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">cn</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">hangzhou</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">aliyuncs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">google_containers</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">metrics</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">scraper</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.8</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">将拉取下来的国内镜像</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">标记为</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Kubernetes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">期望的官方镜像名</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tag</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">cn</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">hangzhou</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">aliyuncs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">google_containers</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">dashboard</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v2</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">7.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">dashboard</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v2</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">7.0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tag</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">cn</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">hangzhou</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">aliyuncs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">google_containers</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">metrics</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">scraper</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.8</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">metrics</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">scraper</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.8</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">删除失败的</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">让它们重新创建</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dashboard</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">all</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dashboard</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dashboard</span></span></code></pre></div>



<figure class="wp-block-image size-large"><a href="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-scaled.png"><img decoding="async" width="1024" height="529" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-1024x529.png" alt="" class="wp-image-1720" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-1024x529.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-300x155.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-768x397.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-1536x794.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-2-2048x1058.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-scaled.png"><img decoding="async" width="1024" height="525" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-1024x525.png" alt="" class="wp-image-1751" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-1024x525.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-300x154.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-768x393.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-1536x787.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-13-2048x1049.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-scaled.png"><img decoding="async" width="1024" height="512" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-1024x512.png" alt="" class="wp-image-1753" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-1024x512.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-300x150.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-768x384.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-1536x768.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-14-2048x1024.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-scaled.png"><img decoding="async" width="1024" height="523" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-1024x523.png" alt="" class="wp-image-1754" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-1024x523.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-300x153.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-768x392.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-1536x785.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-15-2048x1046.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph"><br><strong>更多插件</strong>：执行&nbsp;minikube addons list&nbsp;可以查看所有可用插件，例如&nbsp;ingress&nbsp;用于管理入站网络流量。</p>



<p class="wp-block-paragraph"><strong>🧪 测试集群：部署一个 Nginx 应用</strong></p>



<p class="wp-block-paragraph">为了验证集群功能，可以尝试部署一个简单的 Nginx 应用<a href="https://blog.csdn.net/xuezhiwu001/article/details/128392695"></a>。</p>



<ol class="wp-block-list">
<li><strong>创建 Nginx Deployment</strong>：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create deployment nginx --image=nginx:alpine</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">nginx</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">alpine</span></span></code></pre></div>



<p class="wp-block-paragraph">2.<strong>创建一个 Service 来暴露应用</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl expose deployment nginx --type=NodePort --port=80</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">type</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">NodePort</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span></span></code></pre></div>



<p class="wp-block-paragraph">3.<strong>获取访问地址</strong>：运行以下命令获取服务的访问 URL，然后在浏览器中打开它，就能看到 Nginx 的欢迎页面了。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>minikube service nginx --url</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">url</span></span></code></pre></div>



<p class="wp-block-paragraph">4.<strong>清理测试资源</strong>：测试完成后，可以删除 Deployment 和 Service 来释放资源。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl delete service nginx
kubectl delete deployment nginx

常用 Minikube 命令
停止集群: minikube stop (保留数据，释放 CPU/内存)
暂停集群: minikube pause (快速暂停)
删除集群: minikube delete (彻底删除数据)
查看 Dashboard: minikube dashboard (打开 Web 界面)
查看插件列表: minikube addons list</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">常用</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">命令</span></span>
<span class="line"><span style="color: #D8DEE9FF">停止集群</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">stop</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">保留数据</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">释放</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CPU</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">内存</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">暂停集群</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pause</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">快速暂停</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">删除集群</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">彻底删除数据</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9">查看</span><span style="color: #D8DEE9FF"> Dashboard</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">dashboard</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">打开</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Web</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">界面</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">查看插件列表</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minikube</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">addons</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">list</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.atomic-cube.cn/apple-chip%e5%ae%89%e8%a3%85minikube/">本地安装Minikube部署Kubernetes环境</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/apple-chip%e5%ae%89%e8%a3%85minikube/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes Ingress 架构设计与最佳实践指南</title>
		<link>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e4%b8%8e%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97/</link>
					<comments>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e4%b8%8e%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Tue, 06 Jan 2026 00:00:54 +0000</pubDate>
				<category><![CDATA[K8S]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[k3s]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Minikube]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=2020</guid>

					<description><![CDATA[<p>Ingress 是 Kubernetes 中用于管理外部访问集群内服务的 API 对象。它提供了 HTTP 和 HTTPS 路由、负载均衡、SSL/TLS 终止等功能。</p>
<p>The post <a href="https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e4%b8%8e%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97/">Kubernetes Ingress 架构设计与最佳实践指南</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="概述">概述<a href="http://is.iceymoss.com/blog/18#%E6%A6%82%E8%BF%B0"></a></h2>



<h3 class="wp-block-heading" id="什么是-Ingress-">什么是 Ingress？<a href="http://is.iceymoss.com/blog/18#%E4%BB%80%E4%B9%88%E6%98%AF-Ingress-"></a></h3>



<p class="wp-block-paragraph">Ingress 是 Kubernetes 中用于管理外部访问集群内服务的 API 对象。它提供了 HTTP 和 HTTPS 路由、负载均衡、SSL/TLS 终止等功能。</p>



<h3 class="wp-block-heading" id="核心概念">核心概念<a href="http://is.iceymoss.com/blog/18#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5"></a></h3>



<ul class="wp-block-list">
<li><strong>Ingress Controller</strong>：实际处理流量的组件，负责实现 Ingress 规范</li>



<li><strong>Ingress 资源</strong>：定义路由规则的 Kubernetes 资源对象</li>



<li><strong>IngressClass</strong>：用于指定使用哪个 Ingress Controller</li>
</ul>



<h3 class="wp-block-heading" id="为什么需要-Ingress-">为什么需要 Ingress？<a href="http://is.iceymoss.com/blog/18#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81-Ingress-"></a></h3>



<ul class="wp-block-list">
<li>统一入口管理：避免为每个 Service 使用 NodePort 或 LoadBalancer</li>



<li>成本优化：一个 LoadBalancer 可以服务多个应用</li>



<li>灵活路由：基于域名、路径的路由规则</li>



<li>SSL/TLS 管理：集中管理证书</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="架构设计原则">架构设计原则<a href="http://is.iceymoss.com/blog/18#%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99"></a></h2>



<h3 class="wp-block-heading" id="1--集中式-Controller---分布式-Ingress-资源">1. 集中式 Controller + 分布式 Ingress 资源<a href="http://is.iceymoss.com/blog/18#1--%E9%9B%86%E4%B8%AD%E5%BC%8F-Controller---%E5%88%86%E5%B8%83%E5%BC%8F-Ingress-%E8%B5%84%E6%BA%90"></a></h3>



<p class="wp-block-paragraph"><strong>核心思想</strong>：</p>



<ul class="wp-block-list">
<li>集群级部署一个或多个 Ingress Controller（高可用）</li>



<li>各业务命名空间独立管理自己的 Ingress 资源</li>



<li>Controller 统一处理所有命名空间的 Ingress</li>
</ul>



<h3 class="wp-block-heading" id="2--IngressClass-作用域">2. IngressClass 作用域<a href="http://is.iceymoss.com/blog/18#2--IngressClass-%E4%BD%9C%E7%94%A8%E5%9F%9F"></a></h3>



<h4 class="wp-block-heading" id="集群作用域-Cluster-scoped-">集群作用域（Cluster-scoped）<a href="http://is.iceymoss.com/blog/18#%E9%9B%86%E7%BE%A4%E4%BD%9C%E7%94%A8%E5%9F%9F-Cluster-scoped-"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IngressClass</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  controller</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>特点</strong>：</p>



<ul class="wp-block-list">
<li>集群内所有命名空间可用</li>



<li>适合共享的 Ingress Controller</li>



<li><strong>生产环境推荐使用</strong></li>
</ul>



<h4 class="wp-block-heading" id="命名空间作用域-Namespace-scoped-">命名空间作用域（Namespace-scoped）<a href="http://is.iceymoss.com/blog/18#%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%BD%9C%E7%94%A8%E5%9F%9F-Namespace-scoped-"></a></h4>



<p class="wp-block-paragraph"><strong>特点</strong>：</p>



<ul class="wp-block-list">
<li>仅在该命名空间内可用</li>



<li>适合多租户或特殊隔离场景</li>



<li>一般不建议使用</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="Ingress-Controller-选型">Ingress Controller 选型<a href="http://is.iceymoss.com/blog/18#Ingress-Controller-%E9%80%89%E5%9E%8B"></a></h2>



<h3 class="wp-block-heading" id="主流-Controller-对比">主流 Controller 对比<a href="http://is.iceymoss.com/blog/18#%E4%B8%BB%E6%B5%81-Controller-%E5%AF%B9%E6%AF%94"></a></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Controller</th><th>维护者</th><th>特点</th><th>适用场景</th></tr></thead><tbody><tr><td><strong>Ingress-NGINX</strong></td><td>Kubernetes 社区</td><td>最流行，基于 Nginx，功能丰富</td><td>通用场景，推荐</td></tr><tr><td>Traefik</td><td>Traefik Labs</td><td>配置简单，自动证书</td><td>微服务架构</td></tr><tr><td>Istio Gateway</td><td>Istio 社区</td><td>服务网格集成</td><td>服务网格环境</td></tr><tr><td>Kong</td><td>Kong Inc.</td><td>API 网关功能</td><td>API 管理场景</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="推荐-Ingress-NGINX">推荐：Ingress-NGINX<a href="http://is.iceymoss.com/blog/18#%E6%8E%A8%E8%8D%90-Ingress-NGINX"></a></h3>



<p class="wp-block-paragraph"><strong>优势</strong>：</p>



<ul class="wp-block-list">
<li>Kubernetes 官方维护，社区活跃</li>



<li>功能完善，文档齐全</li>



<li>性能优秀，生产验证</li>



<li>支持丰富的注解（annotations）</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="企业级架构方案">企业级架构方案<a href="http://is.iceymoss.com/blog/18#%E4%BC%81%E4%B8%9A%E7%BA%A7%E6%9E%B6%E6%9E%84%E6%96%B9%E6%A1%88"></a></h2>



<h3 class="wp-block-heading" id="标准架构图">标准架构图<a href="http://is.iceymoss.com/blog/18#%E6%A0%87%E5%87%86%E6%9E%B6%E6%9E%84%E5%9B%BE"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>┌─────────────────────────────────────────────────────────┐
│                   外部流量入口                            │
│              (LoadBalancer / NodePort)                   │
└──────────────────────┬──────────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────────┐
│         Ingress Controller (集群级)                      │
│  ┌──────────────────────────────────────────────────┐  │
│  │  Namespace: ingress-nginx                        │  │
│  │  - Deployment: ingress-nginx-controller (3副本)   │  │
│  │  - Service: LoadBalancer                         │  │
│  │  - IngressClass: nginx (集群作用域)              │  │
│  └──────────────────────────────────────────────────┘  │
└──────────────────────┬──────────────────────────────────┘
                       │ 监听所有命名空间
        ┌──────────────┼──────────────┐
        │              │              │
┌───────▼──────┐ ┌─────▼──────┐ ┌─────▼──────┐
│  a-api       │ │  b-api     │ │  c-api     │
│  namespace   │ │  namespace │ │  namespace │
│              │ │            │ │            │
│  Ingress     │ │  Ingress   │ │  Ingress   │
│  Service     │ │  Service   │ │  Service   │
│  Deployment  │ │  Deployment│ │  Deployment│
└──────────────┘ └────────────┘ └────────────┘
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">┌─────────────────────────────────────────────────────────┐</span></span>
<span class="line"><span style="color: #D8DEE9FF">│                   </span><span style="color: #D8DEE9">外部流量入口</span><span style="color: #D8DEE9FF">                            │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│              (</span><span style="color: #D8DEE9">LoadBalancer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NodePort</span><span style="color: #D8DEE9FF">)                   │</span></span>
<span class="line"><span style="color: #D8DEE9FF">└──────────────────────┬──────────────────────────────────┘</span></span>
<span class="line"><span style="color: #D8DEE9FF">                       │</span></span>
<span class="line"><span style="color: #D8DEE9FF">┌──────────────────────▼──────────────────────────────────┐</span></span>
<span class="line"><span style="color: #D8DEE9FF">│         </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Controller</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">集群级</span><span style="color: #D8DEE9FF">)                      │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  ┌──────────────────────────────────────────────────┐  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  Namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">                        │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> Deployment</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">controller</span><span style="color: #D8DEE9FF"> (3</span><span style="color: #D8DEE9">副本</span><span style="color: #D8DEE9FF">)   │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> Service</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">LoadBalancer</span><span style="color: #D8DEE9FF">                         │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> IngressClass</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">nginx</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">集群作用域</span><span style="color: #D8DEE9FF">)              │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  └──────────────────────────────────────────────────┘  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">└──────────────────────┬──────────────────────────────────┘</span></span>
<span class="line"><span style="color: #D8DEE9FF">                       │ </span><span style="color: #D8DEE9">监听所有命名空间</span></span>
<span class="line"><span style="color: #D8DEE9FF">        ┌──────────────┼──────────────┐</span></span>
<span class="line"><span style="color: #D8DEE9FF">        │              │              │</span></span>
<span class="line"><span style="color: #D8DEE9FF">┌───────▼──────┐ ┌─────▼──────┐ ┌─────▼──────┐</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF">       │ │  </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF">     │ │  </span><span style="color: #D8DEE9">c</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF">     │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF">   │ │  </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> │ │  </span><span style="color: #D8DEE9">namespace</span><span style="color: #D8DEE9FF"> │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│              │ │            │ │            │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF">     │ │  </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF">   │ │  </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF">   │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF">     │ │  </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF">   │ │  </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF">   │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">Deployment</span><span style="color: #D8DEE9FF">  │ │  </span><span style="color: #D8DEE9">Deployment</span><span style="color: #D8DEE9FF">│ │  </span><span style="color: #D8DEE9">Deployment</span><span style="color: #D8DEE9FF">│</span></span>
<span class="line"><span style="color: #D8DEE9FF">└──────────────┘ └────────────┘ └────────────┘</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="高可用部署">高可用部署<a href="http://is.iceymoss.com/blog/18#%E9%AB%98%E5%8F%AF%E7%94%A8%E9%83%A8%E7%BD%B2"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  replicas: 3  &lt;em># 多副本高可用&lt;/em>
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app.kubernetes.io/name
                  operator: In
                  values:
                  - ingress-nginx
              topologyKey: kubernetes.io/hostname
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deployment</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  replicas</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">多副本高可用</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  strategy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    type</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RollingUpdate</span></span>
<span class="line"><span style="color: #D8DEE9FF">    rollingUpdate</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      maxSurge</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">      maxUnavailable</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">  template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      affinity</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        podAntiAffinity</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          preferredDuringSchedulingIgnoredDuringExecution</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> weight</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span></span>
<span class="line"><span style="color: #D8DEE9FF">            podAffinityTerm</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              labelSelector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">                matchExpressions</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> key</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">name</span></span>
<span class="line"><span style="color: #D8DEE9FF">                  operator</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">In</span></span>
<span class="line"><span style="color: #D8DEE9FF">                  values</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">                  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">              topologyKey</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">hostname</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="多-Controller-场景-可选-">多 Controller 场景（可选）<a href="http://is.iceymoss.com/blog/18#%E5%A4%9A-Controller-%E5%9C%BA%E6%99%AF-%E5%8F%AF%E9%80%89-"></a></h3>



<p class="wp-block-paragraph">如果需要内外网隔离：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>- ingress-nginx-internal (内网，IngressClass: nginx-internal)
- ingress-nginx-external (外网，IngressClass: nginx-external)
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">internal</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">内网</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">IngressClass</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">internal</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">external</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">外网</span><span style="color: #D8DEE9FF">，</span><span style="color: #D8DEE9">IngressClass</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">external</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="Ingress-NGINX-工作原理">Ingress-NGINX 工作原理<a href="http://is.iceymoss.com/blog/18#Ingress-NGINX-%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86"></a></h2>



<h3 class="wp-block-heading" id="1--核心架构组件">1. 核心架构组件<a href="http://is.iceymoss.com/blog/18#1--%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84%E7%BB%84%E4%BB%B6"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>┌─────────────────────────────────────────┐
│  Ingress Controller Pod                  │
│  ┌───────────────────────────────────┐  │
│  │  Ingress Controller (Go程序)       │  │
│  │  - 监听 Kubernetes API Server      │  │
│  │  - 生成 Nginx 配置                 │  │
│  │  - 管理 Nginx 进程                 │  │
│  └───────────────────────────────────┘  │
│  ┌───────────────────────────────────┐  │
│  │  Nginx (C程序)                     │  │
│  │  - 实际处理 HTTP/HTTPS 流量        │  │
│  │  - 读取生成的配置文件              │  │
│  └───────────────────────────────────┘  │
└─────────────────────────────────────────┘
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">┌─────────────────────────────────────────┐</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pod</span><span style="color: #D8DEE9FF">                  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  ┌───────────────────────────────────┐  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Controller</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">Go程序</span><span style="color: #D8DEE9FF">)       │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">监听</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Kubernetes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">API</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Server</span><span style="color: #D8DEE9FF">      │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">生成</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">配置</span><span style="color: #D8DEE9FF">                 │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">管理</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">进程</span><span style="color: #D8DEE9FF">                 │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  └───────────────────────────────────┘  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  ┌───────────────────────────────────┐  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #88C0D0">Nginx</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">C程序</span><span style="color: #D8DEE9FF">)                     │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">实际处理</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">HTTPS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">流量</span><span style="color: #D8DEE9FF">        │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  │  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">读取生成的配置文件</span><span style="color: #D8DEE9FF">              │  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">│  └───────────────────────────────────┘  │</span></span>
<span class="line"><span style="color: #D8DEE9FF">└─────────────────────────────────────────┘</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="2--工作流程">2. 工作流程<a href="http://is.iceymoss.com/blog/18#2--%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B"></a></h3>



<h4 class="wp-block-heading" id="阶段-1-Controller-启动和初始化">阶段 1：Controller 启动和初始化<a href="http://is.iceymoss.com/blog/18#%E9%98%B6%E6%AE%B5-1-Controller-%E5%90%AF%E5%8A%A8%E5%92%8C%E5%88%9D%E5%A7%8B%E5%8C%96"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  template:
    spec:
      containers:
      - name: controller
        args:
        - /nginx-ingress-controller
        - --watch-ingress-without-class=true  &lt;em># 监听所有 Ingress&lt;/em>
        - --ingress-class=nginx               &lt;em># 只处理指定 class 的 Ingress&lt;/em>
        - --configmap=ingress-nginx-controller  &lt;em># 全局配置&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deployment</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      containers</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">        args</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">watch</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">without</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">class</span><span style="color: #81A1C1">=true</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">监听所有</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">class</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">               </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">只处理指定</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">class</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">的</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">Ingress</span><span style="color: #ECEFF4">&lt;</span><span style="color: #D8DEE9FF">/em</span><span style="color: #ECEFF4">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        - --</span><span style="color: #8FBCBB">configmap</span><span style="color: #D8DEE9FF">=</span><span style="color: #8FBCBB">ingress</span><span style="color: #D8DEE9FF">-</span><span style="color: #8FBCBB">nginx</span><span style="color: #D8DEE9FF">-</span><span style="color: #8FBCBB">controller</span><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&lt;</span><span style="color: #D8DEE9FF">em</span><span style="color: #ECEFF4">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #8FBCBB">全局配置</span><span style="color: #ECEFF4">&lt;</span><span style="color: #D8DEE9FF">/em</span><span style="color: #ECEFF4">&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>启动步骤</strong>：</p>



<ol class="wp-block-list">
<li>连接 Kubernetes API Server</li>



<li>创建必要的 RBAC 权限（ClusterRole/ClusterRoleBinding）</li>



<li>初始化 Informer 监听机制</li>
</ol>



<h4 class="wp-block-heading" id="阶段-2-监听机制-Informer-Pattern-">阶段 2：监听机制（Informer Pattern）<a href="http://is.iceymoss.com/blog/18#%E9%98%B6%E6%AE%B5-2-%E7%9B%91%E5%90%AC%E6%9C%BA%E5%88%B6-Informer-Pattern-"></a></h4>



<p class="wp-block-paragraph">Controller 使用 Kubernetes 的&nbsp;<strong>Informer</strong>&nbsp;机制实现事件驱动监听：</p>



<p class="wp-block-paragraph"><strong>关键特性</strong>：</p>



<ul class="wp-block-list">
<li><strong>集群级权限</strong>：通过 ClusterRole 读取所有命名空间的资源</li>



<li><strong>事件驱动</strong>：资源变化时立即触发，无需轮询</li>



<li><strong>本地缓存</strong>：减少 API Server 压力</li>
</ul>



<p class="wp-block-paragraph"><strong>监听资源类型</strong>：</p>



<ul class="wp-block-list">
<li>Ingress 资源（所有命名空间）</li>



<li>Service 资源（相关命名空间）</li>



<li>Endpoints 资源（相关命名空间）</li>



<li>Secret 资源（TLS 证书）</li>
</ul>



<h4 class="wp-block-heading" id="阶段-3-Ingress-资源发现和过滤">阶段 3：Ingress 资源发现和过滤<a href="http://is.iceymoss.com/blog/18#%E9%98%B6%E6%AE%B5-3-Ingress-%E8%B5%84%E6%BA%90%E5%8F%91%E7%8E%B0%E5%92%8C%E8%BF%87%E6%BB%A4"></a></h4>



<p class="wp-block-paragraph">当在任何命名空间创建 Ingress 时：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
spec:
  ingressClassName: nginx  &lt;em># 关键：指定使用 nginx IngressClass&lt;/em>
  rules:
  - host: a-api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">关键</span><span style="color: #D8DEE9FF">：</span><span style="color: #D8DEE9">指定使用</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IngressClass</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Controller 处理逻辑</strong>：</p>



<ol class="wp-block-list">
<li><strong>IngressClass 匹配检查</strong>
<ul class="wp-block-list">
<li>检查 <code>spec.ingressClassName</code> 是否匹配</li>



<li>如果不匹配，忽略该 Ingress</li>
</ul>
</li>



<li><strong>资源验证</strong>
<ul class="wp-block-list">
<li>验证 Ingress 规则的有效性</li>



<li>检查引用的 Service 是否存在</li>
</ul>
</li>



<li><strong>规则解析</strong>
<ul class="wp-block-list">
<li>解析 host、path 规则</li>



<li>获取后端 Service 信息</li>
</ul>
</li>



<li><strong>缓存更新</strong>
<ul class="wp-block-list">
<li>更新内部 Ingress 缓存</li>



<li>触发配置重新生成</li>
</ul>
</li>
</ol>



<h4 class="wp-block-heading" id="阶段-4-Nginx-配置生成">阶段 4：Nginx 配置生成<a href="http://is.iceymoss.com/blog/18#%E9%98%B6%E6%AE%B5-4-Nginx-%E9%85%8D%E7%BD%AE%E7%94%9F%E6%88%90"></a></h4>



<p class="wp-block-paragraph">Controller 将 Ingress 规则转换为 Nginx 配置：</p>



<p class="wp-block-paragraph"><strong>生成的配置示例</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># /etc/nginx/nginx.conf&lt;/em>

&lt;em># 从 a-api 命名空间&lt;/em>
upstream upstream_balancer_a {
    least_conn;
    server 10.244.1.5:8080 max_fails=0 fail_timeout=0;
    server 10.244.1.6:8080 max_fails=0 fail_timeout=0;
}

server {
    listen 80;
    server_name a-api.example.com;
    
    location / {
        proxy_pass http://upstream_balancer_a;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

&lt;em># 从 b-api 命名空间&lt;/em>
upstream upstream_balancer_b {
    least_conn;
    server 10.244.2.3:8080 max_fails=0 fail_timeout=0;
}

server {
    listen 80;
    server_name b-api.example.com;
    
    location / {
        proxy_pass http://upstream_balancer_b;
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># /etc/nginx/nginx.conf</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 从 a-api 命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">upstream</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">upstream_balancer_a</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">least_conn</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.244</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">1.5</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_fails</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fail_timeout</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.244</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">1.6</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_fails</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fail_timeout</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">listen</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">server_name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">location</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">proxy_pass</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//upstream_balancer_a;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">proxy_set_header</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Host</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$host</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">proxy_set_header</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">X</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Real</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$remote_addr</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">proxy_set_header</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">X</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Forwarded</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">For</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$proxy_add_x_forwarded_for</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 从 b-api 命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">upstream</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">upstream_balancer_b</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">least_conn</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.244</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">2.3</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_fails</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fail_timeout</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">listen</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">server_name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">location</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">proxy_pass</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//upstream_balancer_b;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>配置生成过程</strong>：</p>



<ol class="wp-block-list">
<li>遍历所有匹配的 Ingress 资源</li>



<li>解析每个 Ingress 的规则（host、path）</li>



<li>获取对应的 Service 和 Endpoints</li>



<li>生成 upstream 配置（负载均衡）</li>



<li>生成 server 块（路由规则）</li>



<li>写入配置文件</li>



<li>验证配置语法</li>



<li>重载 Nginx（<code>nginx -s reload</code>）</li>
</ol>



<h4 class="wp-block-heading" id="阶段-5-Service-和-Endpoints-发现">阶段 5：Service 和 Endpoints 发现<a href="http://is.iceymoss.com/blog/18#%E9%98%B6%E6%AE%B5-5-Service-%E5%92%8C-Endpoints-%E5%8F%91%E7%8E%B0"></a></h4>



<p class="wp-block-paragraph">Controller 同时监听 Service 和 Endpoints 变化：</p>



<p class="wp-block-paragraph"><strong>Endpoints 更新流程</strong>：</p>



<ol class="wp-block-list">
<li>Pod 启动/停止 → Endpoints 变化</li>



<li>Controller 监听到变化</li>



<li>更新对应的 upstream 配置</li>



<li>重载 Nginx</li>
</ol>



<p class="wp-block-paragraph"><strong>关键点</strong>：</p>



<ul class="wp-block-list">
<li>Endpoints 变化时自动更新负载均衡配置</li>



<li>无需手动干预，实现自动服务发现</li>
</ul>



<h3 class="wp-block-heading" id="3--跨命名空间访问原理">3. 跨命名空间访问原理<a href="http://is.iceymoss.com/blog/18#3--%E8%B7%A8%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E8%AE%BF%E9%97%AE%E5%8E%9F%E7%90%86"></a></h3>



<h4 class="wp-block-heading" id="RBAC-配置">RBAC 配置<a href="http://is.iceymoss.com/blog/18#RBAC-%E9%85%8D%E7%BD%AE"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># ClusterRole - 集群级权限&lt;/em>
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ingress-nginx
rules:
- apiGroups: &#91;""&#93;
  resources: &#91;"services", "endpoints", "secrets", "nodes", "pods"&#93;
  verbs: &#91;"get", "list", "watch"&#93;
- apiGroups: &#91;"networking.k8s.io"&#93;
  resources: &#91;"ingresses"&#93;
  verbs: &#91;"get", "list", "watch"&#93;
- apiGroups: &#91;"networking.k8s.io"&#93;
  resources: &#91;"ingresses/status"&#93;
  verbs: &#91;"update"&#93;
- apiGroups: &#91;"networking.k8s.io"&#93;
  resources: &#91;"ingressclasses"&#93;
  verbs: &#91;"get", "list", "watch"&#93;
---
&lt;em># ClusterRoleBinding - 绑定到所有命名空间&lt;/em>
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ingress-nginx
subjects:
- kind: ServiceAccount
  name: ingress-nginx
  namespace: ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ClusterRole - 集群级权限</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ClusterRole</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> apiGroups</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  resources</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">services</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">endpoints</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">secrets</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">nodes</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">pods</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  verbs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">get</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">list</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">watch</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> apiGroups</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">networking.k8s.io</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  resources</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingresses</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  verbs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">get</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">list</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">watch</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> apiGroups</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">networking.k8s.io</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  resources</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingresses/status</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  verbs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">update</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> apiGroups</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">networking.k8s.io</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  resources</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingressclasses</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  verbs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">get</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">list</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">watch</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #81A1C1">---</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ClusterRoleBinding - 绑定到所有命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ClusterRoleBinding</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">roleRef</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  apiGroup</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span></span>
<span class="line"><span style="color: #D8DEE9FF">  kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ClusterRole</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">subjects</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ServiceAccount</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>权限说明</strong>：</p>



<ul class="wp-block-list">
<li><code>ClusterRole</code> 提供集群级权限，可访问所有命名空间</li>



<li><code>ClusterRoleBinding</code> 将权限绑定到 Controller 的 ServiceAccount</li>



<li>Controller 因此可以读取所有命名空间的 Ingress、Service、Endpoints</li>
</ul>



<h3 class="wp-block-heading" id="4--IngressClass-匹配机制">4. IngressClass 匹配机制<a href="http://is.iceymoss.com/blog/18#4--IngressClass-%E5%8C%B9%E9%85%8D%E6%9C%BA%E5%88%B6"></a></h3>



<h4 class="wp-block-heading" id="IngressClass-定义">IngressClass 定义<a href="http://is.iceymoss.com/blog/18#IngressClass-%E5%AE%9A%E4%B9%89"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IngressClass</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  controller</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="匹配逻辑">匹配逻辑<a href="http://is.iceymoss.com/blog/18#%E5%8C%B9%E9%85%8D%E9%80%BB%E8%BE%91"></a></h4>



<p class="wp-block-paragraph">Controller 启动时指定要处理的 IngressClass：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>--ingress-class=nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">class</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>匹配规则</strong>：</p>



<ol class="wp-block-list">
<li>Ingress 明确指定 <code>ingressClassName: nginx</code> → 匹配</li>



<li>Ingress 未指定，但 nginx 是默认 IngressClass → 匹配</li>



<li>其他情况 → 不匹配，忽略</li>
</ol>



<h3 class="wp-block-heading" id="5--完整数据流">5. 完整数据流<a href="http://is.iceymoss.com/blog/18#5--%E5%AE%8C%E6%95%B4%E6%95%B0%E6%8D%AE%E6%B5%81"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>用户创建 Ingress (a-api 命名空间)
         ↓
Kubernetes API Server
         ↓
Ingress Controller Informer 监听到事件
         ↓
Controller 验证 IngressClass 匹配
         ↓
Controller 读取对应的 Service (a-api 命名空间)
         ↓
Controller 读取 Service 的 Endpoints
         ↓
Controller 生成 Nginx 配置（包含 upstream）
         ↓
Controller 写入 /etc/nginx/nginx.conf
         ↓
Controller 执行 nginx -s reload
         ↓
Nginx 开始处理流量
         ↓
流量 → Nginx → Service → Pod
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">用户创建</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Ingress</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">命名空间</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Kubernetes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">API</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Server</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Informer</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">监听到事件</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">验证</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IngressClass</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">匹配</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">读取对应的</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Service</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">命名空间</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">读取</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">的</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Endpoints</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">生成</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">配置</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">包含</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">upstream</span><span style="color: #D8DEE9FF">）</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">写入</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">conf</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">执行</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reload</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">开始处理流量</span></span>
<span class="line"><span style="color: #D8DEE9FF">         ↓</span></span>
<span class="line"><span style="color: #D8DEE9">流量</span><span style="color: #D8DEE9FF"> → </span><span style="color: #D8DEE9">Nginx</span><span style="color: #D8DEE9FF"> → </span><span style="color: #D8DEE9">Service</span><span style="color: #D8DEE9FF"> → </span><span style="color: #D8DEE9">Pod</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="实施步骤">实施步骤<a href="http://is.iceymoss.com/blog/18#%E5%AE%9E%E6%96%BD%E6%AD%A5%E9%AA%A4"></a></h2>



<h3 class="wp-block-heading" id="步骤-1-部署-Ingress-Controller">步骤 1：部署 Ingress Controller<a href="http://is.iceymoss.com/blog/18#%E6%AD%A5%E9%AA%A4-1-%E9%83%A8%E7%BD%B2-Ingress-Controller"></a></h3>



<h4 class="wp-block-heading" id="使用-Helm-部署-推荐-">使用 Helm 部署（推荐）<a href="http://is.iceymoss.com/blog/18#%E4%BD%BF%E7%94%A8-Helm-%E9%83%A8%E7%BD%B2-%E6%8E%A8%E8%8D%90-"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 添加 Helm 仓库&lt;/em>
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

&lt;em># 安装 Ingress Controller&lt;/em>
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.replicaCount=3 \
  --set controller.service.type=LoadBalancer
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 添加 Helm 仓库</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//kubernetes.github.io/ingress-nginx</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 安装 Ingress Controller</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--namespace</span><span style="color: #D8DEE9FF"> ingress-nginx \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --create-namespace \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">replicaCount=3 \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">type=LoadBalancer</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="使用官方-YAML-部署">使用官方 YAML 部署<a href="http://is.iceymoss.com/blog/18#%E4%BD%BF%E7%94%A8%E5%AE%98%E6%96%B9-YAML-%E9%83%A8%E7%BD%B2"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="验证部署">验证部署<a href="http://is.iceymoss.com/blog/18#%E9%AA%8C%E8%AF%81%E9%83%A8%E7%BD%B2"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查 Controller 状态&lt;/em>
kubectl get pods -n ingress-nginx

&lt;em># 检查 IngressClass&lt;/em>
kubectl get ingressclass

&lt;em># 检查 Service&lt;/em>
kubectl get svc -n ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 Controller 状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 IngressClass</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingressclass</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 Service</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="步骤-2-创建-IngressClass-如未自动创建-">步骤 2：创建 IngressClass（如未自动创建）<a href="http://is.iceymoss.com/blog/18#%E6%AD%A5%E9%AA%A4-2-%E5%88%9B%E5%BB%BA-IngressClass-%E5%A6%82%E6%9C%AA%E8%87%AA%E5%8A%A8%E5%88%9B%E5%BB%BA-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IngressClass</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  controller</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="步骤-3-在各命名空间创建-Ingress-资源">步骤 3：在各命名空间创建 Ingress 资源<a href="http://is.iceymoss.com/blog/18#%E6%AD%A5%E9%AA%A4-3-%E5%9C%A8%E5%90%84%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%88%9B%E5%BB%BA-Ingress-%E8%B5%84%E6%BA%90"></a></h3>



<h4 class="wp-block-heading" id="a-api-命名空间示例">a-api 命名空间示例<a href="http://is.iceymoss.com/blog/18#a-api-%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E7%A4%BA%E4%BE%8B"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - a-api.example.com
    secretName: a-api-tls
  rules:
  - host: a-api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">rewrite</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">target</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ssl</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">redirect</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">true</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  tls</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> hosts</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    secretName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="b-api-命名空间示例">b-api 命名空间示例<a href="http://is.iceymoss.com/blog/18#b-api-%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E7%A4%BA%E4%BE%8B"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: b-api-ingress
  namespace: b-api
spec:
  ingressClassName: nginx
  rules:
  - host: b-api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: b-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="步骤-4-配置-TLS-证书-可选-">步骤 4：配置 TLS 证书（可选）<a href="http://is.iceymoss.com/blog/18#%E6%AD%A5%E9%AA%A4-4-%E9%85%8D%E7%BD%AE-TLS-%E8%AF%81%E4%B9%A6-%E5%8F%AF%E9%80%89-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 创建 TLS Secret&lt;/em>
apiVersion: v1
kind: Secret
metadata:
  name: a-api-tls
  namespace: a-api
type: kubernetes.io/tls
data:
  tls.crt: &lt;base64-encoded-cert>
  tls.key: &lt;base64-encoded-key>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建 TLS Secret</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Secret</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">type</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">data</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">crt</span><span style="color: #D8DEE9FF">: </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">base64-encoded-cert</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  tls.key: </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">base64-encoded-key</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="步骤-5-验证配置">步骤 5：验证配置<a href="http://is.iceymoss.com/blog/18#%E6%AD%A5%E9%AA%A4-5-%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查 Ingress 状态&lt;/em>
kubectl get ingress -A

&lt;em># 查看 Ingress 详情&lt;/em>
kubectl describe ingress a-api-ingress -n a-api

&lt;em># 测试访问&lt;/em>
curl -H "Host: a-api.example.com" http://&lt;ingress-ip>/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 Ingress 状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">A</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Ingress 详情</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 测试访问</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.example.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//&lt;ingress-ip&gt;/</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="最佳实践">最佳实践<a href="http://is.iceymoss.com/blog/18#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5"></a></h2>



<h3 class="wp-block-heading" id="--推荐做法">✅ 推荐做法<a href="http://is.iceymoss.com/blog/18#--%E6%8E%A8%E8%8D%90%E5%81%9A%E6%B3%95"></a></h3>



<h4 class="wp-block-heading" id="1--单一-Ingress-Controller">1. 单一 Ingress Controller<a href="http://is.iceymoss.com/blog/18#1--%E5%8D%95%E4%B8%80-Ingress-Controller"></a></h4>



<ul class="wp-block-list">
<li>一个集群部署一个 Ingress Controller（多副本高可用）</li>



<li>所有命名空间共享同一个 Controller</li>



<li>节省资源，便于管理</li>
</ul>



<h4 class="wp-block-heading" id="2--IngressClass-集群作用域">2. IngressClass 集群作用域<a href="http://is.iceymoss.com/blog/18#2--IngressClass-%E9%9B%86%E7%BE%A4%E4%BD%9C%E7%94%A8%E5%9F%9F"></a></h4>



<ul class="wp-block-list">
<li>使用集群作用域的 IngressClass</li>



<li>所有命名空间可以引用</li>



<li>统一管理，避免混乱</li>
</ul>



<h4 class="wp-block-heading" id="3--命名空间隔离">3. 命名空间隔离<a href="http://is.iceymoss.com/blog/18#3--%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E9%9A%94%E7%A6%BB"></a></h4>



<ul class="wp-block-list">
<li>每个业务命名空间管理自己的 Ingress 资源</li>



<li>通过 RBAC 限制权限</li>



<li>实现职责分离</li>
</ul>



<h4 class="wp-block-heading" id="4--域名规划">4. 域名规划<a href="http://is.iceymoss.com/blog/18#4--%E5%9F%9F%E5%90%8D%E8%A7%84%E5%88%92"></a></h4>



<p class="wp-block-paragraph"><strong>方案 A：子域名</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>a-api.example.com
b-api.example.com
c-api.example.com
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9">c</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>方案 B：路径路由</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>example.com/a-api
example.com/b-api
example.com/c-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">c</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="5--RBAC-控制">5. RBAC 控制<a href="http://is.iceymoss.com/blog/18#5--RBAC-%E6%8E%A7%E5%88%B6"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 限制命名空间只能管理自己的 Ingress&lt;/em>
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ingress-manager
  namespace: a-api
rules:
- apiGroups: &#91;"networking.k8s.io"&#93;
  resources: &#91;"ingresses"&#93;
  verbs: &#91;"get", "list", "watch", "create", "update", "patch", "delete"&#93;
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ingress-manager
  namespace: a-api
subjects:
- kind: ServiceAccount
  name: app-deployer
  namespace: a-api
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-manager
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 限制命名空间只能管理自己的 Ingress</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Role</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> apiGroups</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">networking.k8s.io</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  resources</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingresses</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  verbs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">get</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">list</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">watch</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">create</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">update</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">patch</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">delete</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #81A1C1">---</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RoleBinding</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">subjects</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ServiceAccount</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployer</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">roleRef</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  apiGroup</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span></span>
<span class="line"><span style="color: #D8DEE9FF">  kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Role</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="6--监控告警">6. 监控告警<a href="http://is.iceymoss.com/blog/18#6--%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6"></a></h4>



<ul class="wp-block-list">
<li>监控 Ingress Controller 的 Pod 状态</li>



<li>监控 Nginx 错误日志</li>



<li>监控 Ingress 资源状态</li>



<li>设置告警规则</li>
</ul>



<h4 class="wp-block-heading" id="7--资源限制">7. 资源限制<a href="http://is.iceymoss.com/blog/18#7--%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-nginx-controller
spec:
  template:
    spec:
      containers:
      - name: controller
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
          limits:
            cpu: 1000m
            memory: 512Mi
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deployment</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      containers</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">        resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          requests</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            cpu</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 100</span><span style="color: #D8DEE9">m</span></span>
<span class="line"><span style="color: #D8DEE9FF">            memory</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 90</span><span style="color: #D8DEE9">Mi</span></span>
<span class="line"><span style="color: #D8DEE9FF">          limits</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            cpu</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 1000</span><span style="color: #D8DEE9">m</span></span>
<span class="line"><span style="color: #D8DEE9FF">            memory</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 512</span><span style="color: #D8DEE9">Mi</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="8--配置优化">8. 配置优化<a href="http://is.iceymoss.com/blog/18#8--%E9%85%8D%E7%BD%AE%E4%BC%98%E5%8C%96"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># ConfigMap 配置&lt;/em>
apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  &lt;em># 工作进程数&lt;/em>
  worker-processes: "4"
  &lt;em># 最大连接数&lt;/em>
  max-worker-connections: "16384"
  &lt;em># 启用 gzip&lt;/em>
  enable-gzip: "true"
  &lt;em># 日志格式&lt;/em>
  log-format-upstream: |
    $remote_addr - $remote_user &#91;$time_local&#93; "$request" 
    $status $body_bytes_sent "$http_referer" 
    "$http_user_agent" $request_length $request_time 
    &#91;$proxy_upstream_name&#93; &#91;$proxy_alternative_upstream_name&#93; 
    $upstream_addr $upstream_response_length 
    $upstream_response_time $upstream_status 
    $req_id
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ConfigMap 配置</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ConfigMap</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">data</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 工作进程数</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">worker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">processes</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">4</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 最大连接数</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">max</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">worker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">connections</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">16384</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 启用 gzip</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">enable</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">gzip</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">true</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 日志格式</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">log</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">format</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">upstream</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$remote_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$remote_user</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">$time_local</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">$request</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$status</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$body_bytes_sent</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">$http_referer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">$http_user_agent</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$request_length</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$request_time</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    &#91;</span><span style="color: #D8DEE9">$proxy_upstream_name</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">$proxy_alternative_upstream_name</span><span style="color: #D8DEE9FF">&#93; </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$upstream_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$upstream_response_length</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$upstream_response_time</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$upstream_status</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$req_id</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="--不推荐做法">❌ 不推荐做法<a href="http://is.iceymoss.com/blog/18#--%E4%B8%8D%E6%8E%A8%E8%8D%90%E5%81%9A%E6%B3%95"></a></h3>



<ol class="wp-block-list">
<li><strong>每个命名空间部署独立的 Controller</strong>
<ul class="wp-block-list">
<li>资源浪费</li>



<li>管理复杂</li>



<li>成本增加</li>
</ul>
</li>



<li><strong>使用命名空间作用域的 IngressClass</strong>
<ul class="wp-block-list">
<li>除非有特殊隔离需求</li>



<li>一般场景不推荐</li>
</ul>
</li>



<li><strong>在 Ingress 中硬编码 IP</strong>
<ul class="wp-block-list">
<li>使用 Service 名称</li>



<li>利用服务发现</li>
</ul>
</li>



<li><strong>忽略 TLS 配置</strong>
<ul class="wp-block-list">
<li>生产环境必须启用 HTTPS</li>



<li>使用 Let&#8217;s Encrypt 自动证书</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="常见问题与解决方案">常见问题与解决方案<a href="http://is.iceymoss.com/blog/18#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"></a></h2>



<h3 class="wp-block-heading" id="Q1--Controller-无法发现其他命名空间的-Ingress-">Q1: Controller 无法发现其他命名空间的 Ingress？<a href="http://is.iceymoss.com/blog/18#Q1--Controller-%E6%97%A0%E6%B3%95%E5%8F%91%E7%8E%B0%E5%85%B6%E4%BB%96%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E7%9A%84-Ingress-"></a></h3>



<p class="wp-block-paragraph"><strong>原因</strong>：</p>



<ul class="wp-block-list">
<li>RBAC 权限不足</li>



<li>IngressClass 不匹配</li>
</ul>



<p class="wp-block-paragraph"><strong>解决方案</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查 RBAC&lt;/em>
kubectl get clusterrole ingress-nginx -o yaml
kubectl get clusterrolebinding ingress-nginx -o yaml

&lt;em># 检查 IngressClass&lt;/em>
kubectl get ingressclass
kubectl describe ingress &lt;ingress-name> -n &lt;namespace>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 RBAC</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clusterrole</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clusterrolebinding</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查 IngressClass</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingressclass</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="Q2--如何实现蓝绿部署-">Q2: 如何实现蓝绿部署？<a href="http://is.iceymoss.com/blog/18#Q2--%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%93%9D%E7%BB%BF%E9%83%A8%E7%BD%B2-"></a></h3>



<p class="wp-block-paragraph">使用 Ingress 注解：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"  &lt;em># 10% 流量&lt;/em>
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service-v2  &lt;em># 新版本&lt;/em>
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">canary</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">true</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">canary</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">weight</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">10</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #B48EAD">10</span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">流量</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v2</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">新版本</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="Q3--如何配置限流-">Q3: 如何配置限流？<a href="http://is.iceymoss.com/blog/18#Q3--%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E9%99%90%E6%B5%81-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "100"
    nginx.ingress.kubernetes.io/limit-connections: "10"
spec:
  ingressClassName: nginx
  &lt;em># ...&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">limit</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">rps</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">100</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">limit</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">connections</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">10</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ...</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="Q4--如何实现跨命名空间服务访问-">Q4: 如何实现跨命名空间服务访问？<a href="http://is.iceymoss.com/blog/18#Q4--%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%B7%A8%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%9C%8D%E5%8A%A1%E8%AE%BF%E9%97%AE-"></a></h3>



<p class="wp-block-paragraph">Ingress 可以引用其他命名空间的 Service（需要特殊配置）：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cross-ns-ingress
  namespace: a-api
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "b-api-service.b-api.svc.cluster.local"
spec:
  ingressClassName: nginx
  rules:
  - host: a-api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: b-api-service
            namespace: b-api  &lt;em># 跨命名空间&lt;/em>
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cross</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ns</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">upstream</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">vhost</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">b-api-service.b-api.svc.cluster.local</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">跨命名空间</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>注意</strong>：需要 Controller 有跨命名空间访问权限。</p>



<h3 class="wp-block-heading" id="Q5--如何查看-Nginx-配置-">Q5: 如何查看 Nginx 配置？<a href="http://is.iceymoss.com/blog/18#Q5--%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B-Nginx-%E9%85%8D%E7%BD%AE-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 进入 Controller Pod&lt;/em>
kubectl exec -it -n ingress-nginx &lt;controller-pod> -- /bin/sh

&lt;em># 查看生成的配置&lt;/em>
cat /etc/nginx/nginx.conf

&lt;em># 查看特定 upstream&lt;/em>
grep -A 10 "upstream_balancer" /etc/nginx/nginx.conf
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 进入 Controller Pod</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">it</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bin</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sh</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看生成的配置</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">conf</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看特定 upstream</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">A</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">upstream_balancer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">conf</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="GitOps-集成">GitOps 集成<a href="http://is.iceymoss.com/blog/18#GitOps-%E9%9B%86%E6%88%90"></a></h2>



<h3 class="wp-block-heading" id="目录结构">目录结构<a href="http://is.iceymoss.com/blog/18#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ic2-deploy-config/
├── ingress-controller/          # Ingress Controller 配置
│   ├── base/
│   │   ├── ingressclass.yaml
│   │   ├── deployment.yaml
│   │   └── kustomization.yaml
│   └── overlays/
│       ├── production/
│       └── staging/
├── apps/
│   ├── backend/
│   │   ├── a-api/
│   │   │   ├── base/
│   │   │   │   └── ingress.yaml  # 业务 Ingress
│   │   │   └── overlays/
│   │   └── b-api/
│   └── ...
└── argocd-bootstrap/
    └── ingress-controller/
        └── application.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ic2</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deploy</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">config</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">          # </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">配置</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   ├── </span><span style="color: #D8DEE9">base</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   ├── </span><span style="color: #D8DEE9">ingressclass</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   ├── </span><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   └── </span><span style="color: #D8DEE9">kustomization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   └── </span><span style="color: #D8DEE9">overlays</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│       ├── </span><span style="color: #D8DEE9">production</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│       └── </span><span style="color: #D8DEE9">staging</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   ├── </span><span style="color: #D8DEE9">backend</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   ├── </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   │   ├── </span><span style="color: #D8DEE9">base</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   │   │   └── </span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF">  # </span><span style="color: #D8DEE9">业务</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   │   └── </span><span style="color: #D8DEE9">overlays</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   │   └── </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">│   └── </span><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #D8DEE9FF">└── </span><span style="color: #D8DEE9">argocd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">bootstrap</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">    └── </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        └── </span><span style="color: #D8DEE9">application</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="ArgoCD-Application-示例">ArgoCD Application 示例<a href="http://is.iceymoss.com/blog/18#ArgoCD-Application-%E7%A4%BA%E4%BE%8B"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ingress-controller
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/ic2-deploy-config
    targetRevision: main
    path: ingress-controller/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: ingress-nginx
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">argoproj</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1alpha1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Application</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">argocd</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  project</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span></span>
<span class="line"><span style="color: #D8DEE9FF">  source</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    repoURL</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//github.com/your-org/ic2-deploy-config</span></span>
<span class="line"><span style="color: #D8DEE9FF">    targetRevision</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">main</span></span>
<span class="line"><span style="color: #D8DEE9FF">    path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">overlays</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">production</span></span>
<span class="line"><span style="color: #D8DEE9FF">  destination</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    server</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//kubernetes.default.svc</span></span>
<span class="line"><span style="color: #D8DEE9FF">    namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  syncPolicy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    automated</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      prune</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #D8DEE9FF">      selfHeal</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #D8DEE9FF">    syncOptions</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CreateNamespace</span><span style="color: #81A1C1">=true</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="业务-Ingress-管理">业务 Ingress 管理<a href="http://is.iceymoss.com/blog/18#%E4%B8%9A%E5%8A%A1-Ingress-%E7%AE%A1%E7%90%86"></a></h3>



<p class="wp-block-paragraph">每个业务应用在自己的目录下管理 Ingress：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># apps/backend/a-api/base/ingress.yaml&lt;/em>
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
spec:
  ingressClassName: nginx
  rules:
  - host: a-api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># apps/backend/a-api/base/ingress.yaml</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="环境差异化配置">环境差异化配置<a href="http://is.iceymoss.com/blog/18#%E7%8E%AF%E5%A2%83%E5%B7%AE%E5%BC%82%E5%8C%96%E9%85%8D%E7%BD%AE"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># apps/backend/a-api/overlays/production/ingress-patch.yaml&lt;/em>
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
spec:
  rules:
  - host: a-api.prod.example.com  &lt;em># 生产环境域名&lt;/em>
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># apps/backend/a-api/overlays/production/ingress-patch.yaml</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">prod</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">生产环境域名</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="总结">总结<a href="http://is.iceymoss.com/blog/18#%E6%80%BB%E7%BB%93"></a></h2>



<h3 class="wp-block-heading" id="核心要点">核心要点<a href="http://is.iceymoss.com/blog/18#%E6%A0%B8%E5%BF%83%E8%A6%81%E7%82%B9"></a></h3>



<ol class="wp-block-list">
<li><strong>一个集群级 Ingress Controller 处理所有命名空间的 Ingress</strong>
<ul class="wp-block-list">
<li>通过 ClusterRole 获得集群级权限</li>



<li>使用 Informer 监听所有命名空间</li>



<li>IngressClass 过滤匹配的 Ingress</li>
</ul>
</li>



<li><strong>IngressClass 使用集群作用域</strong>
<ul class="wp-block-list">
<li>所有命名空间共享</li>



<li>统一管理，避免混乱</li>
</ul>
</li>



<li><strong>各命名空间独立管理 Ingress 资源</strong>
<ul class="wp-block-list">
<li>职责分离</li>



<li>通过 RBAC 控制权限</li>
</ul>
</li>



<li><strong>GitOps 实践</strong>
<ul class="wp-block-list">
<li>Controller 配置放在基础设施仓库</li>



<li>业务 Ingress 随应用代码管理</li>



<li>使用 ArgoCD/Flux 自动化部署</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading" id="架构优势">架构优势<a href="http://is.iceymoss.com/blog/18#%E6%9E%B6%E6%9E%84%E4%BC%98%E5%8A%BF"></a></h3>



<ul class="wp-block-list">
<li>✅ <strong>资源高效</strong>：一个 Controller 服务所有应用</li>



<li>✅ <strong>管理简单</strong>：统一入口，集中管理</li>



<li>✅ <strong>成本优化</strong>：减少 LoadBalancer 数量</li>



<li>✅ <strong>灵活扩展</strong>：支持多 Controller 场景</li>



<li>✅ <strong>生产就绪</strong>：高可用、监控、告警</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="参考资源">参考资源<a href="http://is.iceymoss.com/blog/18#%E5%8F%82%E8%80%83%E8%B5%84%E6%BA%90"></a></h2>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Kubernetes Ingress 官方文档</a></li>



<li><a href="https://kubernetes.github.io/ingress-nginx/">Ingress-NGINX 官方文档</a></li>



<li><a href="https://github.com/kubernetes/ingress-nginx">Ingress-NGINX GitHub</a></li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class">IngressClass 文档</a></li>
</ul>
<p>The post <a href="https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e4%b8%8e%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97/">Kubernetes Ingress 架构设计与最佳实践指南</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e4%b8%8e%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes Ingress 架构验证实践文档</title>
		<link>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e9%aa%8c%e8%af%81%e5%ae%9e%e8%b7%b5%e6%96%87%e6%a1%a3/</link>
					<comments>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e9%aa%8c%e8%af%81%e5%ae%9e%e8%b7%b5%e6%96%87%e6%a1%a3/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Fri, 02 Jan 2026 00:00:15 +0000</pubDate>
				<category><![CDATA[K8S]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[k3s]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Minikube]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=2022</guid>

					<description><![CDATA[<p>概述 本文档记录了在低配置 Kubernetes 集群环境中，对 Ingress 架构设计进行完整技术验证（PoC）的详细过程。验证过程包括部署、配置、测试和流量追踪等全链路环节。 验证环境 准备工作：资源适配策略 副本数调整 将 Controller 副本数从 3 降为 1（Worker 节点内存紧张，跑 1 个足矣）。 Service 类型选择 如果你的 K8s 是自建的（裸金属/虚拟机）且没有配置 MetalLB，LoadBalancer 类型的 Service 会一直处于 Pending 状态。为了验证，我们将 Controller 的 Service 临时改为 NodePort，这样你可以直接通过&#160;节点IP:端口&#160;访问。 步骤 1：部署 Ingress Controller (轻量化) 我们使用 Helm 部署，但通过命令行参数覆盖默认配置，以适应微型集群。 1.1 添加 Helm 仓库 1.2 安装 Controller (适配参数) 请直接执行以下命令： 参数解释 1.3 验证 Controller [&#8230;]</p>
<p>The post <a href="https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e9%aa%8c%e8%af%81%e5%ae%9e%e8%b7%b5%e6%96%87%e6%a1%a3/">Kubernetes Ingress 架构验证实践文档</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="概述">概述<a href="http://is.iceymoss.com/blog/19#%E6%A6%82%E8%BF%B0"></a></h2>



<p class="wp-block-paragraph">本文档记录了在低配置 Kubernetes 集群环境中，对 Ingress 架构设计进行完整技术验证（PoC）的详细过程。验证过程包括部署、配置、测试和流量追踪等全链路环节。</p>



<h2 class="wp-block-heading" id="验证环境">验证环境<a href="http://is.iceymoss.com/blog/19#%E9%AA%8C%E8%AF%81%E7%8E%AF%E5%A2%83"></a></h2>



<ul class="wp-block-list">
<li><strong>Kubernetes 版本</strong>: v1.29.15</li>



<li><strong>集群节点</strong>:
<ul class="wp-block-list">
<li>k8s-master: 10.4.4.15 (Control Plane)</li>



<li>k8s-node1: 10.4.0.17 (Worker Node)</li>
</ul>
</li>



<li><strong>资源限制</strong>: Worker 节点内存紧张，需要轻量化部署</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="准备工作-资源适配策略">准备工作：资源适配策略<a href="http://is.iceymoss.com/blog/19#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C-%E8%B5%84%E6%BA%90%E9%80%82%E9%85%8D%E7%AD%96%E7%95%A5"></a></h2>



<h3 class="wp-block-heading" id="副本数调整">副本数调整<a href="http://is.iceymoss.com/blog/19#%E5%89%AF%E6%9C%AC%E6%95%B0%E8%B0%83%E6%95%B4"></a></h3>



<p class="wp-block-paragraph">将 Controller 副本数从 3 降为 1（Worker 节点内存紧张，跑 1 个足矣）。</p>



<h3 class="wp-block-heading" id="Service-类型选择">Service 类型选择<a href="http://is.iceymoss.com/blog/19#Service-%E7%B1%BB%E5%9E%8B%E9%80%89%E6%8B%A9"></a></h3>



<p class="wp-block-paragraph">如果你的 K8s 是自建的（裸金属/虚拟机）且没有配置 MetalLB，LoadBalancer 类型的 Service 会一直处于 Pending 状态。为了验证，我们将 Controller 的 Service 临时改为 NodePort，这样你可以直接通过&nbsp;<code>节点IP:端口</code>&nbsp;访问。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="步骤-1-部署-Ingress-Controller--轻量化-">步骤 1：部署 Ingress Controller (轻量化)<a href="http://is.iceymoss.com/blog/19#%E6%AD%A5%E9%AA%A4-1-%E9%83%A8%E7%BD%B2-Ingress-Controller--%E8%BD%BB%E9%87%8F%E5%8C%96-"></a></h2>



<p class="wp-block-paragraph">我们使用 Helm 部署，但通过命令行参数覆盖默认配置，以适应微型集群。</p>



<h3 class="wp-block-heading" id="1-1-添加-Helm-仓库">1.1 添加 Helm 仓库<a href="http://is.iceymoss.com/blog/19#1-1-%E6%B7%BB%E5%8A%A0-Helm-%E4%BB%93%E5%BA%93"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//kubernetes.github.io/ingress-nginx</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="1-2-安装-Controller--适配参数-">1.2 安装 Controller (适配参数)<a href="http://is.iceymoss.com/blog/19#1-2-%E5%AE%89%E8%A3%85-Controller--%E9%80%82%E9%85%8D%E5%8F%82%E6%95%B0-"></a></h3>



<p class="wp-block-paragraph">请直接执行以下命令：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.replicaCount=1 \
  --set controller.service.type=NodePort \
  --set controller.service.nodePorts.http=30080 \
  --set controller.resources.requests.cpu=100m \
  --set controller.resources.requests.memory=90Mi \
  --set controller.admissionWebhooks.enabled=false \
  --set controller.allowSnippetAnnotations=true
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--namespace</span><span style="color: #D8DEE9FF"> ingress-nginx \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --create-namespace \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">replicaCount=1 \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">type=NodePort \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">nodePorts</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">http=30080 \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">resources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">requests</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">cpu=100m \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">resources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">requests</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">memory=90Mi \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">admissionWebhooks</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">enabled=false \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">allowSnippetAnnotations=true</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="参数解释">参数解释<a href="http://is.iceymoss.com/blog/19#%E5%8F%82%E6%95%B0%E8%A7%A3%E9%87%8A"></a></h4>



<ul class="wp-block-list">
<li><strong>replicaCount=1</strong>: 节省资源</li>



<li><strong>type=NodePort</strong>: 确保在没有云负载均衡器的情况下也能访问</li>



<li><strong>nodePorts.http=30080</strong>: 固定端口，方便测试</li>



<li><strong>admissionWebhooks.enabled=false</strong>: 关闭准入校验 Webhook，避免在小集群因网络波动导致从 API Server 无法连接 Controller 而造成部署失败</li>



<li><strong>allowSnippetAnnotations=true</strong>: 允许使用 snippet 注解（如需要）</li>
</ul>



<h3 class="wp-block-heading" id="1-3-验证-Controller-启动">1.3 验证 Controller 启动<a href="http://is.iceymoss.com/blog/19#1-3-%E9%AA%8C%E8%AF%81-Controller-%E5%90%AF%E5%8A%A8"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pods -n ingress-nginx
&lt;em># 等待状态变为 Running (1/1)&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 等待状态变为 Running (1/1)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-744f64bf78-x8tl6   1/1     Running   0          27s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                        </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">744</span><span style="color: #D8DEE9">f64bf78</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">x8tl6</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          27</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="步骤-2-模拟业务服务--Backend-">步骤 2：模拟业务服务 (Backend)<a href="http://is.iceymoss.com/blog/19#%E6%AD%A5%E9%AA%A4-2-%E6%A8%A1%E6%8B%9F%E4%B8%9A%E5%8A%A1%E6%9C%8D%E5%8A%A1--Backend-"></a></h2>



<p class="wp-block-paragraph">为了验证流程，我们在 a-api 命名空间部署一个简单的 Nginx 服务作为后端。</p>



<h3 class="wp-block-heading" id="2-1-创建命名空间">2.1 创建命名空间<a href="http://is.iceymoss.com/blog/19#2-1-%E5%88%9B%E5%BB%BA%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create ns a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="2-2-部署业务应用--Deployment-">2.2 部署业务应用 (Deployment)<a href="http://is.iceymoss.com/blog/19#2-2-%E9%83%A8%E7%BD%B2%E4%B8%9A%E5%8A%A1%E5%BA%94%E7%94%A8--Deployment-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create deployment a-api-demo --image=nginx:alpine --replicas=1 -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">nginx</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">replicas</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="2-3-暴露服务--Service-">2.3 暴露服务 (Service)<a href="http://is.iceymoss.com/blog/19#2-3-%E6%9A%B4%E9%9C%B2%E6%9C%8D%E5%8A%A1--Service-"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl expose deployment a-api-demo --name=a-api-service --port=80 --target-port=80 -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="2-4-验证业务运行">2.4 验证业务运行<a href="http://is.iceymoss.com/blog/19#2-4-%E9%AA%8C%E8%AF%81%E4%B8%9A%E5%8A%A1%E8%BF%90%E8%A1%8C"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pod,svc -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                            READY   STATUS    RESTARTS   AGE
pod/a-api-demo-575dc6578b-dkprf   1/1     Running   0          45m

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/a-api-service   ClusterIP   10.104.181.16   &lt;none>        80/TCP    45m
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                            </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">pod</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">575</span><span style="color: #D8DEE9">dc6578b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dkprf</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          45</span><span style="color: #D8DEE9">m</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ClusterIP</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.104</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">181.16</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">    45</span><span style="color: #D8DEE9">m</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="步骤-3-应用-Ingress-规则">步骤 3：应用 Ingress 规则<a href="http://is.iceymoss.com/blog/19#%E6%AD%A5%E9%AA%A4-3-%E5%BA%94%E7%94%A8-Ingress-%E8%A7%84%E5%88%99"></a></h2>



<p class="wp-block-paragraph">这里我们直接应用设计文档中的逻辑，创建一个指向 a-api 的 Ingress 资源。</p>



<h3 class="wp-block-heading" id="3-1-创建-Ingress-YAML-文件">3.1 创建 Ingress YAML 文件<a href="http://is.iceymoss.com/blog/19#3-1-%E5%88%9B%E5%BB%BA-Ingress-YAML-%E6%96%87%E4%BB%B6"></a></h3>



<p class="wp-block-paragraph">创建文件&nbsp;<code>ingress-v129.yaml</code>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
spec:
  ingressClassName: nginx  &lt;em># 对应我们安装的 ingress-nginx&lt;/em>
  rules:
  - host: a-api.test.com   &lt;em># 测试域名&lt;/em>
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">对应我们安装的</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">测试域名</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-2-应用配置">3.2 应用配置<a href="http://is.iceymoss.com/blog/19#3-2-%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl apply -f ingress-v129.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v129</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-3-检查-Ingress-状态">3.3 检查 Ingress 状态<a href="http://is.iceymoss.com/blog/19#3-3-%E6%A3%80%E6%9F%A5-Ingress-%E7%8A%B6%E6%80%81"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get ingress -n a-api
&lt;em># ADDRESS 列如果出现 IP (通常是 NodeIP) 说明 Controller 已经成功识别并注入了状态&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ADDRESS 列如果出现 IP (通常是 NodeIP) 说明 Controller 已经成功识别并注入了状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            CLASS   HOSTS             ADDRESS   PORTS   AGE
a-api-ingress   nginx   a-api.test.com              80      7s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">CLASS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">HOSTS</span><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">ADDRESS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">PORTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span><span style="color: #D8DEE9FF">              </span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">      7</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="步骤-4-全链路技术验证">步骤 4：全链路技术验证<a href="http://is.iceymoss.com/blog/19#%E6%AD%A5%E9%AA%A4-4-%E5%85%A8%E9%93%BE%E8%B7%AF%E6%8A%80%E6%9C%AF%E9%AA%8C%E8%AF%81"></a></h2>



<p class="wp-block-paragraph">现在通过&#8221;外部&#8221;请求来验证整个链路：<strong>流量路径：curl -&gt; NodePort(30080) -&gt; Ingress Controller -&gt; a-api-service -&gt; Pod</strong></p>



<p class="wp-block-paragraph">由于我们没有配置真实的 DNS 解析，我们需要通过 curl 的&nbsp;<code>-H</code>&nbsp;参数伪造 Host 头。</p>



<p class="wp-block-paragraph">请在你的 Master 节点或任何能 ping 通集群节点的机器上执行：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 假设你的 Worker 节点 IP 是 192.168.1.x (请替换为真实IP)&lt;/em>
&lt;em># 如果不知道 IP，用 kubectl get nodes -o wide 查看 INTERNAL-IP&lt;/em>
&lt;em># 发送测试请求&lt;/em>
curl -v -H "Host: a-api.test.com" http://&lt;你的Worker节点IP>:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 假设你的 Worker 节点 IP 是 192.168.1.x (请替换为真实IP)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 如果不知道 IP，用 kubectl get nodes -o wide 查看 INTERNAL-IP</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 发送测试请求</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//&lt;你的Worker节点IP&gt;:30080/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际执行</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get nodes -o wide
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">输出：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME         STATUS   ROLES           AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION     CONTAINER-RUNTIME
k8s-master   Ready    control-plane   2d19h  v1.29.15  10.4.4.15     &lt;none>        Ubuntu 24.04 LTS 6.8.0-71-generic   containerd://2.2.1
k8s-node1    Ready    &lt;none>          2d18h  v1.29.15  10.4.0.17     &lt;none>        Ubuntu 24.04 LTS 6.8.0-71-generic   containerd://2.2.1
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">         </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ROLES</span><span style="color: #D8DEE9FF">           </span><span style="color: #D8DEE9">AGE</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">VERSION</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">INTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">OS</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IMAGE</span><span style="color: #D8DEE9FF">         </span><span style="color: #D8DEE9">KERNEL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">VERSION</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">CONTAINER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">RUNTIME</span></span>
<span class="line"><span style="color: #D8DEE9">k8s</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">master</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Ready</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">   2</span><span style="color: #D8DEE9">d19h</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">29.15</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">4.15</span><span style="color: #D8DEE9FF">     </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">Ubuntu</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">24.04</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">LTS</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">6.8</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">71</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">generic</span><span style="color: #D8DEE9FF">   containerd</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//2.2.1</span></span>
<span class="line"><span style="color: #D8DEE9">k8s</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">node1</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">Ready</span><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">          2</span><span style="color: #D8DEE9">d18h</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">29.15</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">     </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">Ubuntu</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">24.04</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">LTS</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">6.8</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">71</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">generic</span><span style="color: #D8DEE9FF">   containerd</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//2.2.1</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v -H "Host: a-api.test.com" http://10.4.0.17:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期结果</strong>：</p>



<p class="wp-block-paragraph">你应该能看到 Nginx 的默认欢迎页 HTML 代码：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;!DOCTYPE html>
&lt;html>
&lt;head>
&lt;title>Welcome to nginx!&lt;/title>
&lt;style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
&lt;/style>
&lt;/head>
&lt;body>
&lt;h1>Welcome to nginx!&lt;/h1>
&lt;p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&lt;/p>

&lt;p>For online documentation and support please refer to
&lt;a href="http://nginx.org/">nginx.org&lt;/a>.&lt;br/>
Commercial support is available at
&lt;a href="http://nginx.com/">nginx.com&lt;/a>.&lt;/p>

&lt;p>&lt;em>Thank you for using nginx.&lt;/em>&lt;/p>
&lt;/body>
&lt;/html>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;!</span><span style="color: #D8DEE9">DOCTYPE</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">html</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;html&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;head&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;title&gt;</span><span style="color: #D8DEE9FF">Welcome to nginx!</span><span style="color: #81A1C1">&lt;/title&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;style&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">html </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">color</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">scheme</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">light</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dark</span><span style="color: #D8DEE9FF">; </span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">body </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">width</span><span style="color: #D8DEE9FF">: 35</span><span style="color: #D8DEE9">em</span><span style="color: #D8DEE9FF">; </span><span style="color: #D8DEE9">margin</span><span style="color: #D8DEE9FF">: </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">auto</span><span style="color: #D8DEE9FF">;</span></span>
<span class="line"><span style="color: #D8DEE9">font</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">family</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">Tahoma</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Verdana</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Arial</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sans</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">serif</span><span style="color: #D8DEE9FF">; </span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #81A1C1">&lt;/style&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;/head&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;body&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;h1&gt;</span><span style="color: #D8DEE9FF">Welcome to nginx!</span><span style="color: #81A1C1">&lt;/h1&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;p&gt;</span><span style="color: #D8DEE9FF">If you see this page, the nginx web server is successfully installed and</span></span>
<span class="line"><span style="color: #D8DEE9FF">working. Further configuration is required.</span><span style="color: #81A1C1">&lt;/p&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;p&gt;</span><span style="color: #D8DEE9FF">For online documentation and support please refer to</span></span>
<span class="line"><span style="color: #81A1C1">&lt;a</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">href</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://nginx.org/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">nginx.org</span><span style="color: #81A1C1">&lt;/a&gt;</span><span style="color: #D8DEE9FF">.</span><span style="color: #81A1C1">&lt;br/&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">Commercial support is available at</span></span>
<span class="line"><span style="color: #81A1C1">&lt;a</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">href</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://nginx.com/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">nginx.com</span><span style="color: #81A1C1">&lt;/a&gt;</span><span style="color: #D8DEE9FF">.</span><span style="color: #81A1C1">&lt;/p&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;p&gt;&lt;em&gt;</span><span style="color: #D8DEE9FF">Thank you for using nginx.</span><span style="color: #81A1C1">&lt;/em&gt;&lt;/p&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;/body&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;/html&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:30080...
* Connected to 10.4.0.17 (10.4.0.17) port 30080
> GET / HTTP/1.1
> Host: a-api.test.com
> User-Agent: curl/8.5.0
> Accept: */*

&lt; HTTP/1.1 200 OK
&lt; Date: Tue, 23 Dec 2025 03:27:48 GMT
&lt; Content-Type: text/html
&lt; Content-Length: 615
&lt; Connection: keep-alive
&lt; Last-Modified: Tue, 09 Dec 2025 19:41:33 GMT
&lt; ETag: "69387b6d-267"
&lt; Accept-Ranges: bytes

&lt;!DOCTYPE html>
&lt;html>
&lt;head>
&lt;title>Welcome to nginx!&lt;/title>
...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30080.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30080</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GET</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">User</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Agent</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">8.5</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Accept</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #616E88">/*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">&lt; HTTP/1.1 200 OK</span></span>
<span class="line"><span style="color: #616E88">&lt; Date: Tue, 23 Dec 2025 03:27:48 GMT</span></span>
<span class="line"><span style="color: #616E88">&lt; Content-Type: text/html</span></span>
<span class="line"><span style="color: #616E88">&lt; Content-Length: 615</span></span>
<span class="line"><span style="color: #616E88">&lt; Connection: keep-alive</span></span>
<span class="line"><span style="color: #616E88">&lt; Last-Modified: Tue, 09 Dec 2025 19:41:33 GMT</span></span>
<span class="line"><span style="color: #616E88">&lt; ETag: &quot;69387b6d-267&quot;</span></span>
<span class="line"><span style="color: #616E88">&lt; Accept-Ranges: bytes</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">&lt;!DOCTYPE html&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;html&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;head&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span></span>
<span class="line"><span style="color: #616E88">...</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>结论</strong>：如果看到了这个页面，恭喜你！你的 Ingress 设计流程已经跑通了。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="步骤-5-验证-路由隔离---可选-">步骤 5：验证&#8221;路由隔离&#8221; (可选)<a href="http://is.iceymoss.com/blog/19#%E6%AD%A5%E9%AA%A4-5-%E9%AA%8C%E8%AF%81-%E8%B7%AF%E7%94%B1%E9%9A%94%E7%A6%BB---%E5%8F%AF%E9%80%89-"></a></h2>



<p class="wp-block-paragraph">为了证明 Ingress 是根据域名路由的，你可以试着访问一个不存在的域名：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v -H "Host: b-api.test.com" http://&lt;你的Worker节点IP>:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: b-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//&lt;你的Worker节点IP&gt;:30080/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期结果</strong>：</p>



<p class="wp-block-paragraph">你应该看到 404 Not Found，且是由 nginx 返回的。这证明请求到了 Ingress Controller，但 Controller 发现没有匹配 b-api.test.com 的规则，所以拦截了。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="验证进阶-多命名空间---多服务---差异化响应">验证进阶：多命名空间 + 多服务 + 差异化响应<a href="http://is.iceymoss.com/blog/19#%E9%AA%8C%E8%AF%81%E8%BF%9B%E9%98%B6-%E5%A4%9A%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4---%E5%A4%9A%E6%9C%8D%E5%8A%A1---%E5%B7%AE%E5%BC%82%E5%8C%96%E5%93%8D%E5%BA%94"></a></h2>



<p class="wp-block-paragraph">既然你想要&#8221;多验证几个不一样的&#8221;，我们来做两个更有趣的实验，模拟真实的微服务场景：</p>



<ul class="wp-block-list">
<li><strong>场景 A (基于域名的路由)</strong>: 不同的域名 (b-api.test.com) 分发到另一个命名空间的不同服务</li>



<li><strong>场景 B (基于路径的路由)</strong>: 同一个域名，通过 /a 和 /b 分发给不同的业务</li>
</ul>



<p class="wp-block-paragraph">为了让你直观地看到区别，我们第二个服务不使用 Nginx，而是使用 Apache (httpd)。这样，服务 A 会返回 &#8220;Welcome to nginx&#8221;，服务 B 会返回 &#8220;It works!&#8221;，一眼就能看出区别。</p>



<h3 class="wp-block-heading" id="实验-1-部署-b-api--使用-Apache-">实验 1：部署 b-api (使用 Apache)<a href="http://is.iceymoss.com/blog/19#%E5%AE%9E%E9%AA%8C-1-%E9%83%A8%E7%BD%B2-b-api--%E4%BD%BF%E7%94%A8-Apache-"></a></h3>



<p class="wp-block-paragraph">我们模拟第二个业务团队 b-api。</p>



<h4 class="wp-block-heading" id="1-1-创建命名空间和服务">1.1 创建命名空间和服务<a href="http://is.iceymoss.com/blog/19#1-1-%E5%88%9B%E5%BB%BA%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%92%8C%E6%9C%8D%E5%8A%A1"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 创建命名空间&lt;/em>
kubectl create ns b-api

&lt;em># 部署 httpd (Apache)，它的默认首页是 "It works!"，和 Nginx 很容易区分&lt;/em>
&lt;em># 使用 alpine 版本以节省你宝贵的内存&lt;/em>
kubectl create deployment b-api-demo --image=httpd:alpine --replicas=1 -n b-api

&lt;em># 暴露服务&lt;/em>
kubectl expose deployment b-api-demo --name=b-api-service --port=80 --target-port=80 -n b-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 部署 httpd (Apache)，它的默认首页是 &quot;It works!&quot;，和 Nginx 很容易区分</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 使用 alpine 版本以节省你宝贵的内存</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">httpd</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">replicas</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 暴露服务</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="1-2-创建-b-api-的-Ingress-规则">1.2 创建 b-api 的 Ingress 规则<a href="http://is.iceymoss.com/blog/19#1-2-%E5%88%9B%E5%BB%BA-b-api-%E7%9A%84-Ingress-%E8%A7%84%E5%88%99"></a></h4>



<p class="wp-block-paragraph">我们创建一个新的 Ingress 资源，这次绑定域名 b-api.test.com。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat &lt;&lt;EOF > ingress-b-api.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: b-api-ingress
  namespace: b-api
spec:
  ingressClassName: nginx
  rules:
  - host: b-api.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: b-api-service
            port:
              number: 80
EOF

&lt;em># 应用配置&lt;/em>
kubectl apply -f ingress-b-api.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9">EOF</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 应用配置</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="1-3-验证差异化路由">1.3 验证差异化路由<a href="http://is.iceymoss.com/blog/19#1-3-%E9%AA%8C%E8%AF%81%E5%B7%AE%E5%BC%82%E5%8C%96%E8%B7%AF%E7%94%B1"></a></h4>



<p class="wp-block-paragraph">现在我们有了两个域名指向同一个 IP (你的 Worker 节点 10.4.0.17)。</p>



<p class="wp-block-paragraph"><strong>测试 A (旧服务)</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -H "Host: a-api.test.com" http://10.4.0.17:30080/ | grep "h1"
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/ | grep &quot;h1&quot;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期输出</strong>：<code>&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</code></p>



<p class="wp-block-paragraph"><strong>测试 B (新服务 &#8211; 跨命名空间)</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -H "Host: b-api.test.com" http://10.4.0.17:30080/ | grep "h1"
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: b-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/ | grep &quot;h1&quot;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期输出</strong>：<code>&lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;</code>&nbsp;(或者类似的 It works 字样)</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v -H "Host: b-api.test.com" http://10.4.0.17:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: b-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">输出：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:30080...
* Connected to 10.4.0.17 (10.4.0.17) port 30080
> GET / HTTP/1.1
> Host: b-api.test.com
> User-Agent: curl/8.5.0
> Accept: */*

&lt; HTTP/1.1 200 OK
&lt; Date: Tue, 23 Dec 2025 04:11:17 GMT
&lt; Content-Type: text/html
&lt; Content-Length: 191
&lt; Connection: keep-alive
&lt; Last-Modified: Fri, 07 Nov 2025 08:23:08 GMT
&lt; ETag: "bf-642fce432f300"
&lt; Accept-Ranges: bytes

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
&lt;html>
&lt;head>
&lt;title>It works! Apache httpd&lt;/title>
&lt;/head>
&lt;body>
&lt;p>It works!&lt;/p>
&lt;/body>
&lt;/html>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30080.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30080</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GET</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">User</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Agent</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">8.5</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Accept</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #616E88">/*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">&lt; HTTP/1.1 200 OK</span></span>
<span class="line"><span style="color: #616E88">&lt; Date: Tue, 23 Dec 2025 04:11:17 GMT</span></span>
<span class="line"><span style="color: #616E88">&lt; Content-Type: text/html</span></span>
<span class="line"><span style="color: #616E88">&lt; Content-Length: 191</span></span>
<span class="line"><span style="color: #616E88">&lt; Connection: keep-alive</span></span>
<span class="line"><span style="color: #616E88">&lt; Last-Modified: Fri, 07 Nov 2025 08:23:08 GMT</span></span>
<span class="line"><span style="color: #616E88">&lt; ETag: &quot;bf-642fce432f300&quot;</span></span>
<span class="line"><span style="color: #616E88">&lt; Accept-Ranges: bytes</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;html&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;head&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;title&gt;It works! Apache httpd&lt;/title&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;/head&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;body&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;p&gt;It works!&lt;/p&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;/body&gt;</span></span>
<span class="line"><span style="color: #616E88">&lt;/html&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>原理说明</strong>：Ingress Controller 根据 HTTP 请求头中的 Host 字段，自动将流量切换到了不同的 Namespace (a-api vs b-api) 和不同的 Backend Pod。</p>



<h3 class="wp-block-heading" id="实验-2-路径路由--Fanout----一个域名-多个后端">实验 2：路径路由 (Fanout) &#8211; 一个域名，多个后端<a href="http://is.iceymoss.com/blog/19#%E5%AE%9E%E9%AA%8C-2-%E8%B7%AF%E5%BE%84%E8%B7%AF%E7%94%B1--Fanout----%E4%B8%80%E4%B8%AA%E5%9F%9F%E5%90%8D-%E5%A4%9A%E4%B8%AA%E5%90%8E%E7%AB%AF"></a></h3>



<p class="wp-block-paragraph">这是企业中最常用的场景：example.com/api/v1 去一个服务，example.com/api/v2 去另一个。</p>



<p class="wp-block-paragraph">我们创建一个统一的入口文件&nbsp;<code>ingress-fanout.yaml</code>，放在 a-api 命名空间下（假设由统一网关组管理，或者使用 ExternalName Service 引用跨 NS 服务，这里为了简单，我们让它管理指向 a-api 的路径，同时演示路径匹配）。</p>



<p class="wp-block-paragraph">这里我们演示：</p>



<ul class="wp-block-list">
<li>访问 <code>all.test.com/a</code> -> 去 a-api</li>



<li>访问 <code>all.test.com/</code> -> 默认去 a-api (兜底)</li>
</ul>



<p class="wp-block-paragraph">(注：跨命名空间引用 Service 在标准 Ingress 中通常需要 Service 位于同 Namespace，或者使用 ExternalName。为了不把流程搞复杂，我们这里仅演示在 a-api 里的路径路由)</p>



<h4 class="wp-block-heading" id="2-1-创建路径路由-Ingress">2.1 创建路径路由 Ingress<a href="http://is.iceymoss.com/blog/19#2-1-%E5%88%9B%E5%BB%BA%E8%B7%AF%E5%BE%84%E8%B7%AF%E7%94%B1-Ingress"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat &lt;&lt;EOF > ingress-fanout.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-ingress
  namespace: a-api
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: all.test.com
    http:
      paths:
      # 访问 /foo 转给 a-api-service
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
      # 访问 /bar 也转给 a-api-service (实际场景通常是不同的service)
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
EOF

kubectl apply -f ingress-fanout.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9">EOF</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">fanout</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fanout</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">rewrite</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">target</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      # </span><span style="color: #D8DEE9">访问</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">foo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">转给</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">foo</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9FF">      # </span><span style="color: #D8DEE9">访问</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bar</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">也转给</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">service</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">实际场景通常是不同的service</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bar</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">fanout</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="2-2-验证-Rewrite-和路径">2.2 验证 Rewrite 和路径<a href="http://is.iceymoss.com/blog/19#2-2-%E9%AA%8C%E8%AF%81-Rewrite-%E5%92%8C%E8%B7%AF%E5%BE%84"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 访问 /foo&lt;/em>
curl -I -H "Host: all.test.com" http://10.4.0.17:30080/foo
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 访问 /foo</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">I</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: all.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/foo</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期</strong>：<code>HTTP/1.1 200 OK</code></p>



<p class="wp-block-paragraph">这里最关键的是&nbsp;<code>nginx.ingress.kubernetes.io/rewrite-target: /</code>&nbsp;这个注解。</p>



<p class="wp-block-paragraph">如果不加它，请求发给 Nginx Pod 的路径会是 /foo，但 Nginx 容器内部只有 / (index.html)，没有 /foo 目录，就会报 404。加了这个注解，Ingress 会把 /foo 剥离掉，只把 / 发给后端。</p>



<h3 class="wp-block-heading" id="实验-3-验证-HTTPS--自签名证书-">实验 3：验证 HTTPS (自签名证书)<a href="http://is.iceymoss.com/blog/19#%E5%AE%9E%E9%AA%8C-3-%E9%AA%8C%E8%AF%81-HTTPS--%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6-"></a></h3>



<p class="wp-block-paragraph">你的设计文档里提到了 SSL/TLS。虽然我们没有真证书，但可以生成一个自签名的来验证流程。</p>



<h4 class="wp-block-heading" id="3-1-生成自签名证书">3.1 生成自签名证书<a href="http://is.iceymoss.com/blog/19#3-1-%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt -subj "/CN=secure.test.com"

&lt;em># 创建 Secret&lt;/em>
kubectl create secret tls secure-tls --key tls.key --cert tls.crt -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">openssl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">req</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">x509</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">days</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">365</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">newkey</span><span style="color: #D8DEE9FF"> rsa</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">2048</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">keyout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">key</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">out</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">crt</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">subj</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/CN=secure.test.com</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建 Secret</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secret</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tls</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secure</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">key</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">key</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">cert</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">crt</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="3-2-创建-HTTPS-Ingress">3.2 创建 HTTPS Ingress<a href="http://is.iceymoss.com/blog/19#3-2-%E5%88%9B%E5%BB%BA-HTTPS-Ingress"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat &lt;&lt;EOF > ingress-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
  namespace: a-api
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - secure.test.com
    secretName: secure-tls
  rules:
  - host: secure.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
EOF

kubectl apply -f ingress-tls.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9">EOF</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secure</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  tls</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> hosts</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secure</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    secretName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secure</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">secure</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="3-3-验证-HTTPS">3.3 验证 HTTPS<a href="http://is.iceymoss.com/blog/19#3-3-%E9%AA%8C%E8%AF%81-HTTPS"></a></h4>



<p class="wp-block-paragraph">你需要获取 HTTPS 的 NodePort 端口（不是 30080 了，是随机的，除非我们之前固定了）。</p>



<p class="wp-block-paragraph">让我们查一下 HTTPS 的端口：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get svc -n ingress-nginx ingress-nginx-controller
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">看 443: 后面映射的端口是多少（比如 32443）。</p>



<p class="wp-block-paragraph">然后测试（加上&nbsp;<code>-k</code>&nbsp;忽略证书警告，因为是自签名的）：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 假设端口是 3xxxx&lt;/em>
export HTTPS_PORT=$(kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.spec.ports&#91;1&#93;.nodePort}')

curl -v -k -H "Host: secure.test.com" https://10.4.0.17:$HTTPS_PORT/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 假设端口是 3xxxx</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTPS_PORT</span><span style="color: #81A1C1">=</span><span style="color: #88C0D0">$</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jsonpath</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{.spec.ports&#91;1&#93;.nodePort}</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: secure.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:$HTTPS_PORT/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">如果看到&nbsp;<code>SSL connection using ...</code>&nbsp;和&nbsp;<code>Welcome to nginx!</code>，说明 TLS 终止（Offloading）成功了！</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v -k -H "Host: secure.test.com" https://10.4.0.17:$HTTPS_PORT/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: secure.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:$HTTPS_PORT/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">输出显示：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:32443...
* Connected to 10.4.0.17 (10.4.0.17) port 32443
...
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
...
&lt; HTTP/2 200
...
&lt;!DOCTYPE html>
&lt;html>
&lt;head>
&lt;title>Welcome to nginx!&lt;/title>
...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">32443.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32443</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SSL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connection</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">using</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TLSv1</span><span style="color: #D8DEE9FF">.3 / TLS_AES_256_GCM_SHA384</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;!</span><span style="color: #D8DEE9">DOCTYPE</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">html</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;html&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;head&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;title&gt;</span><span style="color: #D8DEE9FF">Welcome to nginx!</span><span style="color: #81A1C1">&lt;/title&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">...</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="流量流转验证-三种方法">流量流转验证：三种方法<a href="http://is.iceymoss.com/blog/19#%E6%B5%81%E9%87%8F%E6%B5%81%E8%BD%AC%E9%AA%8C%E8%AF%81-%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95"></a></h2>



<p class="wp-block-paragraph">要证明流量确实是&nbsp;<code>Client -&gt; Ingress Controller -&gt; Service -&gt; Pod</code>&nbsp;这样流转的，而不是直接撞上了 Pod 或者 Service，我们有三种&#8221;铁证&#8221;可以验证。</p>



<h3 class="wp-block-heading" id="方法一-查看-Ingress-Controller-的实时访问日志-最直接的证据-">方法一：查看 Ingress Controller 的实时访问日志（最直接的证据）<a href="http://is.iceymoss.com/blog/19#%E6%96%B9%E6%B3%95%E4%B8%80-%E6%9F%A5%E7%9C%8B-Ingress-Controller-%E7%9A%84%E5%AE%9E%E6%97%B6%E8%AE%BF%E9%97%AE%E6%97%A5%E5%BF%97-%E6%9C%80%E7%9B%B4%E6%8E%A5%E7%9A%84%E8%AF%81%E6%8D%AE-"></a></h3>



<p class="wp-block-paragraph">Ingress Controller 本质上是一个反向代理（Nginx），它会记录每一条经过它的请求。如果日志里有记录，说明流量确实经过了它。</p>



<h4 class="wp-block-heading" id="1-1-打开一个终端窗口-实时监听-Controller-的日志">1.1 打开一个终端窗口，实时监听 Controller 的日志<a href="http://is.iceymoss.com/blog/19#1-1-%E6%89%93%E5%BC%80%E4%B8%80%E4%B8%AA%E7%BB%88%E7%AB%AF%E7%AA%97%E5%8F%A3-%E5%AE%9E%E6%97%B6%E7%9B%91%E5%90%AC-Controller-%E7%9A%84%E6%97%A5%E5%BF%97"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># -f 表示 follow (实时输出)，-n 指定命名空间&lt;/em>
kubectl logs -f -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># -f 表示 follow (实时输出)，-n 指定命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="1-2-在另一个窗口发送请求">1.2 在另一个窗口发送请求<a href="http://is.iceymoss.com/blog/19#1-2-%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%82"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -H "Host: a-api.test.com" http://10.4.0.17:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="1-3-回到日志窗口观察">1.3 回到日志窗口观察<a href="http://is.iceymoss.com/blog/19#1-3-%E5%9B%9E%E5%88%B0%E6%97%A5%E5%BF%97%E7%AA%97%E5%8F%A3%E8%A7%82%E5%AF%9F"></a></h4>



<p class="wp-block-paragraph">你应该能看到类似下面的一行日志立即滚动出来：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>10.4.0.17 - - &#91;23/Dec/2025:04:00:00 +0000&#93; "GET / HTTP/1.1" 200 615 "-" "curl/7.68.0" 86 0.002 &#91;a-api-a-api-service-80&#93; [] 10.1.2.3:80 615 0.002 200 ...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">00</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">00</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/7.68.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">86</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.002</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">10.1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">2.3</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.002</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>关键点分析</strong>：</p>



<ul class="wp-block-list">
<li><strong>Host</strong>: 如果你开启详细日志，会看到 a-api.test.com</li>



<li><strong>Upstream ([a-api-a-api-service-80])</strong>: 这证明 Controller 识别出了这是要去 a-api 命名空间的 a-api-service 服务</li>



<li><strong>Upstream IP (10.1.2.3:80)</strong>: 这里的 IP 必须是你后端业务 Pod 的 IP（见方法二）</li>
</ul>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>W1223 03:51:25.338445       7 controller.go:1469] Unexpected error validating SSL certificate "a-api/secure-tls" for server "secure.test.com": x509: certificate relies on legacy Common Name field, use SANs instead
W1223 03:51:25.338476       7 controller.go:1470] Validating certificate against DNS names. This will be deprecated in a future version
I1223 03:51:25.340746       7 controller.go:214] "Configuration changes detected, backend reload required"
I1223 03:51:25.390835       7 controller.go:228] "Backend successfully reloaded"
I1223 03:51:25.391624       7 event.go:377] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-744f64bf78-x8tl6", UID:"3b1af039-c49b-4f5d-8880-5a10b5f5d7e6", APIVersion:"v1", ResourceVersion:"460791", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
I1223 03:52:02.957678       7 status.go:311] "updating Ingress status" namespace="a-api" ingress="secure-ingress" currentValue=null newValue=&#91;{"ip":"10.104.181.16"}&#93;
I1223 03:52:02.962960       7 event.go:377] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"a-api", Name:"secure-ingress", UID:"3d83cbd8-361b-4265-9090-eab01250dbb1", APIVersion:"networking.k8s.io/v1", ResourceVersion:"464318", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
W1223 03:52:02.963441       7 controller.go:1469] Unexpected error validating SSL certificate "a-api/secure-tls" for server "secure.test.com": x509: certificate relies on legacy Common Name field, use SANs instead
W1223 03:52:02.963526       7 controller.go:1470] Validating certificate against DNS names. This will be deprecated in a future version
10.4.0.17 - - &#91;23/Dec/2025:03:52:28 +0000&#93; "GET / HTTP/2.0" 200 615 "-" "curl/8.5.0" 30 0.001 &#91;a-api-a-api-service-80&#93; [] 192.168.36.78:80 615 0.001 200 8cf46d801eed33a14953870e4cc826db
10.4.0.17 - - &#91;23/Dec/2025:04:07:13 +0000&#93; "GET / HTTP/1.1" 200 615 "-" "curl/8.5.0" 77 0.001 &#91;a-api-a-api-service-80&#93; [] 192.168.36.78:80 615 0.001 200 01ca7520fdb1071cf38873d9223db8fe
10.4.0.17 - - &#91;23/Dec/2025:04:08:18 +0000&#93; "GET / HTTP/2.0" 200 615 "-" "curl/8.5.0" 30 0.001 &#91;a-api-a-api-service-80&#93; [] 192.168.36.78:80 615 0.001 200 a698f1311f1ffd12b7bf30dbba93d21a
10.4.0.17 - - &#91;23/Dec/2025:04:08:47 +0000&#93; "GET / HTTP/1.1" 200 615 "-" "curl/8.5.0" 77 0.001 &#91;a-api-a-api-service-80&#93; [] 192.168.36.78:80 615 0.001 200 62b640eeb06e1da08812e54dc41c4cc5
10.4.0.17 - - &#91;23/Dec/2025:04:08:56 +0000&#93; "GET / HTTP/1.1" 200 191 "-" "curl/8.5.0" 77 0.001 &#91;b-api-b-api-service-80&#93; [] 192.168.36.79:80 191 0.000 200 11c6853707a5932ce643078b26718a37
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">W1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">51</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">25.338445</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">1469</span><span style="color: #D8DEE9FF">] </span><span style="color: #D8DEE9">Unexpected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">error</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">validating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SSL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a-api/secure-tls</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">secure.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: x509</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">relies</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">legacy</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Common</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">field</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">use</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SANs</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">instead</span></span>
<span class="line"><span style="color: #D8DEE9">W1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">51</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">25.338476</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">1470</span><span style="color: #D8DEE9FF">] </span><span style="color: #D8DEE9">Validating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">against</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DNS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">names</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">This</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">will</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">be</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deprecated</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">future</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">version</span></span>
<span class="line"><span style="color: #D8DEE9">I1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">51</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">25.340746</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">214</span><span style="color: #D8DEE9FF">] </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Configuration changes detected, backend reload required</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9">I1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">51</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">25.390835</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">228</span><span style="color: #D8DEE9FF">] </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Backend successfully reloaded</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9">I1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">51</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">25.391624</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">377</span><span style="color: #D8DEE9FF">] </span><span style="color: #88C0D0">Event</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ObjectReference</span><span style="color: #ECEFF4">{</span><span style="color: #88C0D0">Kind</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Pod</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Namespace</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingress-nginx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Name</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingress-nginx-controller-744f64bf78-x8tl6</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">UID</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3b1af039-c49b-4f5d-8880-5a10b5f5d7e6</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">APIVersion</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">v1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ResourceVersion</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">460791</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FieldPath</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">): type</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> reason</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">RELOAD</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NGINX</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reload</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">triggered</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">due</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">change</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configuration</span></span>
<span class="line"><span style="color: #D8DEE9">I1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">52</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">02</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">957678</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">status</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">311</span><span style="color: #D8DEE9FF">] </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">updating Ingress status</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a-api</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">secure-ingress</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">currentValue</span><span style="color: #81A1C1">=null</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">newValue</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ip</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">10.104.181.16</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9">I1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">52</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">02</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">962960</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">377</span><span style="color: #D8DEE9FF">] </span><span style="color: #88C0D0">Event</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ObjectReference</span><span style="color: #ECEFF4">{</span><span style="color: #88C0D0">Kind</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Ingress</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Namespace</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a-api</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Name</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">secure-ingress</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">UID</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3d83cbd8-361b-4265-9090-eab01250dbb1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">APIVersion</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">networking.k8s.io/v1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ResourceVersion</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">464318</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FieldPath</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">): type</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> reason</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Sync</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Scheduled</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sync</span></span>
<span class="line"><span style="color: #D8DEE9">W1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">52</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">02</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">963441</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">1469</span><span style="color: #D8DEE9FF">] </span><span style="color: #D8DEE9">Unexpected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">error</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">validating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SSL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a-api/secure-tls</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">secure.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: x509</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">relies</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">legacy</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Common</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">field</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">use</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SANs</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">instead</span></span>
<span class="line"><span style="color: #D8DEE9">W1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">52</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">02</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">963526</span><span style="color: #D8DEE9FF">       </span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">1470</span><span style="color: #D8DEE9FF">] </span><span style="color: #D8DEE9">Validating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">against</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DNS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">names</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">This</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">will</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">be</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deprecated</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">future</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">version</span></span>
<span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">52</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">28</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/2.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/8.5.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> 8</span><span style="color: #D8DEE9">cf46d801eed33a14953870e4cc826db</span></span>
<span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">07</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">13</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/8.5.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">77</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> 01</span><span style="color: #D8DEE9">ca7520fdb1071cf38873d9223db8fe</span></span>
<span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/2.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/8.5.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a698f1311f1ffd12b7bf30dbba93d21a</span></span>
<span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">47</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/8.5.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">77</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">615</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> 62</span><span style="color: #D8DEE9">b640eeb06e1da08812e54dc41c4cc5</span></span>
<span class="line"><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">56</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">curl/8.5.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">77</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.001</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.79</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.000</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> 11</span><span style="color: #D8DEE9">c6853707a5932ce643078b26718a37</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>关键日志分析</strong>：</p>



<ul class="wp-block-list">
<li><code>[a-api-a-api-service-80] [] 192.168.36.78:80</code>: Controller 识别出这是要去 a-api 命名空间的 a-api-service 服务，目标 Pod IP 是 192.168.36.78</li>



<li><code>[b-api-b-api-service-80] [] 192.168.36.79:80</code>: Controller 识别出这是要去 b-api 命名空间的 b-api-service 服务，目标 Pod IP 是 192.168.36.79</li>
</ul>



<h3 class="wp-block-heading" id="方法二-验证-IP-对应关系-数据链路证据-">方法二：验证 IP 对应关系（数据链路证据）<a href="http://is.iceymoss.com/blog/19#%E6%96%B9%E6%B3%95%E4%BA%8C-%E9%AA%8C%E8%AF%81-IP-%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E8%AF%81%E6%8D%AE-"></a></h3>



<p class="wp-block-paragraph">在你的 Dashboard 详情页中，有一个非常关键的信息：</p>



<p class="wp-block-paragraph"><strong>Endpoints: 10.104.181.16</strong></p>



<p class="wp-block-paragraph">这个 IP 地址是 Ingress Controller 经过计算后，认为&#8221;流量应该发往的目标地址&#8221;。我们需要确认这个 IP 到底是谁。</p>



<p class="wp-block-paragraph">请执行以下命令：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pods -n a-api -o wide
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期结果</strong>：</p>



<p class="wp-block-paragraph">你应该会发现&nbsp;<code>a-api-demo-xxxxx</code>&nbsp;这个 Pod 的 IP 正是 192.168.36.78（或类似的 Pod IP）。</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                            READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
a-api-demo-575dc6578b-dkprf   1/1     Running   0          45m   192.168.36.78   k8s-node1   &lt;none>           &lt;none>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                            </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">NODE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">NOMINATED</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NODE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">READINESS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GATES</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">575</span><span style="color: #D8DEE9">dc6578b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dkprf</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          45</span><span style="color: #D8DEE9">m</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">k8s</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">node1</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">           </span><span style="color: #81A1C1">&lt;none&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>结论</strong>：</p>



<ul class="wp-block-list">
<li>Ingress 既然显示了 Endpoint 是 192.168.36.78，说明它已经通过 Service 找到了具体的 Pod</li>



<li>如果流量不经过 Ingress，Ingress Controller 根本不需要知道这个 Endpoint 是多少</li>
</ul>



<h3 class="wp-block-heading" id="方法三-Header-响应头和-Pod-日志-露马脚--针对-b-api-">方法三：Header 响应头和 Pod 日志&#8221;露马脚&#8221;（针对 b-api）<a href="http://is.iceymoss.com/blog/19#%E6%96%B9%E6%B3%95%E4%B8%89-Header-%E5%93%8D%E5%BA%94%E5%A4%B4%E5%92%8C-Pod-%E6%97%A5%E5%BF%97-%E9%9C%B2%E9%A9%AC%E8%84%9A--%E9%92%88%E5%AF%B9-b-api-"></a></h3>



<p class="wp-block-paragraph">这个方法利用了你刚才部署的 Apache (b-api) 和 Nginx (Ingress Controller) 的特性差异。</p>



<ul class="wp-block-list">
<li>你的后端 b-api 是 Apache (httpd)</li>



<li>你的网关 ingress-nginx 是 Nginx</li>
</ul>



<p class="wp-block-paragraph">如果你直接访问 Apache，响应头里的 Server 应该是 Apache/2.4.x。</p>



<p class="wp-block-paragraph">但如果经过了 Ingress，Nginx 通常会把 Server 头改写或者保留。</p>



<p class="wp-block-paragraph">让我们测试一下：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v -H "Host: b-api.test.com" http://10.4.0.17:30080/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: b-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>观察输出中的&nbsp;<code>&lt; Server:</code>&nbsp;字段</strong>：</p>



<ul class="wp-block-list">
<li>如果看到 <code>Server: nginx/1.x.x</code>，这不仅证明了请求成功，还证明了是 Nginx（Ingress Controller）在回复你，它作为代理人把 Apache 的内容拿回来给了你</li>



<li>有些配置下可能会显示 <code>Server: Apache</code>，但在 Header 里通常会多出一个 <code>X-Real-IP</code> 或者 <code>X-Forwarded-For</code>，这是反向代理注入的特征</li>
</ul>



<p class="wp-block-paragraph">你可以进到 b-api 的 Pod 里看 Apache 的访问日志，会发现来源 IP 不是你发送 curl 的机器 IP，而是 Ingress Controller Pod 的 IP。</p>



<p class="wp-block-paragraph"><strong>验证命令</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 1. 获取 Ingress Controller Pod IP&lt;/em>
kubectl get pods -n ingress-nginx -o wide
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 1. 获取 Ingress Controller Pod IP</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">输出：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                                        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
ingress-nginx-controller-744f64bf78-x8tl6   1/1     Running   0          50m   192.168.36.77   k8s-node1   &lt;none>           &lt;none>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                        </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">NODE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">NOMINATED</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NODE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">READINESS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GATES</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">744</span><span style="color: #D8DEE9">f64bf78</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">x8tl6</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          50</span><span style="color: #D8DEE9">m</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">k8s</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">node1</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">           </span><span style="color: #81A1C1">&lt;none&gt;</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 2. 查看 b-api 的日志&lt;/em>
kubectl logs -n b-api -l app=b-api-demo
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 2. 查看 b-api 的日志</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.36.79. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.36.79. Set the 'ServerName' directive globally to suppress this message
&#91;Tue Dec 23 03:46:08.238030 2025&#93; &#91;mpm_event:notice&#93; &#91;pid 1:tid 1&#93; AH00489: Apache/2.4.66 (Unix) configured -- resuming normal operations
&#91;Tue Dec 23 03:46:08.238109 2025&#93; &#91;core:notice&#93; &#91;pid 1:tid 1&#93; AH00094: Command line: 'httpd -D FOREGROUND'
192.168.36.77 - - &#91;23/Dec/2025:03:47:23 +0000&#93; "GET / HTTP/1.1" 200 191
192.168.36.77 - - &#91;23/Dec/2025:03:47:45 +0000&#93; "GET / HTTP/1.1" 200 191
192.168.36.77 - - &#91;23/Dec/2025:04:08:56 +0000&#93; "GET / HTTP/1.1" 200 191
192.168.36.77 - - &#91;23/Dec/2025:04:11:17 +0000&#93; "GET / HTTP/1.1" 200 191
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">AH00558</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> httpd</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Could</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reliably</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">determine</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">the</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">s fully qualified domain name, using 192.168.36.79. Set the </span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9">ServerName</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C"> directive globally to suppress this messag</span><span style="color: #D8DEE9">e</span></span>
<span class="line"><span style="color: #D8DEE9FF">AH00558</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> httpd</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Could</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reliably</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">determine</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">the</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">s fully qualified domain name, using 192.168.36.79. Set the </span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9">ServerName</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C"> directive globally to suppress this messag</span><span style="color: #D8DEE9">e</span></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">Tue</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Dec</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">23</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">46</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08.238030</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">mpm_event</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">notice</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">pid</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">tid</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93; AH00489</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Apache</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">66</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">Unix</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">configured</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">resuming</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">normal</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">operations</span></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">Tue</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Dec</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">23</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">46</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08.238109</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">core</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">notice</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">pid</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">tid</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93; AH00094</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Command</span><span style="color: #D8DEE9FF"> line</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">httpd -D FOREGROUND</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">47</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">23</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span></span>
<span class="line"><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">03</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">47</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">45</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span></span>
<span class="line"><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">08</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">56</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span></span>
<span class="line"><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">11</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>关键发现</strong>：</p>



<ul class="wp-block-list">
<li>Apache 日志中显示的来源 IP 是 <code>192.168.36.77</code>，这正是 Ingress Controller Pod 的 IP（192.168.36.77）</li>



<li>这证明了流量不是从外面直接&#8221;偷渡&#8221;进来的，而是经过了 Controller 的代理</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="证据链闭环分析">证据链闭环分析<a href="http://is.iceymoss.com/blog/19#%E8%AF%81%E6%8D%AE%E9%93%BE%E9%97%AD%E7%8E%AF%E5%88%86%E6%9E%90"></a></h2>



<p class="wp-block-paragraph">我们提取出日志中的关键 IP 地址和角色：</p>



<h3 class="wp-block-heading" id="IP-地址映射表">IP 地址映射表<a href="http://is.iceymoss.com/blog/19#IP-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84%E8%A1%A8"></a></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>IP 地址</th><th>角色</th><th>来源</th></tr></thead><tbody><tr><td>192.168.36.77</td><td>Ingress Controller Pod</td><td><code>kubectl get pods -n ingress-nginx -o wide</code></td></tr><tr><td>192.168.36.78</td><td>a-api 业务 Pod</td><td><code>kubectl get pods -n a-api -o wide</code></td></tr><tr><td>192.168.36.79</td><td>b-api 业务 Pod</td><td>从 Controller 日志推断出</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="线索-1-Controller-找到了正确的人--向下看-">线索 1：Controller 找到了正确的人 (向下看)<a href="http://is.iceymoss.com/blog/19#%E7%BA%BF%E7%B4%A2-1-Controller-%E6%89%BE%E5%88%B0%E4%BA%86%E6%AD%A3%E7%A1%AE%E7%9A%84%E4%BA%BA--%E5%90%91%E4%B8%8B%E7%9C%8B-"></a></h3>



<p class="wp-block-paragraph">在验证 1 的 Controller 日志中，有这样一行：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;a-api-a-api-service-80&#93; [] 192.168.36.78:80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">&#93; [] </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>解读</strong>：Controller 说：&#8221;我收到了去 a-api 的请求，我查了 Service 发现目标是 192.168.36.78，我已经把货发过去了。&#8221;</p>



<p class="wp-block-paragraph"><strong>佐证</strong>：这就和验证 2 中 a-api Pod 的真实 IP (192.168.36.78) 完美吻合！</p>



<h3 class="wp-block-heading" id="线索-2-业务-Pod-看到了正确的人--向上看-">线索 2：业务 Pod 看到了正确的人 (向上看)<a href="http://is.iceymoss.com/blog/19#%E7%BA%BF%E7%B4%A2-2-%E4%B8%9A%E5%8A%A1-Pod-%E7%9C%8B%E5%88%B0%E4%BA%86%E6%AD%A3%E7%A1%AE%E7%9A%84%E4%BA%BA--%E5%90%91%E4%B8%8A%E7%9C%8B-"></a></h3>



<p class="wp-block-paragraph">在验证 3 的 b-api (Apache) 日志中，有这样一行：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>192.168.36.77 - - &#91;23/Dec/2025:04:11:17 +0000&#93; "GET / HTTP/1.1" 200 191
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #B48EAD">23</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Dec</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2025</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">04</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">11</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">17</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">0000</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET / HTTP/1.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">191</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>解读</strong>：Apache 说：&#8221;有个 IP 是 192.168.36.77 的家伙刚才访问了我。&#8221;</p>



<p class="wp-block-paragraph"><strong>佐证</strong>：这个 IP 正是验证 3 中 Ingress Controller 自己的 Pod IP (192.168.36.77)！这证明了流量不是从外面直接&#8221;偷渡&#8221;进来的，而是经过了 Controller 的代理。</p>



<h3 class="wp-block-heading" id="完整流量路径验证">完整流量路径验证<a href="http://is.iceymoss.com/blog/19#%E5%AE%8C%E6%95%B4%E6%B5%81%E9%87%8F%E8%B7%AF%E5%BE%84%E9%AA%8C%E8%AF%81"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>客户端 (10.4.0.17 或外部)
    ↓
NodePort Service (30080)
    ↓
Ingress Controller Pod (192.168.36.77)
    ↓ (根据 Host 头路由)
Service (a-api-service / b-api-service)
    ↓
业务 Pod (192.168.36.78 / 192.168.36.79)
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">客户端</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">或外部</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ↓</span></span>
<span class="line"><span style="color: #D8DEE9">NodePort</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Service</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">30080</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Pod</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.77</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ↓ (</span><span style="color: #D8DEE9">根据</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Host</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">头路由</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #88C0D0">Service</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ↓</span></span>
<span class="line"><span style="color: #D8DEE9">业务</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Pod</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.78</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">36.79</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="关于日志中的警告信息">关于日志中的警告信息<a href="http://is.iceymoss.com/blog/19#%E5%85%B3%E4%BA%8E%E6%97%A5%E5%BF%97%E4%B8%AD%E7%9A%84%E8%AD%A6%E5%91%8A%E4%BF%A1%E6%81%AF"></a></h2>



<p class="wp-block-paragraph">你可能注意到了验证 1 开头的警告：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>W1223 ... Unexpected error validating SSL certificate ... x509: certificate relies on legacy Common Name field, use SANs instead
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">W1223</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Unexpected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">error</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">validating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SSL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9FF"> x509</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">relies</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">legacy</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Common</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">field</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">use</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SANs</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">instead</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>不用担心，这是正常的。</strong></p>



<h3 class="wp-block-heading" id="原因">原因<a href="http://is.iceymoss.com/blog/19#%E5%8E%9F%E5%9B%A0"></a></h3>



<p class="wp-block-paragraph">我们用简单的&nbsp;<code>openssl</code>&nbsp;命令生成的自签名证书只使用了旧版的 CN (Common Name) 字段。现代的安全标准（如 Go 1.15+ 和 Chrome）要求使用 SANs (Subject Alternative Names)。</p>



<h3 class="wp-block-heading" id="影响">影响<a href="http://is.iceymoss.com/blog/19#%E5%BD%B1%E5%93%8D"></a></h3>



<p class="wp-block-paragraph">仅仅是 Controller 发出的警告，不会阻断流量。在生产环境中，你会使用 Cert-Manager 或云厂商签发的正式证书，这个问题自然就没有了。</p>



<h3 class="wp-block-heading" id="解决方案-生产环境-">解决方案（生产环境）<a href="http://is.iceymoss.com/blog/19#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88-%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83-"></a></h3>



<p class="wp-block-paragraph">在生产环境中，建议使用 Cert-Manager 自动管理证书：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: a-api-tls
  namespace: a-api
spec:
  secretName: a-api-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - a-api.example.com
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cert</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Certificate</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  secretName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tls</span></span>
<span class="line"><span style="color: #D8DEE9FF">  issuerRef</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">letsencrypt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">prod</span></span>
<span class="line"><span style="color: #D8DEE9FF">    kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ClusterIssuer</span></span>
<span class="line"><span style="color: #D8DEE9FF">  dnsNames</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">example</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="总结与下一步">总结与下一步<a href="http://is.iceymoss.com/blog/19#%E6%80%BB%E7%BB%93%E4%B8%8E%E4%B8%8B%E4%B8%80%E6%AD%A5"></a></h2>



<h3 class="wp-block-heading" id="验证成果">验证成果<a href="http://is.iceymoss.com/blog/19#%E9%AA%8C%E8%AF%81%E6%88%90%E6%9E%9C"></a></h3>



<p class="wp-block-paragraph">你已经成功在低配环境验证了设计文档中的核心逻辑：</p>



<ol class="wp-block-list">
<li>✅ <strong>Controller 集中管理</strong>：Ingress-nginx 成功运行</li>



<li>✅ <strong>Ingress 资源分布</strong>：在 a-api 和 b-api 命名空间定义的规则生效了</li>



<li>✅ <strong>流量转发</strong>：成功将外部流量导入了内部 Service</li>



<li>✅ <strong>多命名空间路由</strong>：不同域名正确路由到不同命名空间的服务</li>



<li>✅ <strong>TLS 终止</strong>：HTTPS 流量成功处理</li>



<li>✅ <strong>流量追踪</strong>：完整验证了流量路径</li>
</ol>



<h3 class="wp-block-heading" id="环境清理-可选-">环境清理（可选）<a href="http://is.iceymoss.com/blog/19#%E7%8E%AF%E5%A2%83%E6%B8%85%E7%90%86-%E5%8F%AF%E9%80%89-"></a></h3>



<p class="wp-block-paragraph">验证完成后，你可以执行以下命令清理环境，释放那宝贵的 1G 内存：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl delete ns a-api
kubectl delete ns b-api
helm uninstall ingress-nginx -n ingress-nginx
kubectl delete ns ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uninstall</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="下一步建议">下一步建议<a href="http://is.iceymoss.com/blog/19#%E4%B8%8B%E4%B8%80%E6%AD%A5%E5%BB%BA%E8%AE%AE"></a></h3>



<p class="wp-block-paragraph">既然你已经掌握了部署、路由、TLS(HTTPS) 和排错(日志分析)，这个 PoC 环境的历史使命已经完成了。</p>



<p class="wp-block-paragraph">如果你想继续深入，可以做以下两件事之一：</p>



<ol class="wp-block-list">
<li><strong>清理环境</strong>：释放那宝贵的 1G 内存</li>



<li><strong>尝试 GitOps 流程</strong>：把你设计文档里的 ArgoCD 部分跑通，但这可能需要更多的内存资源</li>
</ol>



<p class="wp-block-paragraph">目前来看，你的 Ingress 架构设计在真实集群上是完全可行且逻辑通顺的！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="深入理解-核心机制解析">深入理解：核心机制解析<a href="http://is.iceymoss.com/blog/19#%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-%E6%A0%B8%E5%BF%83%E6%9C%BA%E5%88%B6%E8%A7%A3%E6%9E%90"></a></h2>



<p class="wp-block-paragraph">在完成实践验证后，你可能会有一些更深层次的问题。本节将解答三个关键问题，帮助你深入理解 Ingress 的工作原理。</p>



<h3 class="wp-block-heading" id="问题一-Ingress-Controller-是怎么知道各个命名空间的路由规则的-">问题一：Ingress Controller 是怎么知道各个命名空间的路由规则的？<a href="http://is.iceymoss.com/blog/19#%E9%97%AE%E9%A2%98%E4%B8%80-Ingress-Controller-%E6%98%AF%E6%80%8E%E4%B9%88%E7%9F%A5%E9%81%93%E5%90%84%E4%B8%AA%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E7%9A%84%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99%E7%9A%84-"></a></h3>



<p class="wp-block-paragraph"><strong>核心机制</strong>：Kubernetes 的&#8221;监听（Watch）&#8221;机制 + RBAC 权限</p>



<p class="wp-block-paragraph">Ingress Controller (IC) 本质上是一个运行在 Pod 里的守护进程（Go 语言编写的程序），它并不是&#8221;轮询&#8221;去问 API Server，而是通过&nbsp;<strong>Event（事件）驱动</strong>&nbsp;的方式工作的。</p>



<h4 class="wp-block-heading" id="1--它是如何-跨命名空间-看到的-">1. 它是如何&#8221;跨命名空间&#8221;看到的？<a href="http://is.iceymoss.com/blog/19#1--%E5%AE%83%E6%98%AF%E5%A6%82%E4%BD%95-%E8%B7%A8%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4-%E7%9C%8B%E5%88%B0%E7%9A%84-"></a></h4>



<p class="wp-block-paragraph">还记得我们在部署 Controller 时，Helm 帮你创建了 ClusterRole 和 ClusterRoleBinding 吗？</p>



<ul class="wp-block-list">
<li><strong>ClusterRole</strong>: 赋予了它在集群级别（Cluster-wide）读取 Ingresses、Services、Endpoints、Secrets 的权限</li>



<li><strong>结果</strong>: 尽管 Controller 运行在 <code>ingress-nginx</code> 命名空间下，但它拥有&#8221;上帝视角&#8221;，能看到 <code>a-api</code>、<code>b-api</code> 等所有命名空间里的资源</li>
</ul>



<h4 class="wp-block-heading" id="2--它是如何-实时感知-变化的-">2. 它是如何&#8221;实时感知&#8221;变化的？<a href="http://is.iceymoss.com/blog/19#2--%E5%AE%83%E6%98%AF%E5%A6%82%E4%BD%95-%E5%AE%9E%E6%97%B6%E6%84%9F%E7%9F%A5-%E5%8F%98%E5%8C%96%E7%9A%84-"></a></h4>



<p class="wp-block-paragraph">这是 K8s 控制器的标准工作模式（<strong>Informer Pattern</strong>）：</p>



<ol class="wp-block-list">
<li><strong>订阅（Watch）</strong>: Controller 启动时，会向 K8s API Server 注册一个&#8221;监听器&#8221;，订阅所有 Ingress 资源的变更事件（增、删、改）</li>



<li><strong>事件触发</strong>: 当你在 <code>a-api</code> 下执行 <code>kubectl apply -f ingress.yaml</code> 时：
<ul class="wp-block-list">
<li>API Server 将数据存入 etcd</li>



<li>API Server 立刻推送一个 <code>ADD</code> 事件给 Controller</li>
</ul>
</li>



<li><strong>配置翻译</strong>: Controller 收到事件，读取你的 YAML 内容（Host, Path, ServiceName），将其翻译成 Nginx 原生的配置文件格式（nginx.conf）</li>



<li><strong>重载 (Reload)</strong>: Controller 修改 Pod 内部的 <code>/etc/nginx/nginx.conf</code> 文件，并执行 <code>nginx -s reload</code></li>



<li><strong>生效</strong>: 新的路由规则毫秒级生效</li>
</ol>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46.png"><img decoding="async" width="1024" height="502" data-id="2023" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-1024x502.png" alt="" class="wp-image-2023" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-1024x502.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-300x147.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-768x377.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-1536x753.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-46-2048x1004.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</figure>



<p class="wp-block-paragraph"><strong>验证方法</strong>：</p>



<p class="wp-block-paragraph">你可以通过以下命令观察 Controller 的实时日志，看到配置重载的过程：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl logs -f -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx | grep -i reload
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reload</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">当你创建或修改 Ingress 时，会看到类似这样的日志：</p>



<pre class="wp-block-code"><code>I1223 03:51:25.340746       7 controller.go:214] "Configuration changes detected, backend reload required"
I1223 03:51:25.390835       7 controller.go:228] "Backend successfully reloaded"
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="问题二-我写的-ingress-yaml-本身占用资源-CPU-内存-吗-">问题二：我写的 ingress.yaml 本身占用资源（CPU/内存）吗？<a href="http://is.iceymoss.com/blog/19#%E9%97%AE%E9%A2%98%E4%BA%8C-%E6%88%91%E5%86%99%E7%9A%84-ingress-yaml-%E6%9C%AC%E8%BA%AB%E5%8D%A0%E7%94%A8%E8%B5%84%E6%BA%90-CPU-%E5%86%85%E5%AD%98-%E5%90%97-"></a></h3>



<p class="wp-block-paragraph"><strong>简短回答</strong>：几乎不占用计算资源，只占用极微小的存储资源。</p>



<p class="wp-block-paragraph">我们需要区分&nbsp;<strong>&#8220;静态配置（Config）&#8221;</strong>&nbsp;和&nbsp;<strong>&#8220;运行实例（Process）&#8221;</strong>：</p>



<h4 class="wp-block-heading" id="Ingress-Controller--Pod-">Ingress Controller (Pod)<a href="http://is.iceymoss.com/blog/19#Ingress-Controller--Pod-"></a></h4>



<ul class="wp-block-list">
<li><strong>是活的</strong>。它是一个运行中的进程</li>



<li><strong>占用资源</strong>: 它需要 CPU 来处理网络请求、SSL 加密解密、计算路由；需要内存来缓存连接、加载 Lua 脚本等。所以我们需要给它限制 CPU/Mem</li>
</ul>



<h4 class="wp-block-heading" id="Ingress-yaml--资源对象-">Ingress.yaml (资源对象)<a href="http://is.iceymoss.com/blog/19#Ingress-yaml--%E8%B5%84%E6%BA%90%E5%AF%B9%E8%B1%A1-"></a></h4>



<ul class="wp-block-list">
<li><strong>是死的</strong>。它只是一段文本数据（配置记录）</li>



<li><strong>存储</strong>: 当你 apply 后，它只是在 K8s 的数据库（etcd）里存了一条几 KB 的文本记录</li>



<li><strong>计算</strong>: 它不消耗 Worker 节点的 CPU 和内存。它不会启动任何 Pod 或容器</li>



<li><strong>唯一消耗</strong>: 它会导致 Ingress Controller 加载的 nginx.conf 变大一点点（几行文本），对 Controller 的内存影响微乎其微（除非你有几万条规则）</li>
</ul>



<p class="wp-block-paragraph"><strong>结论</strong>: 你可以在集群里创建成百上千个&nbsp;<code>ingress.yaml</code>，只要没有流量进来，它们对集群的负载压力几乎为零。</p>



<p class="wp-block-paragraph"><strong>验证方法</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 查看 Ingress 资源占用的存储空间（实际上只是 etcd 中的一条记录）&lt;/em>
kubectl get ingress -A --no-headers | wc -l  &lt;em># 统计 Ingress 数量&lt;/em>

&lt;em># 查看 Controller 的内存使用（这才是真正消耗资源的地方）&lt;/em>
kubectl top pod -n ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Ingress 资源占用的存储空间（实际上只是 etcd 中的一条记录）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">A</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">no</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">headers</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">统计</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">数量</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Controller 的内存使用（这才是真正消耗资源的地方）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">top</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="问题三-外部流量可能绕过-Ingress-Controller-直接走到业务-Pod-吗-">问题三：外部流量可能绕过 Ingress Controller，直接走到业务 Pod 吗？<a href="http://is.iceymoss.com/blog/19#%E9%97%AE%E9%A2%98%E4%B8%89-%E5%A4%96%E9%83%A8%E6%B5%81%E9%87%8F%E5%8F%AF%E8%83%BD%E7%BB%95%E8%BF%87-Ingress-Controller-%E7%9B%B4%E6%8E%A5%E8%B5%B0%E5%88%B0%E4%B8%9A%E5%8A%A1-Pod-%E5%90%97-"></a></h3>



<p class="wp-block-paragraph">这是一个非常关键的安全和架构问题。</p>



<p class="wp-block-paragraph"><strong>答案取决于你的 Service 类型和网络策略。</strong></p>



<h4 class="wp-block-heading" id="情况-A-绝对无法绕过-标准生产架构--">情况 A：绝对无法绕过（标准生产架构）✅<a href="http://is.iceymoss.com/blog/19#%E6%83%85%E5%86%B5-A-%E7%BB%9D%E5%AF%B9%E6%97%A0%E6%B3%95%E7%BB%95%E8%BF%87-%E6%A0%87%E5%87%86%E7%94%9F%E4%BA%A7%E6%9E%B6%E6%9E%84--"></a></h4>



<p class="wp-block-paragraph">在我们的 PoC 验证中，你的业务 Service (<code>a-api-service</code>) 配置如下：</p>



<ul class="wp-block-list">
<li><strong>Type</strong>: <code>ClusterIP</code> (默认)</li>



<li><strong>IP</strong>: 类似于 <code>10.104.181.16</code></li>
</ul>



<p class="wp-block-paragraph"><strong>分析</strong>:</p>



<ul class="wp-block-list">
<li><code>ClusterIP</code> 是一个虚拟 IP，它只存在于 Kubernetes 集群内部网络中</li>



<li>外部世界（你的笔记本、公网用户）根本就没有路由能通达这个 IP</li>



<li><strong>唯一入口</strong>: 外部流量只能通过你暴露的 <code>NodePort:30080</code> (即 Ingress Controller) 进入</li>
</ul>



<p class="wp-block-paragraph"><strong>结论</strong>: 流量被迫经过&nbsp;<code>Ingress Controller -&gt; Service -&gt; Pod</code>。无法绕过。</p>



<h4 class="wp-block-heading" id="情况-B-可以绕过-配置不当-特殊需求---">情况 B：可以绕过（配置不当/特殊需求）⚠️<a href="http://is.iceymoss.com/blog/19#%E6%83%85%E5%86%B5-B-%E5%8F%AF%E4%BB%A5%E7%BB%95%E8%BF%87-%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93-%E7%89%B9%E6%AE%8A%E9%9C%80%E6%B1%82---"></a></h4>



<p class="wp-block-paragraph">如果你的业务 Service (<code>a-api-service</code>) 被你配置成了：</p>



<ol class="wp-block-list">
<li><strong>Type: NodePort</strong>: 此时 K8s 会在所有节点上开一个端口（比如 31000）。外部用户如果知道这个端口，就可以直接 <code>curl NodeIP:31000</code> 访问你的 Pod，完全绕过 Ingress 的路由规则、限流和鉴权</li>



<li><strong>Type: LoadBalancer</strong>: 云厂商会直接给这个 Service 分配一个公网 IP。外部流量直接打进来，绕过 Ingress</li>



<li><strong>HostNetwork: true</strong>: Pod 直接占用宿主机网络，也能被绕过</li>
</ol>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="325" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-1024x325.png" alt="" class="wp-image-2024" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-1024x325.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-300x95.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-768x244.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-1536x488.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/image-47-2048x650.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>验证方法</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查你的 Service 类型（应该是 ClusterIP）&lt;/em>
kubectl get svc -n a-api

&lt;em># 尝试直接访问 ClusterIP（应该失败，因为外部无法路由）&lt;/em>
curl http://10.104.181.16/  &lt;em># 这个 IP 只在集群内部可达&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查你的 Service 类型（应该是 ClusterIP）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 尝试直接访问 ClusterIP（应该失败，因为外部无法路由）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.104.181.16/  &lt;em&gt;# 这个 IP 只在集群内部可达&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>总结</strong>: 只要你的业务 Service 类型保持为&nbsp;<code>ClusterIP</code>（这是默认值，也是最佳实践），外部流量就物理上无法绕过 Ingress Controller。Ingress 变成了集群唯一的&#8221;守门人&#8221;。</p>



<h4 class="wp-block-heading" id="最佳实践建议">最佳实践建议<a href="http://is.iceymoss.com/blog/19#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE"></a></h4>



<ol class="wp-block-list">
<li><strong>业务 Service 使用 ClusterIP</strong>（默认值，无需修改）</li>



<li><strong>仅 Ingress Controller 使用 NodePort 或 LoadBalancer</strong> 作为外部入口</li>



<li><strong>使用 NetworkPolicy</strong> 进一步限制 Pod 间的网络访问（可选，但推荐）</li>



<li><strong>定期审计</strong> Service 类型，确保没有业务服务被误配置为 NodePort 或 LoadBalancer</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="实践验证-外部流量绕过-Ingress-实验">实践验证：外部流量绕过 Ingress 实验<a href="http://is.iceymoss.com/blog/19#%E5%AE%9E%E8%B7%B5%E9%AA%8C%E8%AF%81-%E5%A4%96%E9%83%A8%E6%B5%81%E9%87%8F%E7%BB%95%E8%BF%87-Ingress-%E5%AE%9E%E9%AA%8C"></a></h3>



<p class="wp-block-paragraph">为了更直观地理解 Service 类型对安全性的影响，我们可以通过两个阶段来验证：</p>



<ul class="wp-block-list">
<li><strong>阶段一（现状验证）</strong>：证明当前状态下，外部流量无法绕过 Ingress</li>



<li><strong>阶段二（模拟漏洞）</strong>：人为修改配置，让外部流量成功绕过 Ingress（演示如果不小心配置错了会发生什么）</li>
</ul>



<h4 class="wp-block-heading" id="阶段一-验证-无法绕过---安全基线-">阶段一：验证&#8221;无法绕过&#8221; (安全基线)<a href="http://is.iceymoss.com/blog/19#%E9%98%B6%E6%AE%B5%E4%B8%80-%E9%AA%8C%E8%AF%81-%E6%97%A0%E6%B3%95%E7%BB%95%E8%BF%87---%E5%AE%89%E5%85%A8%E5%9F%BA%E7%BA%BF-"></a></h4>



<p class="wp-block-paragraph">目前你的&nbsp;<code>a-api-service</code>&nbsp;应该是默认的&nbsp;<code>ClusterIP</code>&nbsp;类型。这意味着它只有集群内部 IP，没有对外的端口。</p>



<h5 class="wp-block-heading" id="1--确认-Service-类型">1. 确认 Service 类型<a href="http://is.iceymoss.com/blog/19#1--%E7%A1%AE%E8%AE%A4-Service-%E7%B1%BB%E5%9E%8B"></a></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get svc -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期输出</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
a-api-service   ClusterIP   10.97.242.22    &lt;none>        80/TCP    ...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ClusterIP</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.97</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">242.22</span><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">...</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>关键点</strong>：<code>TYPE</code>&nbsp;是&nbsp;<code>ClusterIP</code>。</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
a-api-service   ClusterIP   10.97.242.22    &lt;none>        80/TCP    3h9m
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ClusterIP</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.97</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">242.22</span><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">    3</span><span style="color: #D8DEE9">h9m</span></span>
<span class="line"></span></code></pre></div>



<h5 class="wp-block-heading" id="2--尝试直接-攻击-后端">2. 尝试直接&#8221;攻击&#8221;后端<a href="http://is.iceymoss.com/blog/19#2--%E5%B0%9D%E8%AF%95%E7%9B%B4%E6%8E%A5-%E6%94%BB%E5%87%BB-%E5%90%8E%E7%AB%AF"></a></h5>



<p class="wp-block-paragraph">我们知道&nbsp;<code>a-api</code>&nbsp;的 Pod 运行在 Worker 节点 (10.4.0.17) 上，且服务端口是 80。我们试着直接访问 Worker 节点的 80 端口，看看能不能摸到业务 Pod。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 尝试直接连接 Worker IP 的 80 端口&lt;/em>
curl -v --connect-timeout 5 http://10.4.0.17:80/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 尝试直接连接 Worker IP 的 80 端口</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">connect</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">timeout</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:80/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期结果</strong>：</p>



<p class="wp-block-paragraph">失败 (Connection refused 或 Timed out)。</p>



<p class="wp-block-paragraph"><strong>原因</strong>：Worker 节点的宿主机上，并没有任何进程监听 80 端口。Pod 的 80 端口是在 CNI (容器网络) 的虚拟网络里的，外部物理网络直接连不通。</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:80...
* Connected to 10.4.0.17 (10.4.0.17) port 80
> GET / HTTP/1.1
> Host: 10.4.0.17
...
&lt; HTTP/1.1 200 OK
&lt; Server: nginx/1.29.4
...
&lt;title>InkSpace - 个人网站&lt;/title>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GET</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">OK</span></span>
<span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> Server</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.29</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">4</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;title&gt;</span><span style="color: #D8DEE9FF">InkSpace - 个人网站</span><span style="color: #81A1C1">&lt;/title&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>⚠️ 特殊情况说明</strong>：</p>



<p class="wp-block-paragraph">在实际验证中，访问 Worker 节点的 80 端口成功了，但返回的是&#8221;InkSpace &#8211; 个人网站&#8221;的内容，而不是 Kubernetes Pod 的内容。这是因为：</p>



<ul class="wp-block-list">
<li><strong>宿主机上部署了博客系统</strong>，占用了 80 端口</li>



<li>这个响应来自宿主机的应用，不是 Kubernetes Pod</li>



<li>这证明了：即使宿主机有服务监听 80 端口，Kubernetes Pod 的 80 端口仍然是隔离的，外部无法直接访问</li>
</ul>



<p class="wp-block-paragraph"><strong>结论</strong>：在当前配置下，外部流量必须经过 NodePort 30080 (Ingress Controller) 才能访问到 Kubernetes 集群内的业务 Pod，无法绕过。</p>



<h4 class="wp-block-heading" id="阶段二-模拟-绕过-Ingress---制造漏洞-">阶段二：模拟&#8221;绕过 Ingress&#8221; (制造漏洞)<a href="http://is.iceymoss.com/blog/19#%E9%98%B6%E6%AE%B5%E4%BA%8C-%E6%A8%A1%E6%8B%9F-%E7%BB%95%E8%BF%87-Ingress---%E5%88%B6%E9%80%A0%E6%BC%8F%E6%B4%9E-"></a></h4>



<p class="wp-block-paragraph">现在我们修改 Service 配置，把它变成&nbsp;<code>NodePort</code>&nbsp;类型。这相当于在防火墙上打了一个洞，允许外部直接访问业务 Service。</p>



<h5 class="wp-block-heading" id="1--修改-Service-类型为-NodePort">1. 修改 Service 类型为 NodePort<a href="http://is.iceymoss.com/blog/19#1--%E4%BF%AE%E6%94%B9-Service-%E7%B1%BB%E5%9E%8B%E4%B8%BA-NodePort"></a></h5>



<p class="wp-block-paragraph">执行以下命令，将&nbsp;<code>a-api-service</code>&nbsp;的类型&#8221;热更新&#8221;为&nbsp;<code>NodePort</code>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl patch svc a-api-service -n a-api -p '{"spec": {"type": "NodePort"}}'
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;: {&quot;type&quot;: &quot;NodePort&quot;}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>service/a-api-service patched
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patched</span></span>
<span class="line"></span></code></pre></div>



<h5 class="wp-block-heading" id="2--查看暴露的端口">2. 查看暴露的端口<a href="http://is.iceymoss.com/blog/19#2--%E6%9F%A5%E7%9C%8B%E6%9A%B4%E9%9C%B2%E7%9A%84%E7%AB%AF%E5%8F%A3"></a></h5>



<p class="wp-block-paragraph">再次查看 Service，找到 K8s 随机分配的那个端口：</p>



<pre class="wp-block-code"><code>kubectl get svc -n a-api
</code></pre>



<p class="wp-block-paragraph"><strong>实际输出</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
a-api-service   NodePort   10.97.242.22     &lt;none>        80:30925/TCP   3h14m
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">       </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)        </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">NodePort</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.97</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">242.22</span><span style="color: #D8DEE9FF">     </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30925</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">   3</span><span style="color: #D8DEE9">h14m</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>关键信息</strong>：分配的端口是&nbsp;<code>30925</code>（请以你实际看到的为准）。</p>



<h5 class="wp-block-heading" id="3--执行绕过攻击">3. 执行绕过攻击<a href="http://is.iceymoss.com/blog/19#3--%E6%89%A7%E8%A1%8C%E7%BB%95%E8%BF%87%E6%94%BB%E5%87%BB"></a></h5>



<p class="wp-block-paragraph">现在，我们不走 Ingress (端口 30080)，而是直接走这个后门端口 (30925)。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 替换 30925 为你上面查到的端口&lt;/em>
export BYPASS_PORT=$(kubectl get svc -n a-api a-api-service -o jsonpath='{.spec.ports&#91;0&#93;.nodePort}')

curl -v http://10.4.0.17:$BYPASS_PORT/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 替换 30925 为你上面查到的端口</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BYPASS_PORT</span><span style="color: #81A1C1">=</span><span style="color: #88C0D0">$</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jsonpath</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{.spec.ports&#91;0&#93;.nodePort}</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:$BYPASS_PORT/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>预期结果</strong>：</p>



<p class="wp-block-paragraph">✅ 成功返回&nbsp;<code>&lt;title&gt;Welcome to nginx!&lt;/title&gt;</code>。</p>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:30925...
* Connected to 10.4.0.17 (10.4.0.17) port 30925
> GET / HTTP/1.1
> Host: 10.4.0.17:30925
...
&lt; HTTP/1.1 200 OK
&lt; Server: nginx/1.29.4
...
&lt;!DOCTYPE html>
&lt;html>
&lt;head>
&lt;title>Welcome to nginx!&lt;/title>
...
&lt;h1>Welcome to nginx!&lt;/h1>
...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30925.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connected</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30925</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GET</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span></span>
<span class="line"><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30925</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.1</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">OK</span></span>
<span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> Server</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1.29</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">4</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;!</span><span style="color: #D8DEE9">DOCTYPE</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">html</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;html&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;head&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;title&gt;</span><span style="color: #D8DEE9FF">Welcome to nginx!</span><span style="color: #81A1C1">&lt;/title&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">...</span></span>
<span class="line"><span style="color: #81A1C1">&lt;h1&gt;</span><span style="color: #D8DEE9FF">Welcome to nginx!</span><span style="color: #81A1C1">&lt;/h1&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">...</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>😱 后果</strong>：你成功绕过了 Ingress Controller！</p>



<h4 class="wp-block-heading" id="阶段三-铁证如山--日志对比-">阶段三：铁证如山 (日志对比)<a href="http://is.iceymoss.com/blog/19#%E9%98%B6%E6%AE%B5%E4%B8%89-%E9%93%81%E8%AF%81%E5%A6%82%E5%B1%B1--%E6%97%A5%E5%BF%97%E5%AF%B9%E6%AF%94-"></a></h4>



<p class="wp-block-paragraph">为了证明这是&#8221;绕过&#8221;，我们需要看 Ingress Controller 的日志。</p>



<h5 class="wp-block-heading" id="1--打开日志监听">1. 打开日志监听<a href="http://is.iceymoss.com/blog/19#1--%E6%89%93%E5%BC%80%E6%97%A5%E5%BF%97%E7%9B%91%E5%90%AC"></a></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl logs -f -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<h5 class="wp-block-heading" id="2--再次发送-绕过请求-">2. 再次发送&#8221;绕过请求&#8221;<a href="http://is.iceymoss.com/blog/19#2--%E5%86%8D%E6%AC%A1%E5%8F%91%E9%80%81-%E7%BB%95%E8%BF%87%E8%AF%B7%E6%B1%82-"></a></h5>



<p class="wp-block-paragraph">在另一个窗口执行刚才的 curl 命令（访问 30925 端口）。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -v http://10.4.0.17:30925/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30925/</span></span>
<span class="line"></span></code></pre></div>



<h5 class="wp-block-heading" id="3--观察日志">3. 观察日志<a href="http://is.iceymoss.com/blog/19#3--%E8%A7%82%E5%AF%9F%E6%97%A5%E5%BF%97"></a></h5>



<p class="wp-block-paragraph"><strong>结果</strong>：Ingress Controller 的日志里静悄悄的，完全没有这条访问记录。</p>



<p class="wp-block-paragraph"><strong>结论</strong>：因为流量根本没经过它！就像你偷偷从后门进了大楼，前门的保安（Ingress）根本不知道你来了。</p>



<p class="wp-block-paragraph">这就带来了严重的问题：</p>



<ul class="wp-block-list">
<li>❌ Ingress 上配置的 HTTPS 加密失效了（你是明文访问的）</li>



<li>❌ Ingress 上配置的限流、鉴权、WAF 防火墙全部失效</li>



<li>❌ 无法通过 Ingress 日志追踪和审计访问记录</li>
</ul>



<h4 class="wp-block-heading" id="阶段四-恢复环境--堵上漏洞-">阶段四：恢复环境 (堵上漏洞)<a href="http://is.iceymoss.com/blog/19#%E9%98%B6%E6%AE%B5%E5%9B%9B-%E6%81%A2%E5%A4%8D%E7%8E%AF%E5%A2%83--%E5%A0%B5%E4%B8%8A%E6%BC%8F%E6%B4%9E-"></a></h4>



<p class="wp-block-paragraph">验证完成后，我们必须把这个漏洞堵上，恢复架构的安全性。</p>



<h5 class="wp-block-heading" id="1--恢复-Service-为-ClusterIP">1. 恢复 Service 为 ClusterIP<a href="http://is.iceymoss.com/blog/19#1--%E6%81%A2%E5%A4%8D-Service-%E4%B8%BA-ClusterIP"></a></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl patch svc a-api-service -n a-api -p '{"spec": {"type": "ClusterIP"}}'

&lt;em># 注意：patch 可能会报错说端口冲突或字段不可变&lt;/em>
&lt;em># 如果报错，最简单的办法是删了重建 Service (不删 Deployment 不影响业务)&lt;/em>
kubectl delete svc a-api-service -n a-api
kubectl expose deployment a-api-demo --name=a-api-service --port=80 --target-port=80 -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;: {&quot;type&quot;: &quot;ClusterIP&quot;}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 注意：patch 可能会报错说端口冲突或字段不可变</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 如果报错，最简单的办法是删了重建 Service (不删 Deployment 不影响业务)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 第一步：尝试 patch（可能失败）&lt;/em>
kubectl patch svc a-api-service -n a-api -p '{"spec": {"type": "ClusterIP"}}'
&lt;em># service/a-api-service patched&lt;/em>

&lt;em># 第二步：删除并重建（更稳妥）&lt;/em>
kubectl delete svc a-api-service -n a-api
&lt;em># service "a-api-service" deleted&lt;/em>

kubectl expose deployment a-api-demo --name=a-api-service --port=80 --target-port=80 -n a-api
&lt;em># service/a-api-service exposed&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 第一步：尝试 patch（可能失败）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;: {&quot;type&quot;: &quot;ClusterIP&quot;}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># service/a-api-service patched</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 第二步：删除并重建（更稳妥）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># service &quot;a-api-service&quot; deleted</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># service/a-api-service exposed</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<h5 class="wp-block-heading" id="2--再次验证">2. 再次验证<a href="http://is.iceymoss.com/blog/19#2--%E5%86%8D%E6%AC%A1%E9%AA%8C%E8%AF%81"></a></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get svc -n a-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">svc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
a-api-service   ClusterIP   10.100.197.170   &lt;none>        80/TCP    8s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">       </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ClusterIP</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.100</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">197.170</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">    8</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">✅ 确认变回了&nbsp;<code>ClusterIP</code>。</p>



<h5 class="wp-block-heading" id="3--验证绕过端口已失效">3. 验证绕过端口已失效<a href="http://is.iceymoss.com/blog/19#3--%E9%AA%8C%E8%AF%81%E7%BB%95%E8%BF%87%E7%AB%AF%E5%8F%A3%E5%B7%B2%E5%A4%B1%E6%95%88"></a></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 尝试访问之前的 NodePort&lt;/em>
curl -v http://10.4.0.17:30925/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 尝试访问之前的 NodePort</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30925/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>实际验证结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>*   Trying 10.4.0.17:30925...
* connect to 10.4.0.17 port 30925 from 10.4.4.15 port 53912 failed: Connection refused
* Failed to connect to 10.4.0.17 port 30925 after 1 ms: Couldn't connect to server
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Trying</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">30925.</span><span style="color: #ECEFF4">..</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connect</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30925</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">4.15</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">53912</span><span style="color: #D8DEE9FF"> failed</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Connection</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">refused</span></span>
<span class="line"><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connect</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.4</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.17</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30925</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">after</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> ms</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Couldn</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">t connect to serve</span><span style="color: #D8DEE9">r</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">✅ 确认 NodePort 端口已关闭，无法绕过。</p>



<h4 class="wp-block-heading" id="实验总结">实验总结<a href="http://is.iceymoss.com/blog/19#%E5%AE%9E%E9%AA%8C%E6%80%BB%E7%BB%93"></a></h4>



<p class="wp-block-paragraph">通过这个实验，我们验证了：</p>



<ol class="wp-block-list">
<li>✅ <strong>ClusterIP 是安全的防线</strong>：只要 Service 是 <code>ClusterIP</code>，外部流量就&#8221;物理上&#8221;无法直接触达业务 Pod（除非宿主机本身有服务占用端口，但那是宿主机层面的，不是 Kubernetes 层面的）</li>



<li>⚠️ <strong>NodePort 是潜在的漏洞</strong>：如果开发人员随意把业务 Service 改成 <code>NodePort</code>，就会导致 Ingress 被架空，所有安全策略失效</li>



<li>🔒 <strong>防御建议</strong>：这就是为什么在生产环境中，我们通常会配合 <strong>NetworkPolicy（网络策略）</strong> 来进一步加固：&#8221;只允许 Ingress Controller 的 Pod 访问后端业务 Pod，禁止其他任何来源访问。&#8221;</li>
</ol>



<h4 class="wp-block-heading" id="进一步加固-NetworkPolicy-示例">进一步加固：NetworkPolicy 示例<a href="http://is.iceymoss.com/blog/19#%E8%BF%9B%E4%B8%80%E6%AD%A5%E5%8A%A0%E5%9B%BA-NetworkPolicy-%E7%A4%BA%E4%BE%8B"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-only
  namespace: a-api
spec:
  podSelector:
    matchLabels:
      app: a-api-demo
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: ingress-nginx
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: ingress-nginx
    ports:
    - protocol: TCP
      port: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NetworkPolicy</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">allow</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">only</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  podSelector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span></span>
<span class="line"><span style="color: #D8DEE9FF">  policyTypes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingress</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> from</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> namespaceSelector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> podSelector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">      port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">这个策略确保：只有来自&nbsp;<code>ingress-nginx</code>&nbsp;命名空间的 Pod 才能访问&nbsp;<code>a-api</code>&nbsp;的 Pod，即使 Service 被误配置为 NodePort，外部流量也无法直接到达 Pod。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="附录-完整命令清单">附录：完整命令清单<a href="http://is.iceymoss.com/blog/19#%E9%99%84%E5%BD%95-%E5%AE%8C%E6%95%B4%E5%91%BD%E4%BB%A4%E6%B8%85%E5%8D%95"></a></h2>



<h3 class="wp-block-heading" id="部署阶段">部署阶段<a href="http://is.iceymoss.com/blog/19#%E9%83%A8%E7%BD%B2%E9%98%B6%E6%AE%B5"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 1. 安装 Helm（如未安装）&lt;/em>
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

&lt;em># 2. 添加 Helm 仓库&lt;/em>
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

&lt;em># 3. 部署 Ingress Controller&lt;/em>
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.replicaCount=1 \
  --set controller.service.type=NodePort \
  --set controller.service.nodePorts.http=30080 \
  --set controller.resources.requests.cpu=100m \
  --set controller.resources.requests.memory=90Mi \
  --set controller.admissionWebhooks.enabled=false \
  --set controller.allowSnippetAnnotations=true

&lt;em># 4. 验证 Controller&lt;/em>
kubectl get pods -n ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 1. 安装 Helm（如未安装）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">fsSL</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get_helm</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sh</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3</span></span>
<span class="line"><span style="color: #D8DEE9">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">700</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get_helm</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sh</span></span>
<span class="line"><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">get_helm</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sh</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 2. 添加 Helm 仓库</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//kubernetes.github.io/ingress-nginx</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 3. 部署 Ingress Controller</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">helm</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--namespace</span><span style="color: #D8DEE9FF"> ingress-nginx \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --create-namespace \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">replicaCount=1 \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">type=NodePort \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">nodePorts</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">http=30080 \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">resources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">requests</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">cpu=100m \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">resources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">requests</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">memory=90Mi \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">admissionWebhooks</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">enabled=false \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  --set controller</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">allowSnippetAnnotations=true</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">&lt;em&gt;# 4</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> 验证 Controller&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">kubectl get pods -n ingress-nginx</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="业务服务部署">业务服务部署<a href="http://is.iceymoss.com/blog/19#%E4%B8%9A%E5%8A%A1%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 创建命名空间&lt;/em>
kubectl create ns a-api
kubectl create ns b-api

&lt;em># 部署 a-api (Nginx)&lt;/em>
kubectl create deployment a-api-demo --image=nginx:alpine --replicas=1 -n a-api
kubectl expose deployment a-api-demo --name=a-api-service --port=80 --target-port=80 -n a-api

&lt;em># 部署 b-api (Apache)&lt;/em>
kubectl create deployment b-api-demo --image=httpd:alpine --replicas=1 -n b-api
kubectl expose deployment b-api-demo --name=b-api-service --port=80 --target-port=80 -n b-api
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建命名空间</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ns</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 部署 a-api (Nginx)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">nginx</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">replicas</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 部署 b-api (Apache)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">httpd</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">replicas</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">expose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">target</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="Ingress-配置">Ingress 配置<a href="http://is.iceymoss.com/blog/19#Ingress-%E9%85%8D%E7%BD%AE"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># a-api Ingress&lt;/em>
cat &lt;&lt;EOF > ingress-v129.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: a-api-ingress
  namespace: a-api
spec:
  ingressClassName: nginx
  rules:
  - host: a-api.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: a-api-service
            port:
              number: 80
EOF

&lt;em># b-api Ingress&lt;/em>
cat &lt;&lt;EOF > ingress-b-api.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: b-api-ingress
  namespace: b-api
spec:
  ingressClassName: nginx
  rules:
  - host: b-api.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: b-api-service
            port:
              number: 80
EOF

&lt;em># 应用配置&lt;/em>
kubectl apply -f ingress-v129.yaml
kubectl apply -f ingress-b-api.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># a-api Ingress</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9">EOF</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v129</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># b-api Ingress</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9">EOF</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">  namespace</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF">  rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">test</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">com</span></span>
<span class="line"><span style="color: #D8DEE9FF">    http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">        pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF">        backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">              number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 应用配置</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v129</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="验证命令">验证命令<a href="http://is.iceymoss.com/blog/19#%E9%AA%8C%E8%AF%81%E5%91%BD%E4%BB%A4"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 获取节点 IP&lt;/em>
kubectl get nodes -o wide

&lt;em># 测试 HTTP&lt;/em>
curl -v -H "Host: a-api.test.com" http://10.4.0.17:30080/
curl -v -H "Host: b-api.test.com" http://10.4.0.17:30080/

&lt;em># 查看日志&lt;/em>
kubectl logs -f -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
kubectl logs -n a-api -l app=a-api-demo
kubectl logs -n b-api -l app=b-api-demo

&lt;em># 查看 Pod IP&lt;/em>
kubectl get pods -n ingress-nginx -o wide
kubectl get pods -n a-api -o wide
kubectl get pods -n b-api -o wide</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 获取节点 IP</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 测试 HTTP</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: a-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">v</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">H</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Host: b-api.test.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//10.4.0.17:30080/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看日志</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">name</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">l</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">demo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 查看 Pod IP</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">api</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wide</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e9%aa%8c%e8%af%81%e5%ae%9e%e8%b7%b5%e6%96%87%e6%a1%a3/">Kubernetes Ingress 架构验证实践文档</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/kubernetes-ingress-%e6%9e%b6%e6%9e%84%e9%aa%8c%e8%af%81%e5%ae%9e%e8%b7%b5%e6%96%87%e6%a1%a3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes集群搭建并部署Web应用</title>
		<link>https://www.atomic-cube.cn/k8s%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%b9%b6%e9%83%a8%e7%bd%b2web%e5%ba%94%e7%94%a8/</link>
					<comments>https://www.atomic-cube.cn/k8s%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%b9%b6%e9%83%a8%e7%bd%b2web%e5%ba%94%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Mon, 01 Dec 2025 00:00:11 +0000</pubDate>
				<category><![CDATA[K8S]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[k3s]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Minikube]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=2032</guid>

					<description><![CDATA[<p>写在前面 本文记录了从零开始使用 Kind 搭建单节点 Kubernetes 集群，并成功部署 Go Web 应用的完整过程。包括集群搭建、镜像构建、应用部署等各个环节，以及遇到的各种问题和解决方案。 环境准备 系统环境 Docker 安装 参考菜鸟教程：https://www.runoob.com/docker/ubuntu-docker-install.html Go 安装参考：https://www.runoob.com/go/go-environment.html Kind 安装 Kind 安装方式非常多，我们这里使用 Go 安装，使用以下命令： 更多关于 Kind 的内容可以参考官方文档：https://kind.sigs.k8s.io/ kubectl 安装 网络环境 Kind 集群搭建 1.1 初始集群状态检查 首先检查现有的 kind 集群： 执行结果：我这里之前测试创建了两个集群，刚安装 kind 肯定是没有的 发现有两个集群：dev&#160;和&#160;kind 1.2 集群问题诊断 检查 kind 集群状态时发现 Calico 网络插件存在问题： 执行结果： 问题现象： 根本原因分析： 详细错误信息： 错误输出： 1.3 重新创建集群 删除有问题的集群，重新创建： 执行结果： [&#8230;]</p>
<p>The post <a href="https://www.atomic-cube.cn/k8s%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%b9%b6%e9%83%a8%e7%bd%b2web%e5%ba%94%e7%94%a8/">Kubernetes集群搭建并部署Web应用</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="写在前面">写在前面<a href="http://is.iceymoss.com/blog/4#%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2"></a></h2>



<p class="wp-block-paragraph">本文记录了从零开始使用 Kind 搭建单节点 Kubernetes 集群，并成功部署 Go Web 应用的完整过程。包括集群搭建、镜像构建、应用部署等各个环节，以及遇到的各种问题和解决方案。</p>



<h2 class="wp-block-heading" id="环境准备">环境准备<a href="http://is.iceymoss.com/blog/4#%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87"></a></h2>



<h3 class="wp-block-heading" id="系统环境">系统环境<a href="http://is.iceymoss.com/blog/4#%E7%B3%BB%E7%BB%9F%E7%8E%AF%E5%A2%83"></a></h3>



<ul class="wp-block-list">
<li><strong>操作系统</strong>: Ubuntu 22.04.5 LTS</li>



<li><strong>CPU</strong>: 4 核</li>



<li><strong>内存</strong>: 8GB</li>



<li><strong>Docker 版本</strong>: 28.3.3</li>



<li><strong>Kind 版本</strong>: v0.29.0</li>
</ul>



<h3 class="wp-block-heading" id="Docker安装">Docker 安装<a href="http://is.iceymoss.com/blog/4#Docker%E5%AE%89%E8%A3%85"></a></h3>



<p class="wp-block-paragraph">参考菜鸟教程：<a href="https://www.runoob.com/docker/ubuntu-docker-install.html" target="_blank" rel="noreferrer noopener">https://www.runoob.com/docker/ubuntu-docker-install.html</a></p>



<h3 class="wp-block-heading" id="Go安装">Go 安装参考：<a href="https://www.runoob.com/go/go-environment.html" target="_blank" rel="noreferrer noopener">https://www.runoob.com/go/go-environment.html</a><a href="http://is.iceymoss.com/blog/4#Go%E5%AE%89%E8%A3%85"></a></h3>



<h3 class="wp-block-heading" id="Kind安装">Kind 安装<a href="http://is.iceymoss.com/blog/4#Kind%E5%AE%89%E8%A3%85"></a></h3>



<p class="wp-block-paragraph">Kind 安装方式非常多，我们这里使用 Go 安装，使用以下命令：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>go install sigs.k8s.io/kind@v0.29.0
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sigs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF">@</span><span style="color: #D8DEE9">v0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">29.0</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">更多关于 Kind 的内容可以参考官方文档：<a href="https://kind.sigs.k8s.io/">https://kind.sigs.k8s.io/</a></p>



<h3 class="wp-block-heading" id="kubectl安装">kubectl 安装<a href="http://is.iceymoss.com/blog/4#kubectl%E5%AE%89%E8%A3%85"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">LO</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectl</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mv</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">usr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">local</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">bin</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="网络环境">网络环境<a href="http://is.iceymoss.com/blog/4#%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83"></a></h3>



<ul class="wp-block-list">
<li>服务器位于国内，配置了多个 Docker 镜像源</li>



<li>包含阿里云、清华、中科大等国内镜像源</li>



<li>使用代理环境进行网络访问</li>
</ul>



<h2 class="wp-block-heading" id="Kind集群搭建">Kind 集群搭建<a href="http://is.iceymoss.com/blog/4#Kind%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA"></a></h2>



<h3 class="wp-block-heading" id="1-1-初始集群状态检查">1.1 初始集群状态检查<a href="http://is.iceymoss.com/blog/4#1-1-%E5%88%9D%E5%A7%8B%E9%9B%86%E7%BE%A4%E7%8A%B6%E6%80%81%E6%A3%80%E6%9F%A5"></a></h3>



<p class="wp-block-paragraph">首先检查现有的 kind 集群：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kind get clusters
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clusters</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：<br>我这里之前测试创建了两个集群，刚安装 kind 肯定是没有的</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>dev
kind
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">dev</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">发现有两个集群：<code>dev</code>&nbsp;和&nbsp;<code>kind</code></p>



<h3 class="wp-block-heading" id="1-2-集群问题诊断">1.2 集群问题诊断<a href="http://is.iceymoss.com/blog/4#1-2-%E9%9B%86%E7%BE%A4%E9%97%AE%E9%A2%98%E8%AF%8A%E6%96%AD"></a></h3>



<p class="wp-block-paragraph">检查 kind 集群状态时发现 Calico 网络插件存在问题：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pods -n kube-system
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">system</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                                         READY   STATUS                  RESTARTS      AGE
calico-kube-controllers-7498b9bb4c-dfjfp     0/1     ImagePullBackOff        0             10h
calico-node-bp4df                            0/1     Init:ImagePullBackOff   0             10h
coredns-674b8bbfcf-j28hf                     1/1     Running                 0             10h
coredns-674b8bbfcf-z9wkq                     1/1     Running                 0             10h
etcd-kind-control-plane                      1/1     Running                 1 (11h ago)   10h
kindnet-hvxwh                                1/1     Running                 0             10h
kube-apiserver-kind-control-plane            1/1     Running                 1 (11h ago)   10h
kube-controller-manager-kind-control-plane   1/1     Running                 1 (11h ago)   10h
kube-proxy-9qvpq                             1/1     Running                 0             10h
kube-scheduler-kind-control-plane            1/1     Running                 1 (11h ago)   10h
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                         </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">                  </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">calico</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controllers</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7498</span><span style="color: #D8DEE9">b9bb4c</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dfjfp</span><span style="color: #D8DEE9FF">     </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">ImagePullBackOff</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">calico</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">node</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">bp4df</span><span style="color: #D8DEE9FF">                            </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     Init</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">ImagePullBackOff</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">coredns</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">674</span><span style="color: #D8DEE9">b8bbfcf</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">j28hf</span><span style="color: #D8DEE9FF">                     </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">coredns</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">674</span><span style="color: #D8DEE9">b8bbfcf</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">z9wkq</span><span style="color: #D8DEE9FF">                     </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">etcd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">                      </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> (11</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ago</span><span style="color: #D8DEE9FF">)   10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kindnet</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">hvxwh</span><span style="color: #D8DEE9FF">                                </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">apiserver</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">            </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> (11</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ago</span><span style="color: #D8DEE9FF">)   10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> (11</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ago</span><span style="color: #D8DEE9FF">)   10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">proxy</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">9</span><span style="color: #D8DEE9">qvpq</span><span style="color: #D8DEE9FF">                             </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">             10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">scheduler</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">            </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">                 </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> (11</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ago</span><span style="color: #D8DEE9FF">)   10</span><span style="color: #D8DEE9">h</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>问题现象</strong>：</p>



<ul class="wp-block-list">
<li><code>calico-kube-controllers</code>&nbsp;和&nbsp;<code>calico-node</code>&nbsp;出现&nbsp;<code>ImagePullBackOff</code>&nbsp;错误</li>



<li>错误信息显示代理连接失败：<code>dial tcp 127.0.0.1:7890: connection refused</code></li>
</ul>



<p class="wp-block-paragraph"><strong>根本原因分析</strong>：</p>



<ul class="wp-block-list">
<li>代理设置与镜像源配置冲突</li>



<li>网络环境复杂导致镜像拉取失败</li>
</ul>



<p class="wp-block-paragraph"><strong>详细错误信息</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe pod calico-kube-controllers-7498b9bb4c-dfjfp -n kube-system
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">calico</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controllers</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7498</span><span style="color: #D8DEE9">b9bb4c</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dfjfp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">system</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>错误输出</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Events:
 Type     Reason   Age                   From     Message ----     ------   ----                  ----     ------- Normal   Pulling  15m (x130 over 10h)   kubelet  Pulling image "docker.io/calico/kube-controllers:v3.25.0" Warning  Failed   15m (x130 over 10h)   kubelet  Failed to pull image "docker.io/calico/kube-controllers:v3.25.0": failed to pull and unpack image "docker.io/calico/kube-controllers:v3.25.0": failed to resolve reference "docker.io/calico/kube-controllers:v3.25.0": failed to do request: Head "https://registry-1.docker.io/v2/calico/kube-controllers/manifests/v3.25.0": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused Normal   BackOff  20s (x2897 over 10h)  kubelet  Back-off pulling image "docker.io/calico/kube-controllers:v3.25.0" Warning  Failed   20s (x2897 over 10h)  kubelet  Error: ImagePullBackOff
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">Events</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Type</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Reason</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Age</span><span style="color: #D8DEE9FF">                   </span><span style="color: #D8DEE9">From</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Message</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">----</span><span style="color: #D8DEE9FF">     </span><span style="color: #81A1C1">------</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">----</span><span style="color: #D8DEE9FF">                  </span><span style="color: #81A1C1">----</span><span style="color: #D8DEE9FF">     </span><span style="color: #81A1C1">-------</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Normal</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Pulling</span><span style="color: #D8DEE9FF">  15</span><span style="color: #88C0D0">m</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">x130</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">over</span><span style="color: #D8DEE9FF"> 10</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">kubelet</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">Pulling</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/calico/kube-controllers:v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Warning</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF">   15</span><span style="color: #88C0D0">m</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">x130</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">over</span><span style="color: #D8DEE9FF"> 10</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">kubelet</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/calico/kube-controllers:v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unpack</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/calico/kube-controllers:v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">resolve</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reference</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/calico/kube-controllers:v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Head</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://registry-1.docker.io/v2/calico/kube-controllers/manifests/v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">proxyconnect</span><span style="color: #D8DEE9FF"> tcp</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dial</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tcp</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">127.0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.1</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">7890</span><span style="color: #D8DEE9FF">: connect</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connection</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">refused</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Normal</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">BackOff</span><span style="color: #D8DEE9FF">  20</span><span style="color: #88C0D0">s</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">x2897</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">over</span><span style="color: #D8DEE9FF"> 10</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF">)  </span><span style="color: #D8DEE9">kubelet</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">Back</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">off</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pulling</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/calico/kube-controllers:v3.25.0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Warning</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF">   20</span><span style="color: #88C0D0">s</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">x2897</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">over</span><span style="color: #D8DEE9FF"> 10</span><span style="color: #D8DEE9">h</span><span style="color: #D8DEE9FF">)  </span><span style="color: #D8DEE9">kubelet</span><span style="color: #D8DEE9FF">  Error</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ImagePullBackOff</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="1-3-重新创建集群">1.3 重新创建集群<a href="http://is.iceymoss.com/blog/4#1-3-%E9%87%8D%E6%96%B0%E5%88%9B%E5%BB%BA%E9%9B%86%E7%BE%A4"></a></h3>



<p class="wp-block-paragraph">删除有问题的集群，重新创建：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 删除现有集群&lt;/em>
kind delete cluster --name dev
kind delete cluster --name kind

&lt;em># 重新创建集群，使用稳定版本&lt;/em>
kind create cluster --name dev --image kindest/node:v1.23.6
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 删除现有集群</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kind</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 重新创建集群，使用稳定版本</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kindest</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">node</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">23.6</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Creating cluster "dev" ...
 ✓ Ensuring node image (kindest/node:v1.23.6) 🖼
 ✓ Preparing nodes 📦  
✓ Writing configuration 📜 
⠎⠁ Starting control-plane 🕹️ 
✓ Starting control-plane 🕹️ 
✓ Installing CNI 🔌 
✓ Installing StorageClass 💾 
Set kubectl context to "kind-dev"
You can now use your cluster with:

kubectl cluster-info --context kind-dev

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Creating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dev</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Ensuring</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">image</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">kindest</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">23.6</span><span style="color: #D8DEE9FF">) 🖼</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Preparing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> 📦  </span></span>
<span class="line"><span style="color: #D8DEE9FF">✓ </span><span style="color: #D8DEE9">Writing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configuration</span><span style="color: #D8DEE9FF"> 📜 </span></span>
<span class="line"><span style="color: #D8DEE9FF">⠎⠁ </span><span style="color: #D8DEE9">Starting</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF"> 🕹️ </span></span>
<span class="line"><span style="color: #D8DEE9FF">✓ </span><span style="color: #D8DEE9">Starting</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF"> 🕹️ </span></span>
<span class="line"><span style="color: #D8DEE9FF">✓ </span><span style="color: #D8DEE9">Installing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CNI</span><span style="color: #D8DEE9FF"> 🔌 </span></span>
<span class="line"><span style="color: #D8DEE9FF">✓ </span><span style="color: #D8DEE9">Installing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">StorageClass</span><span style="color: #D8DEE9FF"> 💾 </span></span>
<span class="line"><span style="color: #D8DEE9">Set</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">kind-dev</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9">You</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">can</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">now</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">use</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">your</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">Have</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">question</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">bug</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">or</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">feature</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">request</span><span style="color: #81A1C1">?</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Let</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">us</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">know</span><span style="color: #81A1C1">!</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">https</span><span style="color: #81A1C1">:</span><span style="color: #616E88">//kind.sigs.k8s.io/#community 🙂</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>成功指标</strong>：</p>



<ul class="wp-block-list">
<li>使用稳定的 v1.23.6 版本</li>



<li>自动安装默认的 kindnet 网络插件</li>



<li>避免 Calico 的镜像拉取问题</li>
</ul>



<h3 class="wp-block-heading" id="1-4-集群验证">1.4 集群验证<a href="http://is.iceymoss.com/blog/4#1-4-%E9%9B%86%E7%BE%A4%E9%AA%8C%E8%AF%81"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查集群状态&lt;/em>
kubectl cluster-info --context kind-dev
kubectl get nodes
kubectl get pods -n kube-system
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查集群状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">system</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 集群信息&lt;/em>
Kubernetes control plane is running at https://127.0.0.1:33427
CoreDNS is running at https://127.0.0.1:33427/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

&lt;em># 节点状态&lt;/em>
NAME                STATUS   ROLES                  AGE     VERSION
dev-control-plane   Ready    control-plane,master   4m39s   v1.23.6

&lt;em># 系统Pods状态&lt;/em>
NAME                                        READY   STATUS    RESTARTS   AGE
coredns-64897985d-gg4ng                     1/1     Running   0          4m26s
coredns-64897985d-smmdx                     1/1     Running   0          4m26s
etcd-dev-control-plane                      1/1     Running   0          4m42s
kindnet-6x6jx                               1/1     Running   0          4m26s
kube-apiserver-dev-control-plane            1/1     Running   0          4m41s
kube-controller-manager-dev-control-plane   1/1     Running   0          4m41s
kube-proxy-9xrkn                            1/1     Running   0          4m26s
kube-scheduler-dev-control-plane            1/1     Running   0          4m40s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 集群信息</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">Kubernetes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">control</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">running</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">at</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//127.0.0.1:33427</span></span>
<span class="line"><span style="color: #D8DEE9">CoreDNS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">running</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">at</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//127.0.0.1:33427/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 节点状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ROLES</span><span style="color: #D8DEE9FF">                  </span><span style="color: #D8DEE9">AGE</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">VERSION</span></span>
<span class="line"><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">Ready</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9">master</span><span style="color: #D8DEE9FF">   4</span><span style="color: #D8DEE9">m39s</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">23.6</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 系统Pods状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                        </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">coredns</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">64897985</span><span style="color: #D8DEE9">d</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">gg4ng</span><span style="color: #D8DEE9FF">                     </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m26s</span></span>
<span class="line"><span style="color: #D8DEE9">coredns</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">64897985</span><span style="color: #D8DEE9">d</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">smmdx</span><span style="color: #D8DEE9FF">                     </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m26s</span></span>
<span class="line"><span style="color: #D8DEE9">etcd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">                      </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m42s</span></span>
<span class="line"><span style="color: #D8DEE9">kindnet</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">6</span><span style="color: #D8DEE9">x6jx</span><span style="color: #D8DEE9FF">                               </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m26s</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">apiserver</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">            </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m41s</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">manager</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m41s</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">proxy</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">9</span><span style="color: #D8DEE9">xrkn</span><span style="color: #D8DEE9FF">                            </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m26s</span></span>
<span class="line"><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">scheduler</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">            </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          4</span><span style="color: #D8DEE9">m40s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>验证结果</strong>：</p>



<ul class="wp-block-list">
<li>控制平面正常运行</li>



<li>所有核心 Pods 状态正常</li>



<li>使用 kindnet 网络插件，运行稳定</li>
</ul>



<h2 class="wp-block-heading" id="Go-Web应用开发">Go Web 应用开发<a href="http://is.iceymoss.com/blog/4#Go-Web%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91"></a></h2>



<h3 class="wp-block-heading" id="2-1-应用代码">2.1 应用代码<a href="http://is.iceymoss.com/blog/4#2-1-%E5%BA%94%E7%94%A8%E4%BB%A3%E7%A0%81"></a></h3>



<p class="wp-block-paragraph">你可以使用:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>go mod init ${project_name}
例如：
go mod init github/xxxxxx/go-web
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">init</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">project_name</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9">例如</span><span style="color: #D8DEE9FF">：</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">init</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">github</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">xxxxxx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">使用&nbsp;<code>vim main.go</code>&nbsp;写入以下内容后，并且执行&nbsp;<code>go mod tidy</code>&nbsp;对依赖进行加载</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package main

import (
 "net/http" "github.com/gin-gonic/gin")

func Pong(c *gin.Context) {
 c.JSON(http.StatusOK, gin.H{ "name":   "xxxxxx", "age":    18, "school": "家里蹲大学",
 })}

func main() {
 r := gin.Default() r.GET("/ping", Pong) r.Run("0.0.0.0:8080")}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">package</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">main</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">net/http</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">github.com/gin-gonic/gin</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">func</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Pong</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">c</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">gin</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">Context</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">c</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">JSON</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">http</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">StatusOK</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gin</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">H</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">   </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">func</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF"> r </span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gin</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Default</span><span style="color: #D8DEE9FF">() </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">GET</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/ping</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Pong</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Run</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">0.0.0.0:8080</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="2-2-Dockerfile构建">2.2 Dockerfile 构建<a href="http://is.iceymoss.com/blog/4#2-2-Dockerfile%E6%9E%84%E5%BB%BA"></a></h3>



<p class="wp-block-paragraph">项目根目录下创建一个&nbsp;<code>Dockerfile</code></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 构建阶段&lt;/em>
FROM golang:1.21-alpine AS builder

&lt;em># 设置工作目录&lt;/em>
WORKDIR /app

&lt;em># 设置国内Go代理（解决网络问题）&lt;/em>
RUN go env -w GOPROXY=https://goproxy.cn,direct

&lt;em># 预下载依赖 (利用Docker缓存层)&lt;/em>
COPY go.mod go.sum ./
RUN go mod download

&lt;em># 拷贝源代码&lt;/em>
COPY . .

&lt;em># 编译静态二进制文件&lt;/em>
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o go-web-app

&lt;em># 运行阶段 (使用极简镜像)&lt;/em>
FROM alpine:3.18

&lt;em># 安装CA证书&lt;/em>
RUN apk add --no-cache ca-certificates

&lt;em># 创建非root用户&lt;/em>
RUN adduser -D -u 10001 appuser
USER appuser

&lt;em># 从构建阶段复制二进制文件&lt;/em>
COPY --from=builder --chown=appuser /app/go-web-app /app/go-web-app

&lt;em># 设置环境变量&lt;/em>
ENV GIN_MODE=release
 PORT=8080
&lt;em># 暴露端口&lt;/em>
EXPOSE 8080

&lt;em># 启动应用&lt;/em>
ENTRYPOINT &#91;"/app/go-web-app"&#93;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 构建阶段</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">FROM</span><span style="color: #D8DEE9FF"> golang</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">1.21</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">AS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">builder</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 设置工作目录</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">WORKDIR</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 设置国内Go代理（解决网络问题）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">env</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">w</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GOPROXY</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//goproxy.cn,direct</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 预下载依赖 (利用Docker缓存层)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">COPY</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">mod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sum</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">download</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 拷贝源代码</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">COPY</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 编译静态二进制文件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CGO_ENABLED</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GOOS</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">linux</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ldflags</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-w -s</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">app</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 运行阶段 (使用极简镜像)</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">FROM</span><span style="color: #D8DEE9FF"> alpine</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">3.18</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 安装CA证书</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apk</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">no</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cache</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ca</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">certificates</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建非root用户</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adduser</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">D</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">u</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10001</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">appuser</span></span>
<span class="line"><span style="color: #D8DEE9">USER</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">appuser</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 从构建阶段复制二进制文件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">COPY</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">from</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">builder</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">chown</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">appuser</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">app</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">app</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 设置环境变量</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">ENV</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GIN_MODE</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">release</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PORT</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 暴露端口</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">EXPOSE</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 启动应用</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">ENTRYPOINT</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/app/go-web-app</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li>使用多阶段构建减小镜像大小</li>



<li>设置国内 Go 代理解决依赖下载问题</li>



<li>使用非 root 用户提高安全性</li>



<li>添加编译优化参数减小二进制大小</li>
</ul>



<h3 class="wp-block-heading" id="2-3-镜像构建">2.3 镜像构建<a href="http://is.iceymoss.com/blog/4#2-3-%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>docker build -t go-web:latest .
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">web</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>构建过程输出</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;+&#93; Building 337.3s (17/17) FINISHED                                                                                                                           
 => &#91;internal&#93; load build definition from Dockerfile                                                                                      0.0s 
 => => transferring dockerfile: 854B                                                                                                                                      0.0s 
 => &#91;internal&#93; load metadata for docker.io/library/alpine:3.18                                                                                                     3.5s 
 => &#91;internal&#93; load metadata for docker.io/library/golang:1.21-alpine                                                                                                     4.3s 
 => &#91;internal&#93; load .dockerignore                                                                                                                                         0.0s 
 => => transferring context: 2B                                                                                                                                      0.0s 
 => &#91;builder 1/7&#93; FROM docker.io/library/golang:1.21-alpine@sha256:2414035b086e3c42b99654c8b26e6f5b1b1598080d65fd03c7f499552ff4dc94                                      47.5s 
 => => resolve docker.io/library/golang:1.21-alpine@sha256:2414035b086e3c42b99654c8b26e6f5b1b1598080d65fd03c7f499552ff4dc94                                               0.0s 
 => => extracting sha256:c6a83fedfae6ed8a4f5f7cbb6a7b6f1c1ec3d86fea8cb9e5ba2e5e6673fde9f6                                                                                 0.1s 
 => => extracting sha256:41db7493d1c6f3f26428d119962e3862c14a9e20bb0b8fefc36e7282d015d099                                                                                 0.0s 
 => => extracting sha256:54bf7053e2d96c2c7f4637ad7580bd64345b3c9fabb163e1fdb8894aea8a9af0                                                                                 3.5s 
 => => extracting sha256:4579008f8500d429ec007d092329191009711942d9380d060c8d9bd24c0c352c                                                                                 0.0s 
 => => extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1                                                                                 0.0s 
 => &#91;stage-1 1/4&#93; FROM docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f                                              9.6s 
 => => resolve docker.io/library/alpine:3.18@sha256:de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f                                                      0.1s 
 => => extracting sha256:44cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885                                                                                 3.4MB                                                                                 9.4s
 => => extracting sha256:44cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885                                                                                 0.1s => &#91;stage-1 2/4&#93; RUN apk add --no-cache ca-certificates                                                                                                                322.7s => &#91;builder 2/7&#93; WORKDIR /app                                                                                                                                            1.9s => &#91;builder 3/7&#93; RUN go env -w GOPROXY=https://goproxy.cn,direct                                                                                                         0.3s => &#91;builder 4/7&#93; COPY go.mod go.sum ./                                                                                                                                   0.2s => &#91;builder 5/7&#93; RUN go mod download                                                                                                                                    35.1s => &#91;builder 6/7&#93; COPY . .                                                                                                                                                0.1s => &#91;builder 7/7&#93; RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o go-web-app                                                                                   15.4s => &#91;stage-1 3/4&#93; RUN adduser -D -u 10001 appuser                                                                                                                         0.3s => &#91;stage-1 4/4&#93; COPY --from=builder --chown=appuser /app/go-web-app /app/go-web-app                                                                                     0.1s => => exporting to image                                                                                                                                                 0.1s => => exporting layers                                                                                                                                                   0.1s => => writing image sha256:40a377fbf28772e04665a7ce2cb8ceebbcc6f4da3a6102eeb294627cef56047b                                                                              0.0s => => naming to docker.io/library/go-web:latest                                                                                                                          0.0s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">Building</span><span style="color: #D8DEE9FF"> 337</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">3</span><span style="color: #88C0D0">s</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">17</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">17</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">FINISHED</span><span style="color: #D8DEE9FF">                                                                                                                           </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">internal</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">definition</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Dockerfile</span><span style="color: #D8DEE9FF">                                                                                      0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">transferring</span><span style="color: #D8DEE9FF"> dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 854</span><span style="color: #D8DEE9">B</span><span style="color: #D8DEE9FF">                                                                                                                                      0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">internal</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">metadata</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">alpine</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">3.18</span><span style="color: #D8DEE9FF">                                                                                                     3</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">internal</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">metadata</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">golang</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">1.21</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF">                                                                                                     4</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">3</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">internal</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">dockerignore</span><span style="color: #D8DEE9FF">                                                                                                                                         0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">transferring</span><span style="color: #D8DEE9FF"> context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> 2</span><span style="color: #D8DEE9">B</span><span style="color: #D8DEE9FF">                                                                                                                                      0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">builder</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">FROM</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">golang</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">1.21</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF">@sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">2414035</span><span style="color: #D8DEE9">b086e3c42b99654c8b26e6f5b1b1598080d65fd03c7f499552ff4dc94</span><span style="color: #D8DEE9FF">                                      47</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">resolve</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">golang</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">1.21</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">alpine</span><span style="color: #D8DEE9FF">@sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">2414035</span><span style="color: #D8DEE9">b086e3c42b99654c8b26e6f5b1b1598080d65fd03c7f499552ff4dc94</span><span style="color: #D8DEE9FF">                                               0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">c6a83fedfae6ed8a4f5f7cbb6a7b6f1c1ec3d86fea8cb9e5ba2e5e6673fde9f6</span><span style="color: #D8DEE9FF">                                                                                 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">1</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">41</span><span style="color: #D8DEE9">db7493d1c6f3f26428d119962e3862c14a9e20bb0b8fefc36e7282d015d099</span><span style="color: #D8DEE9FF">                                                                                 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">54</span><span style="color: #D8DEE9">bf7053e2d96c2c7f4637ad7580bd64345b3c9fabb163e1fdb8894aea8a9af0</span><span style="color: #D8DEE9FF">                                                                                 3</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">4579008</span><span style="color: #D8DEE9">f8500d429ec007d092329191009711942d9380d060c8d9bd24c0c352c</span><span style="color: #D8DEE9FF">                                                                                 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">4</span><span style="color: #D8DEE9">f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1</span><span style="color: #D8DEE9FF">                                                                                 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">stage</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">FROM</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">alpine</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">3.18</span><span style="color: #D8DEE9FF">@sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f</span><span style="color: #D8DEE9FF">                                              9</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">6</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">resolve</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">alpine</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">3.18</span><span style="color: #D8DEE9FF">@sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">de0eb0b3f2a47ba1eb89389859a9bd88b28e82f5826b6969ad604979713c2d4f</span><span style="color: #D8DEE9FF">                                                      0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">1</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">44</span><span style="color: #D8DEE9">cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885</span><span style="color: #D8DEE9FF">                                                                                 3</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">4</span><span style="color: #D8DEE9">MB</span><span style="color: #D8DEE9FF">                                                                                 9</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">4</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extracting</span><span style="color: #D8DEE9FF"> sha256</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">44</span><span style="color: #D8DEE9">cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885</span><span style="color: #D8DEE9FF">                                                                                 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">1</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">stage</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apk</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">no</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cache</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ca</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">certificates</span><span style="color: #D8DEE9FF">                                                                                                                322</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">7</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">builder</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">WORKDIR</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span><span style="color: #D8DEE9FF">                                                                                                                                            1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">9</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">builder</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">env</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">w</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GOPROXY</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//goproxy.cn,direct                                                                                                         0.3s =&gt; &#91;builder 4/7&#93; COPY go.mod go.sum ./                                                                                                                                   0.2s =&gt; &#91;builder 5/7&#93; RUN go mod download                                                                                                                                    35.1s =&gt; &#91;builder 6/7&#93; COPY . .                                                                                                                                                0.1s =&gt; &#91;builder 7/7&#93; RUN CGO_ENABLED=0 GOOS=linux go build -ldflags=&#39;-w -s&#39; -o go-web-app                                                                                   15.4s =&gt; &#91;stage-1 3/4&#93; RUN adduser -D -u 10001 appuser                                                                                                                         0.3s =&gt; &#91;stage-1 4/4&#93; COPY --from=builder --chown=appuser /app/go-web-app /app/go-web-app                                                                                     0.1s =&gt; =&gt; exporting to image                                                                                                                                                 0.1s =&gt; =&gt; exporting layers                                                                                                                                                   0.1s =&gt; =&gt; writing image sha256:40a377fbf28772e04665a7ce2cb8ceebbcc6f4da3a6102eeb294627cef56047b                                                                              0.0s =&gt; =&gt; naming to docker.io/library/go-web:latest                                                                                                                          0.0s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>构建结果</strong>：</p>



<ul class="wp-block-list">
<li>镜像大小：15MB（非常轻量）</li>



<li>构建时间：约 5 分钟</li>



<li>构建成功，无错误</li>
</ul>



<h3 class="wp-block-heading" id="2-4-本地测试">2.4 本地测试<a href="http://is.iceymoss.com/blog/4#2-4-%E6%9C%AC%E5%9C%B0%E6%B5%8B%E8%AF%95"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 测试运行容器&lt;/em>
docker run -d --name go-web-test -p 8080:8080 go-web:latest

&lt;em># 检查容器状态&lt;/em>
docker ps

&lt;em># 测试API接口&lt;/em>
curl http://localhost:8080/ping
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 测试运行容器</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">run</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">d</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">test</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">web</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查容器状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ps</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 测试API接口</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//localhost:8080/ping</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 容器启动
2cbdbdf8a448b64c43f9c005dda4ab79c08e7722ea0d2b558543d6e80cb0814a

# 容器状态
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                         NAMES
2cbdbdf8a448   go-web:latest          "/app/go-web-app"        6 seconds ago    Up 6 seconds    0.0.0.0:8080->8080/tcp, &#91;::&#93;:8080->8080/tcp   go-web-test

# API测试结果
{"age":18,"name":"xxxxxx","school":"家里蹲大学"}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">容器启动</span></span>
<span class="line"><span style="color: #D8DEE9FF">2</span><span style="color: #D8DEE9">cbdbdf8a448b64c43f9c005dda4ab79c08e7722ea0d2b558543d6e80cb0814a</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">容器状态</span></span>
<span class="line"><span style="color: #D8DEE9">CONTAINER</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ID</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">IMAGE</span><span style="color: #D8DEE9FF">                  </span><span style="color: #D8DEE9">COMMAND</span><span style="color: #D8DEE9FF">                  </span><span style="color: #D8DEE9">CREATED</span><span style="color: #D8DEE9FF">          </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">          </span><span style="color: #D8DEE9">PORTS</span><span style="color: #D8DEE9FF">                                         </span><span style="color: #D8DEE9">NAMES</span></span>
<span class="line"><span style="color: #D8DEE9FF">2</span><span style="color: #D8DEE9">cbdbdf8a448</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">web</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span><span style="color: #D8DEE9FF">          </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/app/go-web-app</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">6</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">seconds</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ago</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">Up</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">6</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">seconds</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0.0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.0</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #81A1C1">-&gt;</span><span style="color: #B48EAD">8080</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">tcp</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> &#91;::&#93;:</span><span style="color: #B48EAD">8080</span><span style="color: #81A1C1">-&gt;</span><span style="color: #B48EAD">8080</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">tcp</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">test</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">API测试结果</span></span>
<span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>测试结果</strong>：</p>



<ul class="wp-block-list">
<li>容器启动成功</li>



<li>API 返回正确的 JSON 响应</li>



<li>应用功能正常</li>
</ul>



<h2 class="wp-block-heading" id="Kubernetes部署">Kubernetes 部署<a href="http://is.iceymoss.com/blog/4#Kubernetes%E9%83%A8%E7%BD%B2"></a></h2>



<h3 class="wp-block-heading" id="3-1-创建K8s配置文件">3.1 创建 K8s 配置文件<a href="http://is.iceymoss.com/blog/4#3-1-%E5%88%9B%E5%BB%BAK8s%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"></a></h3>



<p class="wp-block-paragraph"><strong>deployment.yaml</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-web-deployment
  labels:
    app: go-web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-web
  template:
    metadata:
      labels:
        app: go-web
    spec:
      containers:
      - name: go-web
        image: go-web:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "64Mi"
            cpu: "50m"
          limits:
            memory: "128Mi"
            cpu: "100m"
        livenessProbe:
          httpGet:
            path: /ping
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ping
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Deployment</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span></span>
<span class="line"><span style="color: #D8DEE9FF">  labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  replicas</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span></span>
<span class="line"><span style="color: #D8DEE9FF">  selector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"><span style="color: #D8DEE9FF">  template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"><span style="color: #D8DEE9FF">    spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      containers</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"><span style="color: #D8DEE9FF">        image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">web</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">        ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9FF">        resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          requests</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            memory</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">64Mi</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            cpu</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">50m</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">          limits</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            memory</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">128Mi</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            cpu</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">100m</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        livenessProbe</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          httpGet</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ping</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9FF">          initialDelaySeconds</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30</span></span>
<span class="line"><span style="color: #D8DEE9FF">          periodSeconds</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span></span>
<span class="line"><span style="color: #D8DEE9FF">        readinessProbe</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          httpGet</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ping</span></span>
<span class="line"><span style="color: #D8DEE9FF">            port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9FF">          initialDelaySeconds</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5</span></span>
<span class="line"><span style="color: #D8DEE9FF">          periodSeconds</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>service.yaml</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  selector:
    app: go-web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Service</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  selector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">      port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9FF">      targetPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9FF">  type</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ClusterIP</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-2-部署应用">3.2 部署应用<a href="http://is.iceymoss.com/blog/4#3-2-%E9%83%A8%E7%BD%B2%E5%BA%94%E7%94%A8"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 部署应用&lt;/em>
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 部署应用</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>deployment.apps/go-web-deployment createdservice/go-web-service created
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">createdservice</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-3-遇到的第一个坑-镜像拉取失败">3.3 遇到的第一个坑：镜像拉取失败<a href="http://is.iceymoss.com/blog/4#3-3-%E9%81%87%E5%88%B0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%9D%91-%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E5%A4%B1%E8%B4%A5"></a></h3>



<p class="wp-block-paragraph"><strong>问题现象</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get podsNAME READY   STATUS             RESTARTS   
AGEgo-web-deployment-cfc7cccbd-ckgrp 0/1     ImagePullBackOff   0          24sgo-web-deployment-cfc7cccbd-xfdhq 0/1     ImagePullBackOff   0          24s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">podsNAME</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9">AGEgo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cfc7cccbd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ckgrp</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">ImagePullBackOff</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          24</span><span style="color: #D8DEE9">sgo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cfc7cccbd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">xfdhq</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">ImagePullBackOff</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          24</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>检查部署状态</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get deploymentsNAME READY   UP-TO-DATE   AVAILABLE   AGEgo-web-deployment 0/2     2            0           13s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deploymentsNAME</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">UP</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">TO</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">DATE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AVAILABLE</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGEgo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">     </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">            </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">           13</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>错误信息</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Failed to pull image "go-web:latest": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/go-web:latest"
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">go-web:latest</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">rpc</span><span style="color: #D8DEE9FF"> error</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">code</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Unknown</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">desc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unpack</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">docker.io/library/go-web:latest</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>问题分析</strong>：</p>



<ul class="wp-block-list">
<li>K8s 试图从 Docker Hub 拉取镜像</li>



<li>但我们的镜像是本地构建的</li>



<li>Kind 集群无法直接访问宿主机的 Docker 镜像</li>
</ul>



<p class="wp-block-paragraph"><strong>解决方案</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 将本地镜像加载到kind集群&lt;/em>
kind load docker-image go-web:latest --name dev

&lt;em># 验证镜像加载&lt;/em>
docker exec dev-control-plane crictl images | grep go-web
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 将本地镜像加载到kind集群</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">web</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 验证镜像加载</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">exec</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">crictl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">images</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 镜像加载&lt;/em>
Image: "go-web:latest" with ID "sha256:40a377fbf28772e04665a7ce2cb8ceebbcc6f4da3a6102eeb294627cef56047b" found to be already present on all nodes.

&lt;em># 验证镜像&lt;/em>
docker.io/library/go-web                   latest               40a377fbf2877       15.5MB
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 镜像加载</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">Image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">go-web:latest</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ID</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sha256:40a377fbf28772e04665a7ce2cb8ceebbcc6f4da3a6102eeb294627cef56047b</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">found</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">be</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">already</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">present</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 验证镜像</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #D8DEE9FF">                   </span><span style="color: #D8DEE9">latest</span><span style="color: #D8DEE9FF">               40</span><span style="color: #D8DEE9">a377fbf2877</span><span style="color: #D8DEE9FF">       15</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">MB</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-4-遇到的第二个坑-镜像拉取策略">3.4 遇到的第二个坑：镜像拉取策略<a href="http://is.iceymoss.com/blog/4#3-4-%E9%81%87%E5%88%B0%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%9D%91-%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E7%AD%96%E7%95%A5"></a></h3>



<p class="wp-block-paragraph"><strong>问题现象</strong>：<br>即使镜像已加载到集群，Pods 仍然出现 ImagePullBackOff 错误。</p>



<p class="wp-block-paragraph"><strong>根本原因</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get deployment go-web-deployment -o yaml | grep imagePullPolicyimagePullPolicy: Always
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF"> imagePullPolicyimagePullPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Always</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><code>imagePullPolicy: Always</code>&nbsp;导致 K8s 总是尝试从远程仓库拉取镜像。</p>



<p class="wp-block-paragraph"><strong>解决方案</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 修改镜像拉取策略为Never&lt;/em>
kubectl patch deployment go-web-deployment -p '{"spec":{"template":{"spec":{"containers":&#91;{"name":"go-web","imagePullPolicy":"Never"}&#93;}}}}'

&lt;em># 重启部署&lt;/em>
kubectl rollout restart deployment/go-web-deployment
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 修改镜像拉取策略为Never</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">{&quot;spec&quot;:{&quot;template&quot;:{&quot;spec&quot;:{&quot;containers&quot;:&#91;{&quot;name&quot;:&quot;go-web&quot;,&quot;imagePullPolicy&quot;:&quot;Never&quot;}&#93;}}}}</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 重启部署</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rollout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">restart</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 修改策略&lt;/em>
deployment.apps/go-web-deployment patched

&lt;em># 重启部署&lt;/em>
deployment.apps/go-web-deployment restarted

&lt;em># 检查Pods状态&lt;/em>
NAME                                 READY   STATUS    RESTARTS   AGE
go-web-deployment-7b85d85d64-nd5zp   1/1     Running   0          29s
go-web-deployment-7b85d85d64-vbqjt   1/1     Running   0          19s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 修改策略</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">patched</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 重启部署</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">restarted</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查Pods状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                 </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7</span><span style="color: #D8DEE9">b85d85d64</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nd5zp</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          29</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7</span><span style="color: #D8DEE9">b85d85d64</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">vbqjt</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          19</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="3-5-部署成功验证">3.5 部署成功验证<a href="http://is.iceymoss.com/blog/4#3-5-%E9%83%A8%E7%BD%B2%E6%88%90%E5%8A%9F%E9%AA%8C%E8%AF%81"></a></h3>



<p class="wp-block-paragraph"><strong>Pods 状态</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get podsNAME READY   STATUS    RESTARTS   AGEgo-web-deployment-7b85d85d64-nd5zp 1/1     Running   0          29sgo-web-deployment-7b85d85d64-vbqjt 1/1     Running   0          19s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">podsNAME</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGEgo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7</span><span style="color: #D8DEE9">b85d85d64</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nd5zp</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          29</span><span style="color: #D8DEE9">sgo</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">7</span><span style="color: #D8DEE9">b85d85d64</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">vbqjt</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          19</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>服务测试</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 端口转发&lt;/em>
kubectl port-forward service/go-web-service 8080:80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 端口转发</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">forward</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>端口转发输出</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from &#91;::1&#93;:8080 -> 8080
Handling connection for 8080
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Forwarding</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">127.0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.1</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9">Forwarding</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> &#91;::</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93;:</span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9">Handling</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connection</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># API测试&lt;/em>
curl http://localhost:8080/ping
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># API测试</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//localhost:8080/ping</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>测试结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading" id="关键经验总结">关键经验总结<a href="http://is.iceymoss.com/blog/4#%E5%85%B3%E9%94%AE%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93"></a></h2>



<h3 class="wp-block-heading" id="1-网络环境配置">1. 网络环境配置<a href="http://is.iceymoss.com/blog/4#1-%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE"></a></h3>



<ul class="wp-block-list">
<li>国内环境需要配置合适的镜像源</li>



<li>避免过多镜像源配置导致冲突</li>



<li>使用稳定的网络插件（kindnet vs Calico）</li>
</ul>



<h3 class="wp-block-heading" id="2-镜像管理">2. 镜像管理<a href="http://is.iceymoss.com/blog/4#2-%E9%95%9C%E5%83%8F%E7%AE%A1%E7%90%86"></a></h3>



<ul class="wp-block-list">
<li>本地镜像需要显式加载到 Kind 集群</li>



<li>正确设置 imagePullPolicy 避免不必要的远程拉取</li>



<li>使用多阶段构建优化镜像大小</li>
</ul>



<h3 class="wp-block-heading" id="3-部署最佳实践">3. 部署最佳实践<a href="http://is.iceymoss.com/blog/4#3-%E9%83%A8%E7%BD%B2%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5"></a></h3>



<ul class="wp-block-list">
<li>设置资源限制和健康检查</li>



<li>使用非 root 用户运行容器</li>



<li>配置合适的副本数保证高可用</li>
</ul>



<h3 class="wp-block-heading" id="4-问题排查方法">4. 问题排查方法<a href="http://is.iceymoss.com/blog/4#4-%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5%E6%96%B9%E6%B3%95"></a></h3>



<ul class="wp-block-list">
<li>使用&nbsp;<code>kubectl describe pod</code>&nbsp;查看详细错误信息</li>



<li>检查镜像拉取策略和网络配置</li>



<li>验证集群和镜像状态</li>
</ul>



<h2 class="wp-block-heading" id="配置Ingress实现外部访问">配置 Ingress 实现外部访问<a href="http://is.iceymoss.com/blog/4#%E9%85%8D%E7%BD%AEIngress%E5%AE%9E%E7%8E%B0%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE"></a></h2>



<p class="wp-block-paragraph">下面我们在 Kind Kubernetes 集群中配置 NGINX Ingress Controller 的完整过程，包括遇到的问题、解决方案和最佳实践。</p>



<p class="wp-block-paragraph">这里我们先注意一下版本信息</p>



<ul class="wp-block-list">
<li><strong>Kubernetes 版本</strong>: v1.23.6</li>



<li><strong>Ingress Controller</strong>: NGINX Ingress Controller v1.8.1</li>
</ul>



<h3 class="wp-block-heading" id="4-1-Kind配置">4.1 Kind 配置<a href="http://is.iceymoss.com/blog/4#4-1-Kind%E9%85%8D%E7%BD%AE"></a></h3>



<p class="wp-block-paragraph">由于我们需要对外暴露服务，我们需要重新调整一下 Kind 集群的配置，我们先来写一个 Kind 配置：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 创建kind-config.yaml&lt;/em>
cat > kind-config.yaml &lt;&lt; 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
  - containerPort: 30000
    hostPort: 30000
    protocol: TCP
  - containerPort: 32767
    hostPort: 32767
    protocol: TCP
EOF
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 创建kind-config.yaml</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">cat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">config</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">EOF</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Cluster</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kind</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">x</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1alpha4</span></span>
<span class="line"><span style="color: #D8DEE9FF">nodes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> role</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span></span>
<span class="line"><span style="color: #D8DEE9FF">  extraPortMappings</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9FF">    hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #D8DEE9FF">    protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">443</span></span>
<span class="line"><span style="color: #D8DEE9FF">    hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">443</span></span>
<span class="line"><span style="color: #D8DEE9FF">    protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30000</span></span>
<span class="line"><span style="color: #D8DEE9FF">    hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">30000</span></span>
<span class="line"><span style="color: #D8DEE9FF">    protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32767</span></span>
<span class="line"><span style="color: #D8DEE9FF">    hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32767</span></span>
<span class="line"><span style="color: #D8DEE9FF">    protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">TCP</span></span>
<span class="line"><span style="color: #D8DEE9">EOF</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-2-kind集群创建">4.2 kind 集群创建<a href="http://is.iceymoss.com/blog/4#4-2-kind%E9%9B%86%E7%BE%A4%E5%88%9B%E5%BB%BA"></a></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 删除现有集群&lt;/em>
kind  delete  cluster  --name  dev
&lt;em># 使用新配置创建集群&lt;/em>
kind  create  cluster  --name  dev  --config  kind-config.yaml  --image  kindest/node:v1.23.6
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 删除现有集群</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">delete</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 使用新配置创建集群</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">config</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">kind</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">config</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">kindest</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">node</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">23.6</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Creating cluster "dev" ...
 ✓ Ensuring node image (kindest/node:v1.23.6) 🖼
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-dev"
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Creating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cluster</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dev</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Ensuring</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">image</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">kindest</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">23.6</span><span style="color: #D8DEE9FF">) 🖼</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Preparing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> 📦  </span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Writing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configuration</span><span style="color: #D8DEE9FF"> 📜</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Starting</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF"> 🕹️</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Installing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CNI</span><span style="color: #D8DEE9FF"> 🔌</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ✓ </span><span style="color: #D8DEE9">Installing</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">StorageClass</span><span style="color: #D8DEE9FF"> 💾</span></span>
<span class="line"><span style="color: #D8DEE9">Set</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">context</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">kind-dev</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="验证集群状态">验证集群状态<a href="http://is.iceymoss.com/blog/4#%E9%AA%8C%E8%AF%81%E9%9B%86%E7%BE%A4%E7%8A%B6%E6%80%81"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl  cluster-info
kubectl  get  nodes
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">cluster</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">info</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">nodes</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-3-重新部署Go-Web应用">4.3 重新部署 Go Web 应用<a href="http://is.iceymoss.com/blog/4#4-3-%E9%87%8D%E6%96%B0%E9%83%A8%E7%BD%B2Go-Web%E5%BA%94%E7%94%A8"></a></h3>



<p class="wp-block-paragraph">由于重新创建集群了，现在需要将我们的服务重新部署起来：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 部署应用&lt;/em>
kubectl  apply  -f  deployment.yaml
kubectl  apply  -f  service.yaml

&lt;em># 检查状态&lt;/em>
kubectl  get  pods
kubectl  get  svc
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 部署应用</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">service</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">pods</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">svc</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                                 READY   STATUS    RESTARTS   AGE
go-web-deployment-79bd88cb47-rldr5   1/1     Running   0          11s
go-web-deployment-79bd88cb47-ztcnl   1/1     Running   0          21s
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
go-web-service   ClusterIP   10.96.195.234   &lt;none>        80/TCP    72m
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                 </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">79</span><span style="color: #D8DEE9">bd88cb47</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">rldr5</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          11</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">deployment</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">79</span><span style="color: #D8DEE9">bd88cb47</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ztcnl</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          21</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">TYPE</span><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">CLUSTER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">EXTERNAL</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF">   </span><span style="color: #88C0D0">PORT</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">S</span><span style="color: #D8DEE9FF">)   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">ClusterIP</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">10.96</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">195.234</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">none</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">TCP</span><span style="color: #D8DEE9FF">    72</span><span style="color: #D8DEE9">m</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">测试一下 web 服务是否能正常访问：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 端口转发测试&lt;/em>
kubectl  port-forward  service/go-web-service  8080:80  &amp;
curl  http://localhost:8080/ping
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 端口转发测试</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">forward</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">8080</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&amp;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF">  http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//localhost:8080/ping</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-4-Ingress-Controller-配置">4.4 Ingress Controller 配置<a href="http://is.iceymoss.com/blog/4#4-4-Ingress-Controller-%E9%85%8D%E7%BD%AE"></a></h3>



<h4 class="wp-block-heading" id="镜像准备">镜像准备<a href="http://is.iceymoss.com/blog/4#%E9%95%9C%E5%83%8F%E5%87%86%E5%A4%87"></a></h4>



<p class="wp-block-paragraph">由于我们 K8S 集群还没配置对外访问，我们需要提前准备一下镜像</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 拉取Ingress Controller镜像&lt;/em>
docker  pull  registry.k8s.io/ingress-nginx/controller:v1.8.1
docker  pull  registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407

&lt;em># 加载镜像到集群&lt;/em>
kind  load  docker-image  registry.k8s.io/ingress-nginx/controller:v1.8.1  --name  dev

kind  load  docker-image  registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407  --name  dev
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 拉取Ingress Controller镜像</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">controller</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">8.1</span></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">webhook</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">certgen</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v20230407</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 加载镜像到集群</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">controller</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v1</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">8.1</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">kind</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">load</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">registry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kube</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">webhook</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">certgen</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">v20230407</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">name</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Image: "registry.k8s.io/ingress-nginx/controller:v1.8.1" with ID "sha256:825aff16c20cc2c6039fce49bafaa0f510de0f9238da475f3de949adadb9be7f" not yet present on node "dev-control-plane", loading...

Image: "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407" with ID "sha256:7e7451bb70423d31bdadcf0a71a3107b64858eccd7827d066234650b5e7b36b0" not yet present on node "dev-control-plane", loading...
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">Image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">registry.k8s.io/ingress-nginx/controller:v1.8.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ID</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sha256:825aff16c20cc2c6039fce49bafaa0f510de0f9238da475f3de949adadb9be7f</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yet</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">present</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dev-control-plane</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">loading</span><span style="color: #81A1C1">...</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">Image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ID</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sha256:7e7451bb70423d31bdadcf0a71a3107b64858eccd7827d066234650b5e7b36b0</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">yet</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">present</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dev-control-plane</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">loading</span><span style="color: #81A1C1">...</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="下载配置文件">下载配置文件<a href="http://is.iceymoss.com/blog/4#%E4%B8%8B%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 下载Ingress Controller配置文件&lt;/em>
wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/kind/deploy.yaml  -O  ingress-nginx-kind.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 下载Ingress Controller配置文件</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">wget</span><span style="color: #D8DEE9FF">  https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/kind/deploy.yaml  -O  ingress-nginx-kind.yaml</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>--2025-08-02 16:09:28--  https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/kind/deploy.yaml
Connecting to 127.0.0.1:7890... connected.
Proxy request sent, awaiting response... 200 OK
Length: 15997 (16K) &#91;text/plain&#93;
Saving to: 'ingress-nginx-kind.yaml'
ingress-nginx-kind.yaml                     100%&#91;==========================================================================================>&#93;  15.62K  --.-KB/s    in 0.02s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">--</span><span style="color: #B48EAD">2025</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">08</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">02</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">16</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">09</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">28</span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF">  https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/kind/deploy.yaml</span></span>
<span class="line"><span style="color: #D8DEE9">Connecting</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">127.0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.1</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">7890.</span><span style="color: #ECEFF4">..</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">connected</span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9">Proxy</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">request</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sent</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">awaiting</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">response</span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">OK</span></span>
<span class="line"><span style="color: #D8DEE9FF">Length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">15997</span><span style="color: #D8DEE9FF"> (16</span><span style="color: #D8DEE9">K</span><span style="color: #D8DEE9FF">) &#91;</span><span style="color: #D8DEE9">text</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">plain</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9">Saving</span><span style="color: #D8DEE9FF"> to</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">ingress-nginx-kind.yaml</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span><span style="color: #D8DEE9FF">                     </span><span style="color: #B48EAD">100</span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #81A1C1">==========================================================================================&gt;</span><span style="color: #D8DEE9FF">&#93;  15</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">62</span><span style="color: #D8DEE9">K</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">KB</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">02</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="修改配置文件">修改配置文件<a href="http://is.iceymoss.com/blog/4#%E4%BF%AE%E6%94%B9%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"></a></h4>



<p class="wp-block-paragraph">需要修改三个关键配置：</p>



<ol class="wp-block-list">
<li><strong>去掉镜像的 sha256 部分</strong></li>



<li><strong>修改镜像拉取策略为 Never</strong></li>



<li><strong>确保节点选择器正确</strong></li>
</ol>



<p class="wp-block-paragraph">需要将镜像拉取策略改为 Never，并且去掉镜像的 sha256 部分。<br>例如：<code>imagePullPolicy: Never</code></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 修改镜像拉取策略&lt;/em>
imagePullPolicy: IfNotPresent
&lt;em># 改为：&lt;/em>
imagePullPolicy: Never

&lt;em># 去掉镜像的sha256部分（手动编辑）&lt;/em>
&lt;em># image: registry.k8s.io/ingress-nginx/controller:v1.8.1@sha256:e5c4824e7375fcf2a393e1c03c293b69759af37a9ca6abdb91b13d78a93da8bd&lt;/em>
&lt;em># 改为：&lt;/em>
&lt;em># image: registry.k8s.io/ingress-nginx/controller:v1.8.1&lt;/em>

&lt;em># 将以下行：&lt;/em>
&lt;em># image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b&lt;/em>
&lt;em># 改为：&lt;/em>
&lt;em># image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 修改镜像拉取策略</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imagePullPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IfNotPresent</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 改为：</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imagePullPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Never</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 去掉镜像的sha256部分（手动编辑）</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># image: registry.k8s.io/ingress-nginx/controller:v1.8.1@sha256:e5c4824e7375fcf2a393e1c03c293b69759af37a9ca6abdb91b13d78a93da8bd</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 改为：</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># image: registry.k8s.io/ingress-nginx/controller:v1.8.1</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 将以下行：</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 改为：</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="节点标签配置">节点标签配置<a href="http://is.iceymoss.com/blog/4#%E8%8A%82%E7%82%B9%E6%A0%87%E7%AD%BE%E9%85%8D%E7%BD%AE"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 给节点添加必要的标签&lt;/em>
kubectl  label  node  dev-control-plane  ingress-ready=true
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 给节点添加必要的标签</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">label</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ready</span><span style="color: #81A1C1">=true</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-5-部署Ingress-Controller">4.5 部署 Ingress Controller<a href="http://is.iceymoss.com/blog/4#4-5-%E9%83%A8%E7%BD%B2Ingress-Controller"></a></h3>



<p class="wp-block-paragraph">准备好配置后，现在来部署 Ingress</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl  apply  -f  ingress-nginx-kind.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">kind</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">namespace</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">serviceaccount</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">serviceaccount</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">role</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">role</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">clusterrole</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">clusterrole</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">rolebinding</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">rolebinding</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">clusterrolebinding</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">clusterrolebinding</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">rbac</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">authorization</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">configmap</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">service</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">deployment</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">apps</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">job</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">batch</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">job</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">batch</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">ingressclass</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"><span style="color: #D8DEE9">validatingwebhookconfiguration</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">admissionregistration</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="验证部署状态">验证部署状态<a href="http://is.iceymoss.com/blog/4#%E9%AA%8C%E8%AF%81%E9%83%A8%E7%BD%B2%E7%8A%B6%E6%80%81"></a></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查Pod状态&lt;/em>
kubectl  get  pods  -n  ingress-nginx

&lt;em># 检查Job状态&lt;/em>
kubectl  get  jobs  -n  ingress-nginx
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查Pod状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">pods</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查Job状态</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">jobs</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-t6cf9        0/1     Completed   0          6s
ingress-nginx-admission-patch-xwfdv         0/1     Completed   1          6s
ingress-nginx-controller-76789fd998-9nfdl   1/1     Running     0          6s

NAME                             COMPLETIONS   DURATION   AGE

ingress-nginx-admission-create   1/1           3s         25s

ingress-nginx-admission-patch    1/1           4s         25s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                                        </span><span style="color: #D8DEE9">READY</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">STATUS</span><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">RESTARTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">create</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">t6cf9</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Completed</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          6</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">patch</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">xwfdv</span><span style="color: #D8DEE9FF">         </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Completed</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">          6</span><span style="color: #D8DEE9">s</span></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">controller</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">76789</span><span style="color: #D8DEE9">fd998</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">9</span><span style="color: #D8DEE9">nfdl</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">     </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF">     </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">          6</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">                             </span><span style="color: #D8DEE9">COMPLETIONS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">DURATION</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">create</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">           3</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">         25</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">nginx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">admission</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">patch</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">           4</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">         25</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-6-部署Ingress">4.6 部署 Ingress<a href="http://is.iceymoss.com/blog/4#4-6-%E9%83%A8%E7%BD%B2Ingress"></a></h3>



<p class="wp-block-paragraph">创建 Ingress 资源配置</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># ingress.yaml&lt;/em>
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: go-web-ingress
 annotations:
 nginx.ingress.kubernetes.io/rewrite-target: /
 nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
 ingressClassName: nginx
 rules:
- host: go-web.local
 http:
 paths:
- path: /
 pathType: Prefix
 backend:
 service:
 name: go-web-service
 port:
 number: 80
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># ingress.yaml</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">v1</span></span>
<span class="line"><span style="color: #D8DEE9FF">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9FF"> annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">rewrite</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">target</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">kubernetes</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ssl</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">redirect</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">false</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> ingressClassName</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nginx</span></span>
<span class="line"><span style="color: #D8DEE9FF"> rules</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">local</span></span>
<span class="line"><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> paths</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> path</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF"> pathType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Prefix</span></span>
<span class="line"><span style="color: #D8DEE9FF"> backend</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">service</span></span>
<span class="line"><span style="color: #D8DEE9FF"> port</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF"> number</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">部署 Ingress</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl  apply  -f  ingress.yaml
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">apply</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yaml</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ingress.networking.k8s.io/go-web-ingress created
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ingress</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">networking</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">k8s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">created</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">验证 Ingress 状态</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl  get  ingress
kubectl  describe  ingress  go-web-ingress
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">describe</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NAME            CLASS   HOSTS         ADDRESS   PORTS   AGE
go-web-ingress  nginx   go-web.local             80      10s
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">NAME</span><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">CLASS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">HOSTS</span><span style="color: #D8DEE9FF">         </span><span style="color: #D8DEE9">ADDRESS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">PORTS</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">AGE</span></span>
<span class="line"><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ingress</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">nginx</span><span style="color: #D8DEE9FF">   </span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">local</span><span style="color: #D8DEE9FF">             </span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF">      10</span><span style="color: #D8DEE9">s</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="4-6-测试外部访问">4.6 测试外部访问<a href="http://is.iceymoss.com/blog/4#4-6-%E6%B5%8B%E8%AF%95%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE"></a></h3>



<p class="wp-block-paragraph">配置 hosts 文件<br>这里我们先给内部访问添加一下域名：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 配置本地hosts&lt;/em>
echo  "127.0.0.1 go-web.local" >> /etc/hosts
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 配置本地hosts</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">127.0.0.1 go-web.local</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">hosts</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">测试访问</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 测试API访问&lt;/em>
curl  http://go-web.local/ping
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 测试API访问</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF">  http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//go-web.local/ping</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>执行结果</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">这样内部测试就没有问题啦，接下来我们要看看外部公网访问，你可能需要检查一下防火墙 80 端口可以访问，这里我使用本地的 PC 直接公网 ip 进行请求</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>PowerShell 7.5.2
PS C:\Users\SZ24-Storm006> curl http://14.159.10.1/ping
{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
PS C:\Users\SZ24-St
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">PowerShell</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">7.5</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">2</span></span>
<span class="line"><span style="color: #D8DEE9">PS</span><span style="color: #D8DEE9FF"> C</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">Users</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">SZ24</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Storm006</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//14.159.10.1/ping</span></span>
<span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9">PS</span><span style="color: #D8DEE9FF"> C</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">Users</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">SZ24</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">St</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">完美！这样我们就完成了从服务器 K8S 环境搭建，创建集群，镜像构建，服务部署，网关部署，对外提供服务整个流程，恭喜你，可以在自己的服务器上学习或者部署一些简单的应用了，当然如果你觉得这就完了，那就草率了，下面是我在整个流程中遇到的问题及其解决方案</p>



<h3 class="wp-block-heading" id="4-7-遇到的问题及其解决方案">4.7 遇到的问题及其解决方案<a href="http://is.iceymoss.com/blog/4#4-7-%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"></a></h3>



<h4 class="wp-block-heading" id="问题1-镜像拉取失败">问题 1：镜像拉取失败<a href="http://is.iceymoss.com/blog/4#%E9%97%AE%E9%A2%981-%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E5%A4%B1%E8%B4%A5"></a></h4>



<p class="wp-block-paragraph"><strong>现象</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Failed to pull image "registry.k8s.io/ingress-nginx/controller:v1.8.1": rpc error: code = Unknown desc = failed to pull and unpack image
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">registry.k8s.io/ingress-nginx/controller:v1.8.1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">rpc</span><span style="color: #D8DEE9FF"> error</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">code</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Unknown</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">desc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">failed</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unpack</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>原因</strong>：集群内部无法访问外网，镜像拉取失败<br><strong>解决方案</strong>：</p>



<ol class="wp-block-list">
<li>在宿主机拉取镜像</li>



<li>使用&nbsp;<code>kind load docker-image</code>&nbsp;加载到集群</li>



<li>设置&nbsp;<code>imagePullPolicy: Never</code></li>
</ol>



<h4 class="wp-block-heading" id="问题2-镜像版本不匹配">问题 2：镜像版本不匹配<a href="http://is.iceymoss.com/blog/4#%E9%97%AE%E9%A2%982-%E9%95%9C%E5%83%8F%E7%89%88%E6%9C%AC%E4%B8%8D%E5%8C%B9%E9%85%8D"></a></h4>



<p class="wp-block-paragraph"><strong>现象</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ErrImageNeverPull: Container image "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:..." is not present
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">ErrImageNeverPull</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Container</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:...</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">present</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>原因</strong>：配置文件中的镜像包含 sha256，但集群中的镜像没有<br><strong>解决方案</strong>：</p>



<ol class="wp-block-list">
<li>去掉镜像名称中的&nbsp;<code>@sha256:...</code>&nbsp;部分</li>



<li>确保镜像版本一致</li>
</ol>



<h4 class="wp-block-heading" id="问题3-节点选择器不匹配">问题 3：节点选择器不匹配<a href="http://is.iceymoss.com/blog/4#%E9%97%AE%E9%A2%983-%E8%8A%82%E7%82%B9%E9%80%89%E6%8B%A9%E5%99%A8%E4%B8%8D%E5%8C%B9%E9%85%8D"></a></h4>



<p class="wp-block-paragraph"><strong>现象</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #B48EAD">0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nodes</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">are</span><span style="color: #D8DEE9FF"> available</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">node</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">didn</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">t match Pod</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">affinity</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">selector</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>原因</strong>：Controller Pod 需要&nbsp;<code>ingress-ready=true</code>&nbsp;标签<br><strong>解决方案</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl  label  node  dev-control-plane  ingress-ready=true
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">kubectl</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">label</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">node</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">control</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plane</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">ingress</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ready</span><span style="color: #81A1C1">=true</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="问题4-Job镜像拉取策略不可变">问题 4：Job 镜像拉取策略不可变<a href="http://is.iceymoss.com/blog/4#%E9%97%AE%E9%A2%984-Job%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E7%AD%96%E7%95%A5%E4%B8%8D%E5%8F%AF%E5%8F%98"></a></h4>



<p class="wp-block-paragraph"><strong>现象</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>The Job "ingress-nginx-admission-create" is invalid: spec.template: Invalid value: field is immutable
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">The</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Job</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ingress-nginx-admission-create</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> invalid</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">spec</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">template</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">Invalid</span><span style="color: #D8DEE9FF"> value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">field</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">immutable</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>原因</strong>：Job 创建后 Pod 模板不可修改<br><strong>解决方案</strong>：</p>



<ol class="wp-block-list">
<li>删除 Job</li>



<li>修改 YAML 文件中的镜像拉取策略</li>



<li>重新部署<br><strong>关键配置要点</strong>：<br>镜像管理:</li>
</ol>



<ul class="wp-block-list">
<li>使用&nbsp;<code>imagePullPolicy: Never</code>&nbsp;避免网络拉取</li>



<li>确保镜像版本匹配</li>



<li>去掉 sha256 标识符</li>
</ul>



<p class="wp-block-paragraph">节点配置:</p>



<ul class="wp-block-list">
<li>添加&nbsp;<code>ingress-ready=true</code>&nbsp;标签</li>



<li>配置正确的端口映射</li>
</ul>



<p class="wp-block-paragraph">网络配置:</p>



<ul class="wp-block-list">
<li>使用 NodePort 类型的 Service</li>



<li>配置 hosts 文件进行域名解析</li>
</ul>



<h4 class="wp-block-heading" id="问题5-公网无法访问服务">问题 5：公网无法访问服务<a href="http://is.iceymoss.com/blog/4#%E9%97%AE%E9%A2%985-%E5%85%AC%E7%BD%91%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%9C%8D%E5%8A%A1"></a></h4>



<p class="wp-block-paragraph">我遇到一个比较复制的问题，公网无法访问服务，之前我们在服务器本地可以继续访问服务，所以服务器宿主机到 go-web 服务的整个链路肯定是没有问题的，简单画了一个网络请求流程图：</p>



<figure class="wp-block-image"><img decoding="async" src="https://cdn.learnku.com/uploads/images/202508/04/69310/Ca9artaJNG.png!large" alt="Kind 搭建 K8s 集群并部署 Go Web 应用"/></figure>



<h5 class="wp-block-heading" id="当前状态">当前状态<a href="http://is.iceymoss.com/blog/4#%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81"></a></h5>



<ul class="wp-block-list">
<li>✅&nbsp;<strong>本地访问</strong>: 正常 (localhost:80)</li>



<li>❌&nbsp;<strong>公网访问</strong>: 失败 (14.159.10.1:80)</li>
</ul>



<h5 class="wp-block-heading" id="可能原因">可能原因<a href="http://is.iceymoss.com/blog/4#%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0"></a></h5>



<ol class="wp-block-list">
<li><strong>云服务商安全组</strong>: 80 端口未开放</li>



<li><strong>网络路由</strong>: 公网 IP 路由问题</li>



<li><strong>NAT 配置</strong>: 端口转发规则缺失<br>下面我们一个一个的来排查：</li>
</ol>



<h5 class="wp-block-heading" id="检查80端口">检查 80 端口<a href="http://is.iceymoss.com/blog/4#%E6%A3%80%E6%9F%A580%E7%AB%AF%E5%8F%A3"></a></h5>



<p class="wp-block-paragraph">云控制台检查确定 80 端口是开放的</p>



<h5 class="wp-block-heading" id="公网路由">公网路由<a href="http://is.iceymoss.com/blog/4#%E5%85%AC%E7%BD%91%E8%B7%AF%E7%94%B1"></a></h5>



<p class="wp-block-paragraph">直接在服务器本地运行 go-web 服务：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>root@lavm-641m9i7vom:~/project/go-web&lt;em># tree&lt;/em>
.
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

0 directories, 4 files
root@lavm-641m9i7vom:~/project/go-web&lt;em># go run main.go&lt;/em>
&#91;GIN-debug&#93; &#91;WARNING&#93; Creating an Engine instance with the Logger and Recovery middleware already attached.

&#91;GIN-debug&#93; &#91;WARNING&#93; Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

&#91;GIN-debug&#93; GET    /ping                     --> main.Pong (3 handlers)
&#91;GIN-debug&#93; &#91;WARNING&#93; You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin&lt;em>#readme-don-t-trust-all-proxies for details.&lt;/em>
&#91;GIN-debug&#93; Listening and serving HTTP on 0.0.0.0:8080
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">root</span><span style="color: #D8DEE9FF">@</span><span style="color: #D8DEE9">lavm</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">641m9i7vom</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">project</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">tree</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">go</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">mod</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">go</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sum</span></span>
<span class="line"><span style="color: #D8DEE9FF">└── </span><span style="color: #D8DEE9">main</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span></span>
<span class="line"></span>
<span class="line"><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">directories</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">files</span></span>
<span class="line"><span style="color: #D8DEE9">root</span><span style="color: #D8DEE9FF">@</span><span style="color: #D8DEE9">lavm</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">641m9i7vom</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">project</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">web</span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">go</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">run</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">main</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">go</span><span style="color: #81A1C1">&lt;/</span><span style="color: #D8DEE9">em</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">GIN</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">debug</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">WARNING</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">Creating</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">an</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Engine</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">instance</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">the</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Logger</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Recovery</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">middleware</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">already</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">attached</span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">GIN</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">debug</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">WARNING</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">Running</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">debug</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mode</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Switch</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">release</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">production</span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">using</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">env</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF">   export GIN_MODE</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">release</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">using</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">code</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF">  gin</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">SetMode(gin</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">ReleaseMode)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">GIN</span><span style="color: #D8DEE9FF">-debug&#93; GET    /ping                     --&gt; main.Pong (3 handlers)</span></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">GIN</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">debug</span><span style="color: #D8DEE9FF">&#93; &#91;</span><span style="color: #D8DEE9">WARNING</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">You</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">trusted</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">proxies</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">this</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NOT</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">safe</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">We</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">recommend</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">you</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">set</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">value</span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9">Please</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">check</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//pkg.go.dev/github.com/gin-gonic/gin&lt;em&gt;#readme-don-t-trust-all-proxies for details.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">GIN</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">debug</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #D8DEE9">Listening</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">serving</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HTTP</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">on</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.0</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.0</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">8080</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">开放 8080 端口的防火墙后，在本地 pc 进行访问：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>PS C:\Users\SZ24-Storm006> curl http://14.159.10.1:8080/ping
{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
PS C:\Users\SZ24-Storm006>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">PS</span><span style="color: #D8DEE9FF"> C</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">Users</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">SZ24</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Storm006</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//14.159.10.1:8080/ping</span></span>
<span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9">PS</span><span style="color: #D8DEE9FF"> C</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">Users</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">SZ24</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Storm006</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">可以看到整个公网 ip 到我们的服务器都是正常的，那问题就出现在服务器上&nbsp;<code>端口转发规则缺失</code></p>



<h5 class="wp-block-heading" id="NAT配置">NAT 配置<a href="http://is.iceymoss.com/blog/4#NAT%E9%85%8D%E7%BD%AE"></a></h5>



<p class="wp-block-paragraph">宿主机网络：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 网络接口&lt;/em>
eth0: 172.16.0.8/16 (内网IP)
br-ebc08f0aedad: 172.18.0.1/16 (Docker网络)

&lt;em># 路由&lt;/em>
default via 172.16.0.1 dev eth0
172.18.0.0/16 dev br-ebc08f0aedad
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 网络接口</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">eth0</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">172.16</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.8</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">16</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">内网IP</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9">br</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">ebc08f0aedad</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">172.18</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.1</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">16</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">Docker网络</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 路由</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">via</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">172.16</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.1</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">eth0</span></span>
<span class="line"><span style="color: #B48EAD">172.18</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.0</span><span style="color: #81A1C1">/</span><span style="color: #B48EAD">16</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">br</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ebc08f0aedad</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>网络接口</strong>: eth0 (172.16.0.8/16)</li>



<li><strong>Docker 网络</strong>: br-ebc08f0aedad (172.18.0.1/16)</li>



<li><strong>端口监听</strong>: 0.0.0.0:80 (docker-proxy)</li>
</ul>



<p class="wp-block-paragraph">检查一下 80 端口：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>netstat -tlnp | grep :80
&lt;em># 输出: tcp 0.0.0.0:80 0.0.0.0:* LISTEN 180819/docker-proxy&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">netstat</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">tlnp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> grep </span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">80</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 输出: tcp 0.0.0.0:80 0.0.0.0:* LISTEN 180819/docker-proxy</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>进程</strong>: docker-proxy (PID: 180819)</li>



<li><strong>监听</strong>: 0.0.0.0:80 (所有接口)</li>



<li><strong>转发</strong>: 到 Ingress Controller 容器</li>
</ul>



<p class="wp-block-paragraph">看上去宿主机到 docker 容器的配置页没有问题，排查一下&nbsp;<code> iptables规则检查</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 检查iptables规则&lt;/em>
iptables  -L  -n  | grep  -E  "(DROP|REJECT)"
&lt;em># 结果: 发现多个DROP规则&lt;/em>
&lt;em># 检查DOCKER链&lt;/em>
iptables  -L  DOCKER  -n  --line-numbers
&lt;em># 结果:&lt;/em>
&lt;em># 5    ACCEPT     tcp  --  0.0.0.0/0            172.18.0.2           tcp dpt:80&lt;/em>
&lt;em># 6    DROP       all  --  0.0.0.0/0            0.0.0.0/0&lt;/em>
&lt;em># 7    DROP       all  --  0.0.0.0/0            0.0.0.0/0&lt;/em>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查iptables规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">L</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">grep</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">E</span><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">(DROP|REJECT)</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 结果: 发现多个DROP规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查DOCKER链</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">L</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">line</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">numbers</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 结果:</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 5    ACCEPT     tcp  --  0.0.0.0/0            172.18.0.2           tcp dpt:80</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 6    DROP       all  --  0.0.0.0/0            0.0.0.0/0</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 7    DROP       all  --  0.0.0.0/0            0.0.0.0/0</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>发现关键问题</strong>: DOCKER 链中 80 端口的 ACCEPT 规则被后面的 DROP 规则覆盖<br><strong>解决方案</strong>：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 删除DOCKER链中的DROP规则&lt;/em>
iptables  -D  DOCKER  6
iptables  -D  DOCKER  6
&lt;em># 检查DOCKER-ISOLATION-STAGE-2链&lt;/em>
iptables  -L  DOCKER-ISOLATION-STAGE-2  -n
&lt;em># 结果: 发现更多DROP规则&lt;/em>
&lt;em># 删除DOCKER-ISOLATION-STAGE-2链中的DROP规则&lt;/em>
iptables  -D  DOCKER-ISOLATION-STAGE-2  1
iptables  -D  DOCKER-ISOLATION-STAGE-2  1
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 删除DOCKER链中的DROP规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">D</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">6</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">D</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">6</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 检查DOCKER-ISOLATION-STAGE-2链</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">L</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ISOLATION</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">STAGE</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 结果: 发现更多DROP规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 删除DOCKER-ISOLATION-STAGE-2链中的DROP规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">D</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ISOLATION</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">STAGE</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">D</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">DOCKER</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ISOLATION</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">STAGE</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">1</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">然后我重新从我的 pc 进行请求，还是不行，还得进行排查，清理 iptables：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;em># 完全清空iptables规则&lt;/em>
iptables  -F
iptables  -t  nat  -F
iptables  -t  mangle  -F
iptables  -X
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;em&gt;</span><span style="color: #D8DEE9FF"># 完全清空iptables规则</span><span style="color: #81A1C1">&lt;/em&gt;</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">F</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">t</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">nat</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">F</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">t</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">mangle</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">F</span></span>
<span class="line"><span style="color: #D8DEE9">iptables</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">X</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">再请求试试：</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>PowerShell 7.5.2
PS C:\Users\SZ24-Storm006> curl http://14.159.10.1/ping
{"age":18,"name":"xxxxxx","school":"家里蹲大学"}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">PowerShell</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">7.5</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">2</span></span>
<span class="line"><span style="color: #D8DEE9">PS</span><span style="color: #D8DEE9FF"> C</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">Users</span><span style="color: #D8DEE9FF">\</span><span style="color: #D8DEE9">SZ24</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Storm006</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> http</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//14.159.10.1/ping</span></span>
<span class="line"><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">age</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #B48EAD">18</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xxxxxx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">school</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">家里蹲大学</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">总结一下：</p>



<h4 class="wp-block-heading" id="根本原因">根本原因<a href="http://is.iceymoss.com/blog/4#%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0"></a></h4>



<p class="wp-block-paragraph"><strong>iptables 规则冲突</strong>导致 80 端口无法正常访问：</p>



<ol class="wp-block-list">
<li>Docker 自动生成的 iptables 规则中有 DROP 规则</li>



<li>这些 DROP 规则覆盖了 ACCEPT 规则</li>



<li>导致外部流量无法到达 Ingress Controller</li>
</ol>



<h4 class="wp-block-heading" id="解决方案">解决方案<a href="http://is.iceymoss.com/blog/4#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"></a></h4>



<p class="wp-block-paragraph"><strong>清空冲突的 iptables 规则</strong>，让网络流量正常转发。</p>



<h4 class="wp-block-heading" id="验证结果">验证结果<a href="http://is.iceymoss.com/blog/4#%E9%AA%8C%E8%AF%81%E7%BB%93%E6%9E%9C"></a></h4>



<ul class="wp-block-list">
<li>✅ 本地访问:&nbsp;<code>curl http://localhost/ping</code>&nbsp;&#8211; 正常</li>



<li>✅ 公网访问:&nbsp;<code>curl http://14.159.10.1/ping</code>&nbsp;&#8211; 正常</li>



<li>✅ Ingress Controller: 正常工作</li>



<li>✅ go-web 服务: 正常运行</li>
</ul>



<h2 class="wp-block-heading" id="结论">结论<a href="http://is.iceymoss.com/blog/4#%E7%BB%93%E8%AE%BA"></a></h2>



<p class="wp-block-paragraph">通过这次实践，成功搭建了 Kind Kubernetes 集群并部署了 Go Web 应用。过程中遇到的主要问题都与网络环境和镜像管理相关，通过正确的配置和策略设置，最终实现了稳定的部署，这个流程为后续的容器化应用部署提供了完整的参考模板，也为更复杂的 Kubernetes 应用管理奠定了基础。</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.atomic-cube.cn/k8s%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%b9%b6%e9%83%a8%e7%bd%b2web%e5%ba%94%e7%94%a8/">Kubernetes集群搭建并部署Web应用</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/k8s%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%b9%b6%e9%83%a8%e7%bd%b2web%e5%ba%94%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
