<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DevOps on 超越网</title><link>https://www.chaoyuewang.cn/tags/devops/</link><description>Recent content in DevOps on 超越网</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 28 May 2026 10:30:00 +0800</lastBuildDate><atom:link href="https://www.chaoyuewang.cn/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubernetes 本地开发环境搭建：从0到1的完整指南</title><link>https://www.chaoyuewang.cn/posts/ops/kubernetes-local-dev/</link><pubDate>Thu, 28 May 2026 10:30:00 +0800</pubDate><guid>https://www.chaoyuewang.cn/posts/ops/kubernetes-local-dev/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;2025年之前，我的本地开发环境一直是 Docker Compose。直到一次生产环境的配置差异导致严重故障，我才意识到本地环境需要更接近生产。&lt;/p&gt;
&lt;p&gt;这篇文章记录完整的 Kubernetes 本地开发环境搭建过程，包括工具选择、配置优化和开发工作流。&lt;/p&gt;
&lt;h2 id="一为什么需要本地-k8s"&gt;一、为什么需要本地 K8s&lt;/h2&gt;
&lt;h3 id="11-痛点分析"&gt;1.1 痛点分析&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;Docker Compose&lt;/th&gt;
&lt;th&gt;Kubernetes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ConfigMap 测试&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;✅ 原生支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service 发现&lt;/td&gt;
&lt;td&gt;⚠️ 手动配置&lt;/td&gt;
&lt;td&gt;✅ 自动发现&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress 路由&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;✅ 原生支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HPA 自动扩缩容&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;✅ 原生支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生产一致性&lt;/td&gt;
&lt;td&gt;⚠️ 较低&lt;/td&gt;
&lt;td&gt;✅ 高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-核心价值"&gt;1.2 核心价值&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;本地即生产&amp;rdquo;&lt;/strong&gt;：在本地就能验证生产环境的配置和行为，减少部署时的意外。&lt;/p&gt;
&lt;h2 id="二工具选择"&gt;二、工具选择&lt;/h2&gt;
&lt;h3 id="21-主流方案对比"&gt;2.1 主流方案对比&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;优点&lt;/th&gt;
&lt;th&gt;缺点&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minikube&lt;/td&gt;
&lt;td&gt;功能完整、插件丰富&lt;/td&gt;
&lt;td&gt;启动慢、资源占用高&lt;/td&gt;
&lt;td&gt;学习/测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kind&lt;/td&gt;
&lt;td&gt;快速启动、Docker后端&lt;/td&gt;
&lt;td&gt;多集群管理弱&lt;/td&gt;
&lt;td&gt;开发/CI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K3s&lt;/td&gt;
&lt;td&gt;轻量、生产级&lt;/td&gt;
&lt;td&gt;配置稍复杂&lt;/td&gt;
&lt;td&gt;边缘/开发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Desktop K8s&lt;/td&gt;
&lt;td&gt;一键启用、集成好&lt;/td&gt;
&lt;td&gt;资源占用高、Mac/Win独占&lt;/td&gt;
&lt;td&gt;快速上手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rancher Desktop&lt;/td&gt;
&lt;td&gt;跨平台、可选容器运行时&lt;/td&gt;
&lt;td&gt;较新、社区较小&lt;/td&gt;
&lt;td&gt;跨平台开发&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-我的选择kind"&gt;2.2 我的选择：Kind&lt;/h3&gt;
&lt;p&gt;经过对比测试，我选择 &lt;strong&gt;Kind (Kubernetes in Docker)&lt;/strong&gt; 作为本地开发环境：&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p>2025年之前，我的本地开发环境一直是 Docker Compose。直到一次生产环境的配置差异导致严重故障，我才意识到本地环境需要更接近生产。</p>
<p>这篇文章记录完整的 Kubernetes 本地开发环境搭建过程，包括工具选择、配置优化和开发工作流。</p>
<h2 id="一为什么需要本地-k8s">一、为什么需要本地 K8s</h2>
<h3 id="11-痛点分析">1.1 痛点分析</h3>
<table>
	<thead>
			<tr>
					<th>场景</th>
					<th>Docker Compose</th>
					<th>Kubernetes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>ConfigMap 测试</td>
					<td>❌ 不支持</td>
					<td>✅ 原生支持</td>
			</tr>
			<tr>
					<td>Service 发现</td>
					<td>⚠️ 手动配置</td>
					<td>✅ 自动发现</td>
			</tr>
			<tr>
					<td>Ingress 路由</td>
					<td>❌ 不支持</td>
					<td>✅ 原生支持</td>
			</tr>
			<tr>
					<td>HPA 自动扩缩容</td>
					<td>❌ 不支持</td>
					<td>✅ 原生支持</td>
			</tr>
			<tr>
					<td>生产一致性</td>
					<td>⚠️ 较低</td>
					<td>✅ 高</td>
			</tr>
	</tbody>
</table>
<h3 id="12-核心价值">1.2 核心价值</h3>
<p><strong>&ldquo;本地即生产&rdquo;</strong>：在本地就能验证生产环境的配置和行为，减少部署时的意外。</p>
<h2 id="二工具选择">二、工具选择</h2>
<h3 id="21-主流方案对比">2.1 主流方案对比</h3>
<table>
	<thead>
			<tr>
					<th>工具</th>
					<th>优点</th>
					<th>缺点</th>
					<th>适用场景</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Minikube</td>
					<td>功能完整、插件丰富</td>
					<td>启动慢、资源占用高</td>
					<td>学习/测试</td>
			</tr>
			<tr>
					<td>Kind</td>
					<td>快速启动、Docker后端</td>
					<td>多集群管理弱</td>
					<td>开发/CI</td>
			</tr>
			<tr>
					<td>K3s</td>
					<td>轻量、生产级</td>
					<td>配置稍复杂</td>
					<td>边缘/开发</td>
			</tr>
			<tr>
					<td>Docker Desktop K8s</td>
					<td>一键启用、集成好</td>
					<td>资源占用高、Mac/Win独占</td>
					<td>快速上手</td>
			</tr>
			<tr>
					<td>Rancher Desktop</td>
					<td>跨平台、可选容器运行时</td>
					<td>较新、社区较小</td>
					<td>跨平台开发</td>
			</tr>
	</tbody>
</table>
<h3 id="22-我的选择kind">2.2 我的选择：Kind</h3>
<p>经过对比测试，我选择 <strong>Kind (Kubernetes in Docker)</strong> 作为本地开发环境：</p>
<ul>
<li>✅ 启动速度快（~30秒）</li>
<li>✅ 资源占用低（~2GB内存）</li>
<li>✅ 多集群支持（开发/测试环境隔离）</li>
<li>✅ 与 CI/CD 一致（GitHub Actions 也用 Kind）</li>
</ul>
<h2 id="三环境搭建">三、环境搭建</h2>
<h3 id="31-安装工具">3.1 安装工具</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 Docker</span>
</span></span><span class="line"><span class="cl">curl -fsSL https://get.docker.com <span class="p">|</span> sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安装 Kind</span>
</span></span><span class="line"><span class="cl">curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
</span></span><span class="line"><span class="cl">chmod +x ./kind
</span></span><span class="line"><span class="cl">sudo mv ./kind /usr/local/bin/kind
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安装 kubectl</span>
</span></span><span class="line"><span class="cl">curl -LO <span class="s2">&#34;https://dl.k8s.io/release/</span><span class="k">$(</span>curl -L -s https://dl.k8s.io/release/stable.txt<span class="k">)</span><span class="s2">/bin/linux/amd64/kubectl&#34;</span>
</span></span><span class="line"><span class="cl">chmod +x kubectl
</span></span><span class="line"><span class="cl">sudo mv kubectl /usr/local/bin/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安装 Helm</span>
</span></span><span class="line"><span class="cl">curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 <span class="p">|</span> bash
</span></span></code></pre></div><h3 id="32-创建集群">3.2 创建集群</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建开发集群</span>
</span></span><span class="line"><span class="cl">kind create cluster --name dev --config kind-config.yaml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建测试集群（隔离环境）</span>
</span></span><span class="line"><span class="cl">kind create cluster --name <span class="nb">test</span> --config kind-config.yaml
</span></span></code></pre></div><h3 id="33-集群配置kind-configyaml">3.3 集群配置（kind-config.yaml）</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">kind.x-k8s.io/v1alpha4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">nodes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">role</span><span class="p">:</span><span class="w"> </span><span class="l">control-plane</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubeadmConfigPatches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">        kind: InitConfiguration
</span></span></span><span class="line"><span class="cl"><span class="sd">        nodeRegistration:
</span></span></span><span class="line"><span class="cl"><span class="sd">          kubeletExtraArgs:
</span></span></span><span class="line"><span class="cl"><span class="sd">            node-labels: &#34;ingress-ready=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">extraPortMappings</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">hostPort</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l">TCP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">hostPort</span><span class="p">:</span><span class="w"> </span><span class="m">443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l">TCP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">role</span><span class="p">:</span><span class="w"> </span><span class="l">worker</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">role</span><span class="p">:</span><span class="w"> </span><span class="l">worker</span><span class="w">
</span></span></span></code></pre></div><h2 id="四核心组件部署">四、核心组件部署</h2>
<h3 id="41-ingress-controller">4.1 Ingress Controller</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 部署 NGINX Ingress</span>
</span></span><span class="line"><span class="cl">kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">kubectl <span class="nb">wait</span> --namespace ingress-nginx <span class="se">\
</span></span></span><span class="line"><span class="cl">  --for<span class="o">=</span><span class="nv">condition</span><span class="o">=</span>ready pod <span class="se">\
</span></span></span><span class="line"><span class="cl">  --selector<span class="o">=</span>app.kubernetes.io/component<span class="o">=</span>controller <span class="se">\
</span></span></span><span class="line"><span class="cl">  --timeout<span class="o">=</span>90s
</span></span></code></pre></div><h3 id="42-本地-dns">4.2 本地 DNS</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 CoreDNS 优化配置</span>
</span></span><span class="line"><span class="cl">kubectl apply -f https://raw.githubusercontent.com/coredns/coredns/master/coredns.yaml
</span></span></code></pre></div><h3 id="43-存储类">4.3 存储类</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># local-path-storage.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">storage.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">StorageClass</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">local-path</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">provisioner</span><span class="p">:</span><span class="w"> </span><span class="l">rancher.io/local-path</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumeBindingMode</span><span class="p">:</span><span class="w"> </span><span class="l">WaitForFirstConsumer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">reclaimPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Delete</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl apply -f local-path-storage.yaml
</span></span></code></pre></div><h2 id="五开发工作流">五、开发工作流</h2>
<h3 id="51-镜像构建与加载">5.1 镜像构建与加载</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 使用 Kind 内置的 Docker  Registry</span>
</span></span><span class="line"><span class="cl">kind build node-image --image myapp:dev ./
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或直接加载到集群</span>
</span></span><span class="line"><span class="cl">kind load docker-image myapp:dev --name dev
</span></span></code></pre></div><h3 id="52-热重载开发">5.2 热重载开发</h3>
<p>使用 <strong>Telepresence</strong> 实现本地代码热重载：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 Telepresence</span>
</span></span><span class="line"><span class="cl">brew install telepresence  <span class="c1"># macOS</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 或</span>
</span></span><span class="line"><span class="cl">curl -fL https://app.gettelepresence.io/download/linux/binary &gt; telepresence <span class="o">&amp;&amp;</span> chmod +x telepresence <span class="o">&amp;&amp;</span> sudo mv telepresence /usr/local/bin/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 拦截服务流量</span>
</span></span><span class="line"><span class="cl">telepresence intercept myapp --port 3000:3000
</span></span></code></pre></div><h3 id="53-端口转发">5.3 端口转发</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 临时端口转发</span>
</span></span><span class="line"><span class="cl">kubectl port-forward svc/myapp 3000:3000 -n dev
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或使用 kubectl-aliases 简化</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">kpf</span><span class="o">=</span><span class="s1">&#39;kubectl port-forward&#39;</span>
</span></span><span class="line"><span class="cl">kpf svc/myapp 3000:3000
</span></span></code></pre></div><h2 id="六配置管理">六、配置管理</h2>
<h3 id="61-configmap-示例">6.1 ConfigMap 示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># configmap.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ConfigMap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">app-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dev</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">NODE_ENV</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;development&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">LOG_LEVEL</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;debug&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">API_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://api.dev.local&#34;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl apply -f configmap.yaml
</span></span></code></pre></div><h3 id="62-secret-管理">6.2 Secret 管理</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建 Secret</span>
</span></span><span class="line"><span class="cl">kubectl create secret generic db-credentials <span class="se">\
</span></span></span><span class="line"><span class="cl">  --from-literal<span class="o">=</span><span class="nv">username</span><span class="o">=</span>app <span class="se">\
</span></span></span><span class="line"><span class="cl">  --from-literal<span class="o">=</span><span class="nv">password</span><span class="o">=</span>secret <span class="se">\
</span></span></span><span class="line"><span class="cl">  -n dev
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或使用 Helm Secrets 插件</span>
</span></span><span class="line"><span class="cl">helm secrets install my-release ./charts/myapp <span class="se">\
</span></span></span><span class="line"><span class="cl">  --set db.password<span class="o">=</span><span class="k">$(</span>cat .secrets/db-password<span class="k">)</span>
</span></span></code></pre></div><h2 id="七调试技巧">七、调试技巧</h2>
<h3 id="71-快速查看日志">7.1 快速查看日志</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看 Pod 日志</span>
</span></span><span class="line"><span class="cl">kubectl logs -f deployment/myapp -n dev
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看上一个实例的日志（重启后）</span>
</span></span><span class="line"><span class="cl">kubectl logs -f deployment/myapp -n dev --previous
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看特定容器</span>
</span></span><span class="line"><span class="cl">kubectl logs -f deployment/myapp -c sidecar -n dev
</span></span></code></pre></div><h3 id="72-进入容器调试">7.2 进入容器调试</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入容器</span>
</span></span><span class="line"><span class="cl">kubectl <span class="nb">exec</span> -it deployment/myapp -n dev -- /bin/sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或使用 debug 模式启动临时容器</span>
</span></span><span class="line"><span class="cl">kubectl debug -it deployment/myapp -n dev --image<span class="o">=</span>busybox --target<span class="o">=</span>myapp
</span></span></code></pre></div><h3 id="73-资源监控">7.3 资源监控</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看资源使用</span>
</span></span><span class="line"><span class="cl">kubectl top pods -n dev
</span></span><span class="line"><span class="cl">kubectl top nodes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看事件</span>
</span></span><span class="line"><span class="cl">kubectl get events -n dev --sort-by<span class="o">=</span><span class="s1">&#39;.lastTimestamp&#39;</span>
</span></span></code></pre></div><h2 id="八cicd-集成">八、CI/CD 集成</h2>
<h3 id="81-github-actions-示例">8.1 GitHub Actions 示例</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># .github/workflows/test.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">on</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">push]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">test</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Setup Kind</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">helm/kind-action@v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">config</span><span class="p">:</span><span class="w"> </span><span class="l">kind-config.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Deploy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          kubectl apply -f k8s/
</span></span></span><span class="line"><span class="cl"><span class="sd">          kubectl wait --for=condition=ready pod -l app=myapp --timeout=120s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Run Tests</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">npm test</span><span class="w">
</span></span></span></code></pre></div><h2 id="九总结">九、总结</h2>
<p>本地 Kubernetes 开发环境的核心价值：</p>
<ol>
<li><strong>一致性</strong>：本地行为接近生产，减少部署意外</li>
<li><strong>快速迭代</strong>：启动快、资源占用低</li>
<li><strong>完整功能</strong>：支持 ConfigMap、Ingress、HPA 等 K8s 原生特性</li>
<li><strong>CI/CD 一致</strong>：本地和 CI 使用相同工具链</li>
</ol>
<p><strong>推荐配置</strong>：</p>
<table>
	<thead>
			<tr>
					<th>场景</th>
					<th>推荐工具</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>快速上手</td>
					<td>Docker Desktop K8s</td>
			</tr>
			<tr>
					<td>日常开发</td>
					<td>Kind</td>
			</tr>
			<tr>
					<td>多集群隔离</td>
					<td>Kind + 多个集群</td>
			</tr>
			<tr>
					<td>生产预演</td>
					<td>K3s</td>
			</tr>
	</tbody>
</table>
<hr>
<blockquote>
<p><strong>更新日志</strong>：本文基于2026年5月实践编写，工具版本可能随时间变化，请以官方文档为准。</p>
</blockquote>
]]></content:encoded></item></channel></rss>