<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>K8s从零到实战 on WYF 的技术博客</title><link>https://saflyer.cn/series/k8s-from-scratch/</link><description>Recent content in K8s从零到实战 on WYF 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 14 Sep 2026 10:03:15 +0800</lastBuildDate><atom:link href="https://saflyer.cn/series/k8s-from-scratch/index.xml" rel="self" type="application/rss+xml"/><item><title>K8s 从零到实战 00（番外）：Minikube 快速体验</title><link>https://saflyer.cn/posts/k8s-00c-minikube/</link><pubDate>Sun, 13 Sep 2026 10:20:00 +0800</pubDate><guid>https://saflyer.cn/posts/k8s-00c-minikube/</guid><description>&lt;img src="https://saflyer.cn/posts/k8s-00c-minikube/cover.webp" alt="Featured image of post K8s 从零到实战 00（番外）：Minikube 快速体验" /&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;定位：主线（Lima + kubeadm，见 &lt;a href="https://saflyer.cn/posts/k8s-00a-vm-system-init/"&gt;00（上）&lt;/a&gt;、&lt;a href="https://saflyer.cn/posts/k8s-00b-kernel-containerd/"&gt;00（下）&lt;/a&gt;）之外的&lt;strong&gt;对照实验&lt;/strong&gt;——用一条命令体验&amp;quot;工具帮你把集群全装好&amp;quot;的感觉，&#10;从而理解主线手动搭建的每一步都被工具藏到了哪里。&#10;体验完建议删掉，主线继续走 &lt;a href="https://saflyer.cn/posts/k8s-00a-vm-system-init/"&gt;阶段 0（上）&lt;/a&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="0-minikube-与主线的区别"&gt;&lt;a href="#0-minikube-%e4%b8%8e%e4%b8%bb%e7%ba%bf%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;0. Minikube 与主线的区别&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Minikube&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主线：Lima + kubeadm&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;集群怎么来&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一条命令，全自动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每个组件亲手装&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;节点形态&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Docker 容器（或虚拟机）里的&amp;quot;模拟节点&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;完整的 Rocky Linux 虚拟机&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;组件可见性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;黑盒（etcd/apiserver 藏在容器里）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;透明（systemd 服务，可查可拆）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对应生产&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;偏离较多&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1:1 对应&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;适合&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;快速用 k8s 跑应用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;学懂 k8s 本身&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="1-安装mac-上执行"&gt;&lt;a href="#1-%e5%ae%89%e8%a3%85mac-%e4%b8%8a%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;1. 安装（Mac 上执行）&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install minikube&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：minikube version: v1.x.x&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;驱动选择&lt;/strong&gt;：用 &lt;code&gt;--driver=docker&lt;/code&gt;——你已装 Docker Desktop，minikube 直接复用它，&#10;不需要再开一台虚拟机（这也是它轻量的原因：k8s 节点就是一个 Docker 容器）。&lt;/p&gt;&#10;&lt;h2 id="2-启动集群国内网络参数必加"&gt;&lt;a href="#2-%e5%90%af%e5%8a%a8%e9%9b%86%e7%be%a4%e5%9b%bd%e5%86%85%e7%bd%91%e7%bb%9c%e5%8f%82%e6%95%b0%e5%bf%85%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;2. 启动集群（国内网络参数必加）&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start --driver&lt;span class="o"&gt;=&lt;/span&gt;docker --image-mirror-country&lt;span class="o"&gt;=&lt;/span&gt;cn&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--image-mirror-country=cn&lt;/code&gt;：k8s 组件镜像改从阿里云镜像站拉取（&lt;code&gt;registry.cn-hangzhou.aliyuncs.com/google_containers&lt;/code&gt;），不加会因为 gcr.io 被墙而卡死。&#10;它等价于主线 kubeadm 配置里的 &lt;code&gt;imageRepository: registry.aliyuncs.com/google_containers&lt;/code&gt;（阶段 1 会写到），只是一个走命令行开关、一个写进配置文件&lt;/li&gt;&#10;&lt;li&gt;首次启动要下载节点基础镜像（约 1GB），耐心等几分钟&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;预期输出&lt;/strong&gt;（结尾）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🏄 Done! kubectl is now configured to use &amp;#34;minikube&amp;#34; cluster and &amp;#34;default&amp;#34; namespace by default&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="3-验证集群"&gt;&lt;a href="#3-%e9%aa%8c%e8%af%81%e9%9b%86%e7%be%a4" class="header-anchor"&gt;&lt;/a&gt;3. 验证集群&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 集群状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;实测输出（2026-09-13，minikube v1.36.0 / k8s v1.33.1）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-5"&gt;&lt;a class="lnlinks" href="#hl-4-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-6"&gt;&lt;a class="lnlinks" href="#hl-4-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;type: Control Plane&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;host: Running&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubelet: Running&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apiserver: Running&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubeconfig: Configured&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 节点（minikube 自动配好了 Mac 上的 kubectl 上下文）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME STATUS ROLES AGE VERSION&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube Ready control-plane 52s v1.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 系统组件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -n kube-system&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-3"&gt;&lt;a class="lnlinks" href="#hl-8-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-4"&gt;&lt;a class="lnlinks" href="#hl-8-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-5"&gt;&lt;a class="lnlinks" href="#hl-8-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-6"&gt;&lt;a class="lnlinks" href="#hl-8-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-7"&gt;&lt;a class="lnlinks" href="#hl-8-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-8"&gt;&lt;a class="lnlinks" href="#hl-8-8"&gt;8&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;coredns-746c97786-gpmv9 1/1 Running 0 51s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcd-minikube 1/1 Running 0 57s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-apiserver-minikube 1/1 Running 0 57s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-controller-manager-minikube 1/1 Running 0 57s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-proxy-6v4nl 1/1 Running 0 52s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-scheduler-minikube 1/1 Running 0 57s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;storage-provisioner 1/1 Running 0 56s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-2"&gt;&lt;a class="lnlinks" href="#hl-9-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-3"&gt;&lt;a class="lnlinks" href="#hl-9-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-4"&gt;&lt;a class="lnlinks" href="#hl-9-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 终极验证：跑一个真 Pod（和主线的验收标准一样）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl run nginx-test --image&lt;span class="o"&gt;=&lt;/span&gt;nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -w &lt;span class="c1"&gt;# 看到 Running 后 Ctrl+C&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete pod nginx-test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx-test 0/1 ContainerCreating 0 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 若 &lt;code&gt;ContainerCreating&lt;/code&gt; 超过一两分钟不动，是节点内的 containerd 拉不动 docker.io&#10;（Docker Hub 被墙），解法见第 5 节表格第 4 行（实测 2026-09-13 即遇到此情况）；&#10;用 &lt;code&gt;kubectl describe pod nginx-test&lt;/code&gt; 看 Events，卡在 &lt;code&gt;Pulling image &amp;quot;nginx&amp;quot;&lt;/code&gt; 即是。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;🔍 &lt;strong&gt;对比观察点&lt;/strong&gt;（体验的价值所在）：&#10;上面的命令和主线一模一样——这就是&amp;quot;工具标准化&amp;quot;的好处。&#10;但你想想：swap 谁关的？SELinux 谁管的？pause 镜像谁换的？CNI 谁装的？&#10;全被 minikube 藏掉了。这些答案你都知道，因为你亲手做过——这就是主线带给你的。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="4-日常管理命令"&gt;&lt;a href="#4-%e6%97%a5%e5%b8%b8%e7%ae%a1%e7%90%86%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;4. 日常管理命令&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-2"&gt;&lt;a class="lnlinks" href="#hl-11-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-3"&gt;&lt;a class="lnlinks" href="#hl-11-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-4"&gt;&lt;a class="lnlinks" href="#hl-11-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-5"&gt;&lt;a class="lnlinks" href="#hl-11-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-6"&gt;&lt;a class="lnlinks" href="#hl-11-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-7"&gt;&lt;a class="lnlinks" href="#hl-11-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube stop &lt;span class="c1"&gt;# 停止集群（数据保留）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start &lt;span class="c1"&gt;# 再次启动（不用再加参数，配置已记住）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube delete &lt;span class="c1"&gt;# 彻底删除集群（体验完用它）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube ip &lt;span class="c1"&gt;# 查看节点 IP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube ssh &lt;span class="c1"&gt;# 进入节点容器里看看&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube dashboard &lt;span class="c1"&gt;# 打开 Web 控制台（可选，会再拉几个镜像）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube logs &lt;span class="c1"&gt;# 启动失败时看日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="5-国内网络预案启动卡住时看这里"&gt;&lt;a href="#5-%e5%9b%bd%e5%86%85%e7%bd%91%e7%bb%9c%e9%a2%84%e6%a1%88%e5%90%af%e5%8a%a8%e5%8d%a1%e4%bd%8f%e6%97%b6%e7%9c%8b%e8%bf%99%e9%87%8c" class="header-anchor"&gt;&lt;/a&gt;5. 国内网络预案（启动卡住时看这里）&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;现象&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;原因&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;解法&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提示 &lt;code&gt;cannot pull kicbase image&lt;/code&gt;，转而从 GitHub 下载 &lt;code&gt;kicbase-vX.X.X-arm64.tar&lt;/code&gt;，几十 KB/s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--image-mirror-country=cn&lt;/code&gt; 只管 K8s 组件镜像；kicbase 底座（约 1.2GB）拉取失败后，minikube 兜底从 GitHub Release 直下 tar 包，国内直连要几个小时&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;① Ctrl+C；② 手动拉底座镜像（tag 以启动日志&amp;quot;正在拉取基础镜像 vX&amp;quot;为准）：&lt;code&gt;docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.47&lt;/code&gt;；③ 重跑加 &lt;code&gt;--base-image=registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.47&lt;/code&gt;，命中本地镜像，下载整段跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想让 GitHub 兜底下载本身变快&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;minikube 本体的 HTTP 下载会读 Shell 的代理变量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开 Clash 后带变量重跑：&lt;code&gt;HTTPS_PROXY=http://127.0.0.1:7897 minikube start --driver=docker --image-mirror-country=cn&lt;/code&gt;（代理也会被自动注入节点容器）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;k8s 组件镜像拉取失败（preload 阶段卡住）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gcr.io 被墙，或此时直连阿里云被拦&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;确认 &lt;code&gt;--image-mirror-country=cn&lt;/code&gt;；仍卡住就 Ctrl+C，开 Clash、带上面的代理变量重跑&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Pod 的镜像（nginx 等）拉不动，&lt;code&gt;ContainerCreating&lt;/code&gt; 卡住&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;docker.io 被墙。&lt;strong&gt;注意&lt;/strong&gt;：kubectl 跑的 Pod 由节点容器内的 containerd 拉镜像，Docker Desktop 的 registry-mirrors 管不到它&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;① 重建集群时加 &lt;code&gt;--registry-mirror=https://docker.m.daocloud.io&lt;/code&gt;；② 或镜像名直接带前缀：&lt;code&gt;kubectl run nginx-test --image=docker.m.daocloud.io/library/nginx&lt;/code&gt;（可配合 &lt;code&gt;minikube image pull &amp;lt;镜像&amp;gt;&lt;/code&gt; 先手动拉进节点）；③ &lt;code&gt;kubectl describe pod &amp;lt;名&amp;gt;&lt;/code&gt; 看 Events 确认是否卡在 Pulling&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全都不行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac 直连被拦（公司安全软件）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;打开 Clash（允许局域网），Docker Desktop → Settings → Resources → Proxies 填 &lt;code&gt;http://127.0.0.1:7897&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;原理：一次 &lt;code&gt;minikube start&lt;/code&gt; 里藏着三条网络通道，代理配置各有各的地盘&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;通道&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;谁在发请求&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;代理怎么配&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;① minikube CLI 自己的 HTTP 下载（GitHub 兜底 tar 包等）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac 上的 minikube 进程&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;shell 环境变量 &lt;code&gt;HTTPS_PROXY=...&lt;/code&gt;，它自己会读&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;② dockerd 拉镜像（kicbase、业务镜像）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Docker Desktop 虚拟机里的 dockerd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;看不到 shell 变量&lt;/strong&gt;；只能配 Docker Desktop → Settings → Resources → Proxies&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;③ 节点容器内拉 K8s 组件镜像&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;minikube 节点容器里的 containerd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;minikube 检测到 ① 的代理变量后会自动注入节点（&lt;code&gt;127.0.0.1&lt;/code&gt; 自动换成 &lt;code&gt;host.docker.internal&lt;/code&gt;，前提是 Clash 开了 Allow LAN）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;Clash 的另一个坑&lt;/strong&gt;：规则模式下，阿里云这类国内域名默认走 DIRECT（直连），根本没上代理节点。&#10;所以&amp;quot;开了 Clash&amp;quot; ≠ &amp;ldquo;走了代理&amp;rdquo;——直连被安全软件限速时，走 DIRECT 的流量照样慢。&#10;要让国内站点也过代理，得切全局（Global）模式。&#10;排查时先想清楚当前卡在哪个通道，再决定改哪边的配置。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;实战记录（2026-09-13）&lt;/strong&gt;：首次启动时 kicbase 拉取失败转 GitHub（74KB/s，ETA 4 小时+），&#10;实测当时 Mac 直连阿里云镜像站只有 11KB/s——与 Lima 虚拟机那次是同根因（企业安全软件拦截）。&#10;排查中发现 kicbase 镜像本地已存在（&lt;code&gt;docker images | grep kicbase&lt;/code&gt; 确认），&#10;于是用 &lt;code&gt;--base-image&lt;/code&gt; 直接指向本地镜像跳过下载。注意这只解决了底座镜像，&#10;后续 preload 阶段还要从阿里云拉几百 MB 的 K8s 组件镜像，网络不好时仍需代理。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;实战记录 2（同日）&lt;/strong&gt;：中途 Ctrl+C 后重跑依然很慢，且开 Clash + &lt;code&gt;HTTPS_PROXY&lt;/code&gt; 无效。&#10;查 &lt;code&gt;~/.minikube/logs/lastStart.txt&lt;/code&gt; 发现剧情已变：&#10;上次没下完的 tar 包（464MB/1.17GB）残留在 &lt;code&gt;~/.minikube/cache/kic/&lt;/code&gt; 里，&#10;minikube 误判&amp;quot;有缓存&amp;quot;，加载时报 &lt;code&gt;tag ... not found in tarball&lt;/code&gt;（残缺包），&#10;随后走第二兜底——从 &lt;strong&gt;docker.io（Docker Hub，被墙）&lt;/strong&gt; 拉 &lt;code&gt;kicbase/stable&lt;/code&gt;。&#10;而 &lt;code&gt;HTTPS_PROXY&lt;/code&gt; 只对 minikube 本体的 HTTP 下载生效，&lt;strong&gt;管不到 Docker Desktop 里 dockerd 的拉取&lt;/strong&gt;&#10;（dockerd 走代理要在 Docker Desktop → Settings → Resources → Proxies 里配）。&#10;解法：删掉残缺缓存包 &lt;code&gt;rm ~/.minikube/cache/kic/arm64/kicbase_*.tar&lt;/code&gt;，&#10;加 &lt;code&gt;--base-image&lt;/code&gt; 指向本地完好镜像重跑。&lt;/p&gt;&#10;&lt;p&gt;教训：minikube 启动卡住时，先看 &lt;code&gt;~/.minikube/logs/lastStart.txt&lt;/code&gt; 确认&lt;strong&gt;到底卡在哪一步、在连谁&lt;/strong&gt;，&#10;再决定对策——不同阶段（CLI 下载 / dockerd 拉取 / 节点内 containerd 拉取）走的网络通道完全不同。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;实战记录 3（同日）&lt;/strong&gt;：集群验证时 &lt;code&gt;kubectl run nginx-test --image=nginx&lt;/code&gt; 卡 &lt;code&gt;ContainerCreating&lt;/code&gt;，&#10;&lt;code&gt;kubectl describe pod&lt;/code&gt; 显示 &lt;code&gt;Pulling image &amp;quot;nginx&amp;quot;&lt;/code&gt; 超百秒——节点内 containerd 直连 docker.io 被墙&#10;（通道 ③，Docker Desktop 的镜像代理设置管不到）。&#10;解法：&lt;code&gt;minikube image pull docker.m.daocloud.io/library/nginx&lt;/code&gt; 预拉进节点（约 6 分钟），&#10;删掉旧 Pod 后用带前缀的镜像名重建，5 秒 Running。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;注意：minikube 跑在 Docker Desktop 的虚拟机里，&lt;strong&gt;它的网络是 Docker Desktop 管的&lt;/strong&gt;，&#10;和你 Lima 虚拟机的 192.168.5.x/192.168.64.x 完全是两个世界，互不影响。&#10;排查思路可复用主线的分层法（&lt;a href="https://saflyer.cn/posts/k8s-00a-vm-system-init/"&gt;阶段 0（上）附录 A&lt;/a&gt;）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="6-体验完收拾干净"&gt;&lt;a href="#6-%e4%bd%93%e9%aa%8c%e5%ae%8c%e6%94%b6%e6%8b%be%e5%b9%b2%e5%87%80" class="header-anchor"&gt;&lt;/a&gt;6. 体验完收拾干净&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube delete&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Docker Desktop 里的 minikube 容器会被删除；brew uninstall minikube 可卸载本体&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="7-原理深挖一条命令背后发生了什么"&gt;&lt;a href="#7-%e5%8e%9f%e7%90%86%e6%b7%b1%e6%8c%96%e4%b8%80%e6%9d%a1%e5%91%bd%e4%bb%a4%e8%83%8c%e5%90%8e%e5%8f%91%e7%94%9f%e4%ba%86%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;7. 原理深挖：一条命令背后发生了什么&#10;&lt;/h2&gt;&lt;h3 id="71-四层套娃你的-pod-实际跑在哪"&gt;&lt;a href="#71-%e5%9b%9b%e5%b1%82%e5%a5%97%e5%a8%83%e4%bd%a0%e7%9a%84-pod-%e5%ae%9e%e9%99%85%e8%b7%91%e5%9c%a8%e5%93%aa" class="header-anchor"&gt;&lt;/a&gt;7.1 四层套娃：你的 Pod 实际跑在哪&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-3"&gt;&lt;a class="lnlinks" href="#hl-13-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-4"&gt;&lt;a class="lnlinks" href="#hl-13-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-5"&gt;&lt;a class="lnlinks" href="#hl-13-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-6"&gt;&lt;a class="lnlinks" href="#hl-13-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-7"&gt;&lt;a class="lnlinks" href="#hl-13-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-8"&gt;&lt;a class="lnlinks" href="#hl-13-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-9"&gt;&lt;a class="lnlinks" href="#hl-13-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-10"&gt;&lt;a class="lnlinks" href="#hl-13-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-11"&gt;&lt;a class="lnlinks" href="#hl-13-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;macOS（你的 Mac）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── Docker Desktop 的 Linux 虚拟机&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 容器共享宿主机内核，macOS 的内核不是 Linux，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 所以 Mac 上要跑 Linux 容器必须先有这台 Linux VM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── minikube 节点容器（kicbase 镜像）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 一个&amp;#34;假装自己是台完整服务器&amp;#34;的容器：内置 systemd、containerd、kubeadm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── systemd ── 管理 kubelet（和主线 Rocky 虚拟机里一模一样的形态）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── containerd ── 节点自己的容器运行时（独立于 Docker Desktop 的 dockerd）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 控制面静态 Pod：etcd / apiserver / scheduler / controller-manager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ （清单位于 /etc/kubernetes/manifests，kubeadm 的标准做法）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── 你的业务 Pod（nginx-test 就跑在这里）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;要点：minikube 节点&lt;strong&gt;不是虚拟机&lt;/strong&gt;，而是 Docker Desktop 那台 Linux VM 里的一个容器。&#10;kicbase（Kubernetes in Container）的绝活是把 systemd 塞进容器，&#10;于是 kubelet、containerd 都能以真实服务器的形态运行——&#10;你在主线阶段 0/1 亲手做的每件事，它都在这个容器里替你预置好了。&lt;/p&gt;&#10;&lt;h3 id="72-对照主线它把哪些步骤藏掉了"&gt;&lt;a href="#72-%e5%af%b9%e7%85%a7%e4%b8%bb%e7%ba%bf%e5%ae%83%e6%8a%8a%e5%93%aa%e4%ba%9b%e6%ad%a5%e9%aa%a4%e8%97%8f%e6%8e%89%e4%ba%86" class="header-anchor"&gt;&lt;/a&gt;7.2 对照主线：它把哪些步骤藏掉了&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主线亲手做（阶段 0/1）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;minikube 藏到哪&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;关 swap、注释 fstab&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kicbase 镜像本身无 swap&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SELinux 设宽容、关防火墙&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;容器里没有这套安全体系&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加载 br_netfilter、调 sysctl&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;节点容器启动时自动完成&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;装 containerd、配 certs.d 镜像代理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;containerd 内置于 kicbase；&lt;code&gt;--registry-mirror&lt;/code&gt; 可注入代理配置&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kubeadm init、证书签发&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;minikube 在节点内调用内置 kubeadm 自动完成&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;装 CNI 插件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内置轻量 CNI（kindnet）默认装好&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;写 kubeconfig、切上下文&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自动写入 &lt;code&gt;~/.kube/config&lt;/code&gt; 并设为当前上下文&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="73-kubectl-是怎么连上容器里的集群的"&gt;&lt;a href="#73-kubectl-%e6%98%af%e6%80%8e%e4%b9%88%e8%bf%9e%e4%b8%8a%e5%ae%b9%e5%99%a8%e9%87%8c%e7%9a%84%e9%9b%86%e7%be%a4%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;7.3 kubectl 是怎么连上&amp;quot;容器里的集群&amp;quot;的&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;API server 在节点容器内部监听 8443&lt;/li&gt;&#10;&lt;li&gt;Docker 把容器的 8443 映射到 Mac 的 &lt;code&gt;127.0.0.1:&amp;lt;随机端口&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;minikube 把 server 地址 + CA + 客户端证书写进 &lt;code&gt;~/.kube/config&lt;/code&gt; 的 minikube 上下文&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;动手验证（两个端口应一致）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker port minikube &lt;span class="c1"&gt;# 8443/tcp -&amp;gt; 127.0.0.1:xxxxx&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl config view --minify &lt;span class="p"&gt;|&lt;/span&gt; grep server &lt;span class="c1"&gt;# server: https://127.0.0.1:xxxxx&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="74-进节点亲眼看看强烈建议"&gt;&lt;a href="#74-%e8%bf%9b%e8%8a%82%e7%82%b9%e4%ba%b2%e7%9c%bc%e7%9c%8b%e7%9c%8b%e5%bc%ba%e7%83%88%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;7.4 进节点亲眼看看（强烈建议）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-3"&gt;&lt;a class="lnlinks" href="#hl-15-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-4"&gt;&lt;a class="lnlinks" href="#hl-15-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-5"&gt;&lt;a class="lnlinks" href="#hl-15-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube ssh &lt;span class="c1"&gt;# 进节点容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status kubelet --no-pager &lt;span class="c1"&gt;# kubelet 就是 systemd 服务，和主线一致&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /etc/kubernetes/manifests &lt;span class="c1"&gt;# 控制面静态 Pod 清单，kubeadm 同款&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo crictl images &lt;span class="c1"&gt;# 节点内 containerd 的镜像（前缀全是阿里云）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;看完你就明白：minikube ≈ 把&amp;quot;阶段 0 + 阶段 1 的全部手工&amp;quot;自动化后塞进一个容器。&#10;它替你省掉的每一步，都是你主线练过的每一步。&lt;/p&gt;&#10;&lt;h3 id="75-缓存与兜底链呼应第-5-节实战记录"&gt;&lt;a href="#75-%e7%bc%93%e5%ad%98%e4%b8%8e%e5%85%9c%e5%ba%95%e9%93%be%e5%91%bc%e5%ba%94%e7%ac%ac-5-%e8%8a%82%e5%ae%9e%e6%88%98%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;7.5 缓存与兜底链（呼应第 5 节实战记录）&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;K8s 组件镜像：minikube 先在 Mac 侧下载成 tar 存到 &lt;code&gt;~/.minikube/cache/images/&lt;/code&gt;，再装进节点——所以第二次 start 飞快&lt;/li&gt;&#10;&lt;li&gt;kicbase 底座的获取兜底链：本地 docker 已有 → 镜像仓库拉取（cn 参数指向阿里云）→ GitHub Release 直下 tar 包 → &lt;code&gt;docker.io/kicbase/stable&lt;/code&gt;；缓存 tar 在 &lt;code&gt;~/.minikube/cache/kic/&lt;/code&gt;，&lt;strong&gt;残缺缓存会投毒&lt;/strong&gt;（实战记录 2）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;minikube image pull &amp;lt;镜像&amp;gt;&lt;/code&gt; = 替你进节点让 containerd 拉镜像（通道 ③），拉完业务 Pod 秒起（实战记录 3）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="76-为什么说它偏离生产"&gt;&lt;a href="#76-%e4%b8%ba%e4%bb%80%e4%b9%88%e8%af%b4%e5%ae%83%e5%81%8f%e7%a6%bb%e7%94%9f%e4%ba%a7" class="header-anchor"&gt;&lt;/a&gt;7.6 为什么说它&amp;quot;偏离生产&amp;quot;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;节点是容器不是虚拟机：没有独立内核（与 Docker Desktop 的 VM 共享）、systemd 是被改造塞进容器的、网络是 docker 桥接而非真实节点网卡&lt;/li&gt;&#10;&lt;li&gt;单节点：控制面和业务负载挤在一起，练不到多节点、高可用&lt;/li&gt;&#10;&lt;li&gt;结论：它适合&amp;quot;用 K8s 跑东西&amp;quot;，不适合&amp;quot;理解 K8s 怎么活的&amp;quot;——所以本篇只是番外，主线 Lima + kubeadm 才是正菜&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="小结"&gt;&lt;a href="#%e5%b0%8f%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;小结&#10;&lt;/h2&gt;&lt;p&gt;Minikube 一分钟给你集群，主线一天教你集群——两个都体验过，&#10;你就同时拥有了&amp;quot;用的效率&amp;quot;和&amp;quot;修的底气&amp;quot;。回主线：阶段 1「搭建集群」（系列第 1 篇，即将发布）。&lt;/p&gt;&#10;</description></item><item><title>K8s 从零到实战 00（下）：内核参数与容器运行时（containerd 三关）</title><link>https://saflyer.cn/posts/k8s-00b-kernel-containerd/</link><pubDate>Sun, 13 Sep 2026 10:10:00 +0800</pubDate><guid>https://saflyer.cn/posts/k8s-00b-kernel-containerd/</guid><description>&lt;img src="https://saflyer.cn/posts/k8s-00b-kernel-containerd/cover.webp" alt="Featured image of post K8s 从零到实战 00（下）：内核参数与容器运行时（containerd 三关）" /&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;目标：完成 k8s 安装前的最后两项准备——内核网络参数（k8s 的神经网络）和容器运行时（k8s 的手）。&#10;前置：已完成 &lt;a href="https://saflyer.cn/posts/k8s-00a-vm-system-init/"&gt;阶段 0（上）：虚拟机与系统初始化&lt;/a&gt;。&#10;步骤编号延续上篇（从第 5 步开始）；所有命令在 Rocky 机器上以 root 执行。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="5-加载内核模块并开启-iptables-桥接流量必须"&gt;&lt;a href="#5-%e5%8a%a0%e8%bd%bd%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e5%b9%b6%e5%bc%80%e5%90%af-iptables-%e6%a1%a5%e6%8e%a5%e6%b5%81%e9%87%8f%e5%bf%85%e9%a1%bb" class="header-anchor"&gt;&lt;/a&gt;5. 加载内核模块并开启 iptables 桥接流量（必须）&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;为什么必须&lt;/strong&gt;——k8s 的 Service 网络（阶段 3 主角）依赖三样底层能力：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;overlay&lt;/code&gt;：容器镜像分层存储的文件系统，containerd 启动容器必备&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;br_netfilter&lt;/code&gt; + &lt;code&gt;bridge-nf-call-iptables=1&lt;/code&gt;：强制网桥流量经过 iptables。Service 虚拟 IP 靠 iptables 规则转换（kube-proxy 写入），桥内流量若绕过 iptables，Service 全部失灵&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ip_forward=1&lt;/code&gt;：允许节点转发数据包，跨节点 Pod 通信的前提&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缺了任何一样，阶段 1 的 &lt;code&gt;kubeadm init&lt;/code&gt; 预检会直接报错拒绝安装。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/modules-load.d/k8s.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;overlay&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;br_netfilter&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe overlay&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe br_netfilter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/k8s.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-ip6tables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.bridge.bridge-nf-call-iptables = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv4.ip_forward = 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl --system&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证&lt;/strong&gt;：&lt;code&gt;lsmod | grep br_netfilter&lt;/code&gt; 应有输出，例如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;br_netfilter 32768 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bridge 315392 1 br_netfilter&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;输出读法（四列 = 模块名 / 大小(字节) / 引用计数 / 被谁引用）：&#10;引用计数 &lt;code&gt;0&lt;/code&gt; 不等于没用——&lt;code&gt;br_netfilter&lt;/code&gt; 靠 sysctl 开关起作用，不靠被谁引用；&#10;&lt;code&gt;bridge&lt;/code&gt; 行尾出现 &lt;code&gt;br_netfilter&lt;/code&gt;，说明它是 bridge 网桥驱动的&amp;quot;扩展插件&amp;quot;，&#10;专门给网桥加 netfilter（iptables）钩子。两行都在 = 这对搭档都在岗。&#10;（&lt;code&gt;/etc/modules-load.d/&lt;/code&gt; 管开机自动加载，&lt;code&gt;modprobe&lt;/code&gt; 管立即生效，缺一不可。）&lt;/p&gt;&#10;&lt;h2 id="6-安装容器运行时-containerd"&gt;&lt;a href="#6-%e5%ae%89%e8%a3%85%e5%ae%b9%e5%99%a8%e8%bf%90%e8%a1%8c%e6%97%b6-containerd" class="header-anchor"&gt;&lt;/a&gt;6. 安装容器运行时 containerd&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;k8s 自己不会跑容器&lt;/strong&gt;——它只是调度大脑（决定 Pod 放哪台机器），真正拉镜像、起容器的是&lt;strong&gt;容器运行时&lt;/strong&gt;。kubelet 通过标准接口 CRI 指挥 containerd 干活：&lt;code&gt;kubectl 命令 → apiserver → scheduler → kubelet → containerd → 容器进程&lt;/code&gt;。&#10;Kubernetes 从 1.24 起不再直接支持 Docker（它对 k8s 来说太重），&lt;strong&gt;containerd 是主流选择&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="61-安装"&gt;&lt;a href="#61-%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;6.1 安装&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-6"&gt;&lt;a class="lnlinks" href="#hl-2-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-7"&gt;&lt;a class="lnlinks" href="#hl-2-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-2-8"&gt;&lt;a class="lnlinks" href="#hl-2-8"&gt;8&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# download.docker.com 国内不可达，使用阿里云 docker-ce 源（只借用它里面的 containerd 包）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 containerd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y install containerd.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成默认配置&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd config default &amp;gt; /etc/containerd/config.toml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;containerd 的官方发布渠道是 Docker 公司的软件源 &lt;code&gt;download.docker.com&lt;/code&gt;（国内不可达）。阿里把它整个镜像了一份，我们&lt;strong&gt;借仓库只取 &lt;code&gt;containerd.io&lt;/code&gt; 这一个包&lt;/strong&gt;，不装 docker-ce 本身——虚拟机里不会有 Docker&lt;/li&gt;&#10;&lt;li&gt;包名是 &lt;code&gt;containerd.io&lt;/code&gt;（不带 .io 的是另一个老包，别搞混）&lt;/li&gt;&#10;&lt;li&gt;containerd 没有开箱即用的配置文件，必须先用 &lt;code&gt;config default&lt;/code&gt; 生成底版再修改&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="62-关键修改-1systemdcgroup--true与-kubelet-统一资源管理"&gt;&lt;a href="#62-%e5%85%b3%e9%94%ae%e4%bf%ae%e6%94%b9-1systemdcgroup--true%e4%b8%8e-kubelet-%e7%bb%9f%e4%b8%80%e8%b5%84%e6%ba%90%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;6.2 关键修改 1：SystemdCgroup = true（与 kubelet 统一资源管理）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;s/SystemdCgroup = false/SystemdCgroup = true/&amp;#39;&lt;/span&gt; /etc/containerd/config.toml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么必改&lt;/strong&gt;：cgroup 是 Linux 给进程分配/限制资源（CPU、内存）的机制，k8s 的 requests/limits 全靠它。&#10;cgroup 有两种&amp;quot;管理员&amp;quot;：cgroupfs（传统写法）和 systemd（Rocky 9 等现代发行版由 systemd 统一管理）。&#10;&lt;strong&gt;一台机器只能有一个管理员&lt;/strong&gt;——kubelet 用 systemd，containerd 默认却是 cgroupfs（&lt;code&gt;false&lt;/code&gt;），&#10;两个管理员各记一套账，会导致资源统计错乱、节点不稳定。这行 sed 把 containerd 也划归 systemd 阵营。&lt;/p&gt;&#10;&lt;h3 id="63-关键修改-2certsd-镜像代理国内拉镜像的生存指南"&gt;&lt;a href="#63-%e5%85%b3%e9%94%ae%e4%bf%ae%e6%94%b9-2certsd-%e9%95%9c%e5%83%8f%e4%bb%a3%e7%90%86%e5%9b%bd%e5%86%85%e6%8b%89%e9%95%9c%e5%83%8f%e7%9a%84%e7%94%9f%e5%ad%98%e6%8c%87%e5%8d%97" class="header-anchor"&gt;&lt;/a&gt;6.3 关键修改 2：certs.d 镜像代理（国内拉镜像的生存指南）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-5"&gt;&lt;a class="lnlinks" href="#hl-4-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-6"&gt;&lt;a class="lnlinks" href="#hl-4-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-7"&gt;&lt;a class="lnlinks" href="#hl-4-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-8"&gt;&lt;a class="lnlinks" href="#hl-4-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-9"&gt;&lt;a class="lnlinks" href="#hl-4-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-10"&gt;&lt;a class="lnlinks" href="#hl-4-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-11"&gt;&lt;a class="lnlinks" href="#hl-4-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-12"&gt;&lt;a class="lnlinks" href="#hl-4-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-13"&gt;&lt;a class="lnlinks" href="#hl-4-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-14"&gt;&lt;a class="lnlinks" href="#hl-4-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-15"&gt;&lt;a class="lnlinks" href="#hl-4-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-16"&gt;&lt;a class="lnlinks" href="#hl-4-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-17"&gt;&lt;a class="lnlinks" href="#hl-4-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-18"&gt;&lt;a class="lnlinks" href="#hl-4-18"&gt;18&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-19"&gt;&lt;a class="lnlinks" href="#hl-4-19"&gt;19&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Docker Hub 国内被墙，给 docker.io 配置镜像代理（daocloud）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# containerd 的 registry 配置采用 certs.d 目录（类似 docker 的 registry-mirrors）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/containerd/certs.d/docker.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/containerd/certs.d/docker.io/hosts.toml &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;server = &amp;#34;https://docker.io&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[host.&amp;#34;https://docker.m.daocloud.io&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; capabilities = [&amp;#34;pull&amp;#34;, &amp;#34;resolve&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 同理给 registry.k8s.io 配代理：它的 CDN 是 Google 的，国内同样被墙&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#（kubeadm 装集群时我们改用阿里云源规避；但 ingress-nginx、metrics-server 等&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第三方组件的镜像也在 registry.k8s.io，阶段 6/8 会用到这个代理）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/containerd/certs.d/registry.k8s.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/containerd/certs.d/registry.k8s.io/hosts.toml &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;server = &amp;#34;https://registry.k8s.io&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[host.&amp;#34;https://k8s.m.daocloud.io&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; capabilities = [&amp;#34;pull&amp;#34;, &amp;#34;resolve&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启用 certs.d 目录（containerd 2.x 默认配置里 config_path 为空，指过去即可）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;/^\s*config_path = &amp;#39;&amp;#39;\s*&lt;/span&gt;$&lt;span class="s2"&gt;/s/&amp;#39;&amp;#39;/&amp;#39;\/etc\/containerd\/certs.d&amp;#39;/&amp;#34;&lt;/span&gt; /etc/containerd/config.toml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：certs.d 是 containerd 的&amp;quot;仓库导航改写本&amp;quot;。它拉镜像时的决策过程是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-5"&gt;&lt;a class="lnlinks" href="#hl-5-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-6"&gt;&lt;a class="lnlinks" href="#hl-5-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;要拉 nginx:1.27&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 补全为完整地址 docker.io/library/nginx:1.27&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 查导航本：/etc/containerd/certs.d/ 下有没有叫 docker.io 的目录？&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 有！读里面的 hosts.toml：docker.io 的请求改走 docker.m.daocloud.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;实际从 daocloud 下载，但镜像在本地的&amp;#34;户口本&amp;#34;仍登记为 docker.io/library/nginx:1.27&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;目录结构就是映射关系——要拉哪个仓库的镜像，就用哪个目录下的 &lt;code&gt;hosts.toml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-6-3"&gt;&lt;a class="lnlinks" href="#hl-6-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/containerd/certs.d/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── docker.io/hosts.toml ← 拉 nginx 等 Docker Hub 镜像时生效&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── registry.k8s.io/hosts.toml ← 拉 k8s 官方组件镜像时生效&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;hosts.toml&lt;/code&gt; 三行的含义：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://docker.io&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# 这份配置管哪个仓库（&amp;#34;户主&amp;#34;）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# 实际去哪拉（&amp;#34;代取点&amp;#34;，可写多个按顺序试）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;capabilities&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pull&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;resolve&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# 代取点只允许&amp;#34;解析+拉取&amp;#34;，禁止 push（安全）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;最后那条 sed 是总开关：containerd 2.x 默认配置里 &lt;code&gt;config_path = ''&lt;/code&gt;（空 = 根本不看 certs.d 目录），&#10;把它指向该目录，导航本才生效。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;为什么这样设计，而不是别的办法&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;❌ &lt;strong&gt;直接改镜像名&lt;/strong&gt;（把 &lt;code&gt;nginx&lt;/code&gt; 写成 &lt;code&gt;docker.m.daocloud.io/library/nginx&lt;/code&gt;）：镜像名写在全世界的&#10;YAML、Helm Chart、kubeadm 生成的清单里，改不完也改不到；换代理时还要全局替换&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;strong&gt;配 HTTP 代理&lt;/strong&gt;：多一个要维护的中间故障点，且企业环境未必有代理可用&lt;/li&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;certs.d&lt;/strong&gt;：只在一个地方声明映射，全世界照常用官方镜像名，拉取被悄悄改道；&#10;daocloud 挂了改两行 hosts.toml 换一家即可，业务零改动。&#10;本质是&lt;strong&gt;逻辑地址（镜像名）与物理地址（镜像站）解耦&lt;/strong&gt;，对 kubelet/YAML/Helm 完全透明&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;registry.k8s.io 那份的必要性&lt;/strong&gt;：阶段 1 装集群时核心组件可以换阿里云源，&#10;但 ingress-nginx（阶段 6）、metrics-server（阶段 8）等第三方组件的官方清单里&lt;strong&gt;写死了&lt;/strong&gt;&#10;&lt;code&gt;registry.k8s.io&lt;/code&gt; 地址，不便改也没法改。配上这条，届时 &lt;code&gt;kubectl apply&lt;/code&gt; 官方清单直接跑通。&lt;/p&gt;&#10;&lt;h3 id="64-关键修改-3pausesandbox镜像指向阿里云国内搭集群第一坑"&gt;&lt;a href="#64-%e5%85%b3%e9%94%ae%e4%bf%ae%e6%94%b9-3pausesandbox%e9%95%9c%e5%83%8f%e6%8c%87%e5%90%91%e9%98%bf%e9%87%8c%e4%ba%91%e5%9b%bd%e5%86%85%e6%90%ad%e9%9b%86%e7%be%a4%e7%ac%ac%e4%b8%80%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;6.4 关键修改 3：pause（sandbox）镜像指向阿里云（国内搭集群第一坑）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-3"&gt;&lt;a class="lnlinks" href="#hl-8-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kubelet 1.34 起改为从 containerd 获取 pause 镜像地址（旧的 --pod-infra-container-image 已失效），&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 而 containerd 默认的 registry.k8s.io/pause 的 CDN 国内被墙，不改会导致所有 Pod 卡在创建阶段&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;/^ \[plugins.&amp;#39;io.containerd.cri.v1.images&amp;#39;\]&lt;/span&gt;$&lt;span class="s2"&gt;/a\ sandbox_image = \&amp;#34;registry.aliyuncs.com/google_containers/pause:3.10.2\&amp;#34;&amp;#34;&lt;/span&gt; /etc/containerd/config.toml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;pause 容器是什么&lt;/strong&gt;：一个 Pod 可以装多个容器，它们共享同一个网络命名空间（同一个 IP）。&#10;这个&amp;quot;共享&amp;quot;需要一个先行者先把网络命名空间创建好、占住位置——就是 pause 容器（沙箱容器）。&#10;每个 Pod 里都有一个看不见的 pause，几乎不占资源，但没它 Pod 无法创建。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;问题链条&lt;/strong&gt;：pause 镜像默认在 &lt;code&gt;registry.k8s.io/pause&lt;/code&gt;（Google CDN，国内被墙）→&#10;老办法是 kubelet 参数 &lt;code&gt;--pod-infra-container-image&lt;/code&gt;，但 &lt;strong&gt;kubelet 1.34 起该参数失效&lt;/strong&gt;，&#10;改为从 containerd 的 &lt;code&gt;sandbox_image&lt;/code&gt; 读取 → 不改的后果是&lt;strong&gt;所有 Pod 永远卡在 ContainerCreating&lt;/strong&gt;。&#10;这条 sed 在该插件节下追加一行，指向阿里云镜像站（&lt;code&gt;a\&lt;/code&gt; = 在匹配行之后追加）。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;三关总结：&lt;code&gt;SystemdCgroup&lt;/code&gt; 让 containerd 与 kubelet 和平共处；&#10;&lt;code&gt;certs.d&lt;/code&gt; 让 Docker Hub / k8s 官方镜像拉得到；&lt;code&gt;sandbox_image&lt;/code&gt; 让 Pod 能创建。&#10;少任何一个，阶段 1 都会以不同的姿势翻车。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="65-按需虚拟机直连出网被拦时给-containerd-配代理"&gt;&lt;a href="#65-%e6%8c%89%e9%9c%80%e8%99%9a%e6%8b%9f%e6%9c%ba%e7%9b%b4%e8%bf%9e%e5%87%ba%e7%bd%91%e8%a2%ab%e6%8b%a6%e6%97%b6%e7%bb%99-containerd-%e9%85%8d%e4%bb%a3%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;6.5 （按需）虚拟机直连出网被拦时：给 containerd 配代理&#10;&lt;/h3&gt;&lt;p&gt;containerd 是系统服务，不读你终端里 export 的代理变量，必须用 systemd drop-in 单独配置&#10;（&lt;code&gt;192.168.5.2&lt;/code&gt; 是 Lima 内置的&amp;quot;Mac 本机&amp;quot;地址，长期有效，排查思路见&#10;&lt;a href="https://saflyer.cn/posts/k8s-00a-vm-system-init/"&gt;阶段 0（上）附录 A&lt;/a&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-2"&gt;&lt;a class="lnlinks" href="#hl-9-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-3"&gt;&lt;a class="lnlinks" href="#hl-9-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-4"&gt;&lt;a class="lnlinks" href="#hl-9-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-5"&gt;&lt;a class="lnlinks" href="#hl-9-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-6"&gt;&lt;a class="lnlinks" href="#hl-9-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-9-7"&gt;&lt;a class="lnlinks" href="#hl-9-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/systemd/system/containerd.service.d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/systemd/system/containerd.service.d/proxy.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Environment=&amp;#34;HTTP_PROXY=http://192.168.5.2:7897&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Environment=&amp;#34;HTTPS_PROXY=http://192.168.5.2:7897&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Environment=&amp;#34;NO_PROXY=localhost,127.0.0.1,192.168.5.0/24,192.168.64.0/24,192.168.0.0/16,10.96.0.0/12&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 配了这个代理后，将来直连恢复或 Clash 关闭时&lt;strong&gt;必须删掉它并重启 containerd&lt;/strong&gt;&#10;（&lt;code&gt;rm 该文件 &amp;amp;&amp;amp; systemctl daemon-reload &amp;amp;&amp;amp; systemctl restart containerd&lt;/code&gt;），&#10;否则 containerd 拉镜像全部失败。原则：代理配置和代理软件同开同关。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="66-启动与验证"&gt;&lt;a href="#66-%e5%90%af%e5%8a%a8%e4%b8%8e%e9%aa%8c%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;6.6 启动与验证&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-4"&gt;&lt;a class="lnlinks" href="#hl-10-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-5"&gt;&lt;a class="lnlinks" href="#hl-10-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动并设为开机自启&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now containerd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl restart containerd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status containerd --no-pager&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ctr version &lt;span class="c1"&gt;# 能看到 Client/Server 版本号即成功&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 &lt;strong&gt;镜像代理说明&lt;/strong&gt;：配置后，所有 &lt;code&gt;nginx&lt;/code&gt;、&lt;code&gt;mysql&lt;/code&gt; 这类来自 Docker Hub 的镜像&#10;会经由 &lt;code&gt;docker.m.daocloud.io&lt;/code&gt; 代理拉取，对 Kubernetes 完全透明（镜像名不用改）。&#10;如果 daocloud 将来失效，换其他可用代理地址改 &lt;code&gt;hosts.toml&lt;/code&gt; 即可。&#10;k8s 官方镜像仓库 &lt;code&gt;registry.k8s.io&lt;/code&gt; 本教程网络实测可达，无需代理；&#10;如果你的网络不行，阶段 1 有阿里云替代方案。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="7-检查清单"&gt;&lt;a href="#7-%e6%a3%80%e6%9f%a5%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;7. 检查清单&#10;&lt;/h2&gt;&lt;p&gt;进入下一阶段前确认：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-3"&gt;&lt;a class="lnlinks" href="#hl-12-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-4"&gt;&lt;a class="lnlinks" href="#hl-12-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-5"&gt;&lt;a class="lnlinks" href="#hl-12-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapon --show &lt;span class="c1"&gt;# 无输出（swap 已关）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;getenforce &lt;span class="c1"&gt;# Permissive&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl is-active containerd &lt;span class="c1"&gt;# active&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.ipv4.ip_forward &lt;span class="c1"&gt;# = 1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep br_netfilter &lt;span class="c1"&gt;# 有输出&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="常见问题"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;常见问题&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q: 第 6 步装 containerd / 拉镜像时网络不通？&lt;/strong&gt;&#10;containerd 是系统服务，不读终端环境变量。先按上篇附录 A 的分层法确认是不是&amp;quot;虚拟机直连被拦&amp;quot;，&#10;是的话用第 6.5 节的 systemd drop-in 给 containerd 配代理；&#10;将来 Pod 出现 &lt;code&gt;ImagePullBackOff&lt;/code&gt; 也先怀疑这层。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Q: containerd 配置文件里的插件名为什么和网上旧教程不一样？&lt;/strong&gt;&#10;containerd 2.x 使用了新版配置格式（如 &lt;code&gt;io.containerd.cri.v1.images&lt;/code&gt;），&#10;旧教程里的 &lt;code&gt;io.containerd.grpc.v1.cri&lt;/code&gt; 是 1.x 的写法。本教程的 sed 命令两种都兼容。&lt;/p&gt;&#10;&lt;h2 id="附录-b集群装好后如何验证阶段-1-完成后使用"&gt;&lt;a href="#%e9%99%84%e5%bd%95-b%e9%9b%86%e7%be%a4%e8%a3%85%e5%a5%bd%e5%90%8e%e5%a6%82%e4%bd%95%e9%aa%8c%e8%af%81%e9%98%b6%e6%ae%b5-1-%e5%ae%8c%e6%88%90%e5%90%8e%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;附录 B：集群装好后如何验证（阶段 1 完成后使用）&#10;&lt;/h2&gt;&lt;p&gt;进程活着 ≠ 集群可用，&lt;strong&gt;能跑起一个真 Pod 才是终极证明&lt;/strong&gt;。按三层验证（虚拟机里、root 执行）：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第一层：节点状态&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望：STATUS 是 Ready&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第二层：系统组件 Pod 全部 Running&lt;/strong&gt;（最关键）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-3"&gt;&lt;a class="lnlinks" href="#hl-14-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-4"&gt;&lt;a class="lnlinks" href="#hl-14-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-5"&gt;&lt;a class="lnlinks" href="#hl-14-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-6"&gt;&lt;a class="lnlinks" href="#hl-14-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -n kube-system&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望：etcd、kube-apiserver、kube-scheduler、kube-controller-manager、&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# coredns（2个）、calico-node 全部 Running 且 READY 是 1/1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -A&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不能有 Pending / CrashLoopBackOff / ImagePullBackOff&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第三层：跑一个真容器（终极证明）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-3"&gt;&lt;a class="lnlinks" href="#hl-15-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-4"&gt;&lt;a class="lnlinks" href="#hl-15-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-5"&gt;&lt;a class="lnlinks" href="#hl-15-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl run nginx-test --image&lt;span class="o"&gt;=&lt;/span&gt;nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -w &lt;span class="c1"&gt;# 看到 Running 后 Ctrl+C（这步同时验证了调度、镜像拉取、pause 镜像、CNI）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -o wide &lt;span class="c1"&gt;# Pod 拿到 IP = Calico 网络正常&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; -it nginx-test -- curl -sI localhost &lt;span class="p"&gt;|&lt;/span&gt; head -1 &lt;span class="c1"&gt;# 期望：HTTP/1.1 200 OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete pod nginx-test &lt;span class="c1"&gt;# 清理&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;辅助定位&lt;/strong&gt;（上面不正常时查）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-2"&gt;&lt;a class="lnlinks" href="#hl-16-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl is-active kubelet containerd &lt;span class="c1"&gt;# 都应为 active&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crictl ps &lt;span class="p"&gt;|&lt;/span&gt; head &lt;span class="c1"&gt;# containerd 层面的容器（应有 pause 和业务容器）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;判断标准速记：&lt;code&gt;get nodes&lt;/code&gt; Ready → 集群成立；kube-system 全 Running → 控制面健康；&#10;自建 Pod 到 Running 且能 exec → 端到端真通了（也是本阶段 containerd 三个关键修改的验收）。&#10;若 kubectl 报 &amp;ldquo;connection to localhost:8080 refused&amp;rdquo;，说明 kubeconfig 没配，先做阶段 1 的&#10;&lt;code&gt;mkdir -p $HOME/.kube &amp;amp;&amp;amp; cp /etc/kubernetes/admin.conf $HOME/.kube/config&lt;/code&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="动手练习"&gt;&lt;a href="#%e5%8a%a8%e6%89%8b%e7%bb%83%e4%b9%a0" class="header-anchor"&gt;&lt;/a&gt;动手练习&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;查看 containerd 配置文件 &lt;code&gt;/etc/containerd/config.toml&lt;/code&gt;，找到你刚改的 &lt;code&gt;SystemdCgroup&lt;/code&gt; 和 &lt;code&gt;config_path&lt;/code&gt; 两行。&lt;/li&gt;&#10;&lt;li&gt;查看 &lt;code&gt;/etc/containerd/certs.d/docker.io/hosts.toml&lt;/code&gt;，理解镜像代理的配置结构。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="下一步"&gt;&lt;a href="#%e4%b8%8b%e4%b8%80%e6%ad%a5" class="header-anchor"&gt;&lt;/a&gt;下一步&#10;&lt;/h2&gt;&lt;p&gt;➡️ 阶段 1：搭建集群（系列第 1 篇，即将发布——从这里开始正式安装 Kubernetes）&lt;/p&gt;&#10;</description></item><item><title>K8s 从零到实战 00（上）：虚拟机与系统初始化（Lima + Rocky 9）</title><link>https://saflyer.cn/posts/k8s-00a-vm-system-init/</link><pubDate>Sun, 13 Sep 2026 10:00:00 +0800</pubDate><guid>https://saflyer.cn/posts/k8s-00a-vm-system-init/</guid><description>&lt;img src="https://saflyer.cn/posts/k8s-00a-vm-system-init/cover.webp" alt="Featured image of post K8s 从零到实战 00（上）：虚拟机与系统初始化（Lima + Rocky 9）" /&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;目标：得到一台 Rocky Linux 9 机器，并完成最基础的系统设置（软件源、swap、防火墙、SELinux）。本篇&lt;strong&gt;不涉及任何 k8s 安装&lt;/strong&gt;。&#10;本地练习用 Lima 在 Mac 上创建虚拟机；如果是真实服务器，直接从「第 2 步」开始。&#10;网络异常（dnf 卡住 / 虚拟机无法出网）直接看文末「附录 A：网络分层排查实录」。&#10;本篇为阶段 0 上半部分；内核参数与容器运行时见 &lt;a href="https://saflyer.cn/posts/k8s-00b-kernel-containerd/"&gt;阶段 0（下）&lt;/a&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="1-创建-rocky-linux-9-虚拟机仅-mac-本地练习需要"&gt;&lt;a href="#1-%e5%88%9b%e5%bb%ba-rocky-linux-9-%e8%99%9a%e6%8b%9f%e6%9c%ba%e4%bb%85-mac-%e6%9c%ac%e5%9c%b0%e7%bb%83%e4%b9%a0%e9%9c%80%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;1. 创建 Rocky Linux 9 虚拟机（仅 Mac 本地练习需要）&#10;&lt;/h2&gt;&lt;h3 id="11-搭建思路小白视角"&gt;&lt;a href="#11-%e6%90%ad%e5%bb%ba%e6%80%9d%e8%b7%af%e5%b0%8f%e7%99%bd%e8%a7%86%e8%a7%92" class="header-anchor"&gt;&lt;/a&gt;1.1 搭建思路（小白视角）&#10;&lt;/h3&gt;&lt;p&gt;在动手前，先搞清楚&amp;quot;我们到底在造什么东西&amp;quot;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你的 Mac（macOS，没有 Linux 内核）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ k8s 是纯粹的 Linux 技术，macOS 上跑不了&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;需要一个&amp;#34;电脑里的电脑&amp;#34; = 虚拟机&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Lima：开源虚拟机工具（brew 安装），底层用 macOS 自带的虚拟化框架&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;虚拟机开机需要两样东西：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ① 系统盘镜像 = 一个&amp;#34;装好 Rocky 9 系统的硬盘文件&amp;#34;（qcow2，约 496MB）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ② 规格说明书 = 模板文件 lima/rocky-9-ustc.yaml（用哪个镜像、几张网卡、挂什么目录）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl start 读模板 → 校验镜像 → 复制扩容成 30G 系统盘 → 开机 → 自动配好 SSH&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell 进去，就是一台标准的 Rocky Linux 9 服务器&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么要手动下载镜像&lt;/strong&gt;（而不是让 Lima 自己下）：Rocky 官方源国内只有约 50KB/s，&#10;国内最快的中科大镜像站会用 WAF 拦截 Lima 的多线程下载器（403）。&#10;所以用 curl 单线程先下载到本地（1~2 分钟），模板直接指向本地文件——&#10;创建虚拟机时&lt;strong&gt;完全不需要联网下载&lt;/strong&gt;，重建也只要几分钟。&lt;/p&gt;&#10;&lt;h3 id="12-操作命令"&gt;&lt;a href="#12-%e6%93%8d%e4%bd%9c%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;1.2 操作命令&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-4"&gt;&lt;a class="lnlinks" href="#hl-1-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-5"&gt;&lt;a class="lnlinks" href="#hl-1-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-6"&gt;&lt;a class="lnlinks" href="#hl-1-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-7"&gt;&lt;a class="lnlinks" href="#hl-1-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-8"&gt;&lt;a class="lnlinks" href="#hl-1-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-9"&gt;&lt;a class="lnlinks" href="#hl-1-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-10"&gt;&lt;a class="lnlinks" href="#hl-1-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-11"&gt;&lt;a class="lnlinks" href="#hl-1-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-12"&gt;&lt;a class="lnlinks" href="#hl-1-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-13"&gt;&lt;a class="lnlinks" href="#hl-1-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-14"&gt;&lt;a class="lnlinks" href="#hl-1-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-15"&gt;&lt;a class="lnlinks" href="#hl-1-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-16"&gt;&lt;a class="lnlinks" href="#hl-1-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-17"&gt;&lt;a class="lnlinks" href="#hl-1-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-18"&gt;&lt;a class="lnlinks" href="#hl-1-18"&gt;18&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-1-19"&gt;&lt;a class="lnlinks" href="#hl-1-19"&gt;19&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ① 安装 Lima（开源虚拟机工具）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install lima&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证安装：版本号 ≥ 2.0.0 即满足模板门槛（minimumLimaVersion: 2.0.0）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew info lima &lt;span class="p"&gt;|&lt;/span&gt; head -2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：==&amp;gt; lima ✔: stable 2.2.0 (bottled), HEAD&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注：Caveats 里提到的 lima-additional-guestagents 是给&amp;#34;跨架构模拟&amp;#34;用的&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#（M 系列芯片跑 x86 虚拟机才需要），aarch64 虚拟机 + Apple Silicon 是同架构，不用装。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ② 从中科大镜像站手动下载 Rocky 9.8 镜像（约496MB，1~2分钟）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -o lima/images/rocky-9.8-aarch64.qcow2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://mirrors.ustc.edu.cn/rocky/9/images/aarch64/Rocky-9-GenericCloud-Base-9.8-20260525.0.aarch64.qcow2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# （可选）校验镜像完整性：输出必须等于模板里的 digest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shasum -a &lt;span class="m"&gt;256&lt;/span&gt; lima/images/rocky-9.8-aarch64.qcow2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ③ 创建并启动虚拟机（4核/6GB内存/30GB磁盘），模板 lima/rocky-9-ustc.yaml 指向上面的本地镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl start --name&lt;span class="o"&gt;=&lt;/span&gt;k8s-rocky --cpus&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; --memory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt; --disk&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; --tty&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; lima/rocky-9-ustc.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;预期输出&lt;/strong&gt;（创建完成后）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO[...] READY. Run `limactl shell k8s-rocky` to open the shell.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;④ 确认虚拟机创建成功&lt;/strong&gt;（三连验证，都在 Mac 上执行）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-4"&gt;&lt;a class="lnlinks" href="#hl-3-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-5"&gt;&lt;a class="lnlinks" href="#hl-3-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-6"&gt;&lt;a class="lnlinks" href="#hl-3-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-7"&gt;&lt;a class="lnlinks" href="#hl-3-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-8"&gt;&lt;a class="lnlinks" href="#hl-3-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-9"&gt;&lt;a class="lnlinks" href="#hl-3-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-10"&gt;&lt;a class="lnlinks" href="#hl-3-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-11"&gt;&lt;a class="lnlinks" href="#hl-3-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-12"&gt;&lt;a class="lnlinks" href="#hl-3-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-3-13"&gt;&lt;a class="lnlinks" href="#hl-3-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第一看状态：STATUS 是 Running，且规格符合预期（4核/6GiB/30GiB）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# k8s-rocky Running 127.0.0.1:xxxxx vz aarch64 4 6GiB 30GiB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第二看系统：能读出 Rocky Linux 9 的系统信息&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell k8s-rocky -- cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：NAME=&amp;#34;Rocky Linux&amp;#34; / VERSION=&amp;#34;9.8 (Blue Onyx)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第三看架构：aarch64（与模板 arch 一致）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell k8s-rocky -- uname -m&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 预期输出：aarch64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ⑤ 进入虚拟机（之后所有操作都在虚拟机里执行）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell k8s-rocky&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;真实服务器&lt;/strong&gt;：跳过本步，直接 SSH 登录你的 Rocky 9 服务器即可。&#10;以下所有命令在两种环境下完全一致。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="13-模板文件逐行解读limarocky-9-ustcyaml"&gt;&lt;a href="#13-%e6%a8%a1%e6%9d%bf%e6%96%87%e4%bb%b6%e9%80%90%e8%a1%8c%e8%a7%a3%e8%af%bblimarocky-9-ustcyaml" class="header-anchor"&gt;&lt;/a&gt;1.3 模板文件逐行解读（lima/rocky-9-ustc.yaml）&#10;&lt;/h3&gt;&lt;p&gt;模板全文如下（它就是你这台虚拟机的&amp;quot;出生证明&amp;quot;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-5"&gt;&lt;a class="lnlinks" href="#hl-5-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-6"&gt;&lt;a class="lnlinks" href="#hl-5-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-7"&gt;&lt;a class="lnlinks" href="#hl-5-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-8"&gt;&lt;a class="lnlinks" href="#hl-5-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-9"&gt;&lt;a class="lnlinks" href="#hl-5-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-10"&gt;&lt;a class="lnlinks" href="#hl-5-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-11"&gt;&lt;a class="lnlinks" href="#hl-5-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-12"&gt;&lt;a class="lnlinks" href="#hl-5-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-13"&gt;&lt;a class="lnlinks" href="#hl-5-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-14"&gt;&lt;a class="lnlinks" href="#hl-5-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-15"&gt;&lt;a class="lnlinks" href="#hl-5-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-5-16"&gt;&lt;a class="lnlinks" href="#hl-5-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Lima 虚拟机模板：Rocky Linux 9 (aarch64)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;minimumLimaVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2.0.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/Users/wyf/work/agentproject/k8study/lima/images/rocky-9.8-aarch64.qcow2&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;arch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sha256:24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;~&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mountTypesUnsupported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;9p]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 使用 macOS Virtualization.framework 的 NAT 网络（vzNAT）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;vzNAT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;逐字段拆解：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;minimumLimaVersion: 2.0.0&lt;/code&gt;&lt;/strong&gt; — 版本门槛&#10;Lima 低于 2.0.0 会直接拒绝启动这个模板，而不是做到一半出错。相当于软件包装盒上的&amp;quot;系统要求&amp;quot;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;images:&lt;/code&gt;&lt;/strong&gt; — 虚拟机的系统盘从哪来&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;字段&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;location&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;镜像文件位置。可以是 URL（Lima 会联网下载），这里写死本地绝对路径 → 创建时零下载&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;arch&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;镜像的 CPU 架构。&lt;code&gt;aarch64&lt;/code&gt; = ARM64，对应 Apple Silicon；Intel Mac 要用 &lt;code&gt;x86_64&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;digest&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;镜像的 SHA256 校验值。Lima 用前必校验，文件损坏或被篡改就拒绝启动&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;手动校验镜像完整性的方法（算法必须和模板里一致，MD5 和 SHA256 没有可比性）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shasum -a &lt;span class="m"&gt;256&lt;/span&gt; lima/images/rocky-9.8-aarch64.qcow2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出应等于 24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;mounts: - location: &amp;quot;~&amp;quot;&lt;/code&gt;&lt;/strong&gt; — 把 Mac 主目录共享进虚拟机&#10;Mac 的 &lt;code&gt;/Users/wyf&lt;/code&gt; 会原样出现在虚拟机的 &lt;code&gt;/Users/wyf&lt;/code&gt;（同路径、同数据、实时同步）。&#10;所以虚拟机里能直接看到本教程的 docs 和 scripts，不用来回拷贝。&#10;&lt;strong&gt;默认只读&lt;/strong&gt;（没写 &lt;code&gt;writable: true&lt;/code&gt;），虚拟机改不了 Mac 的文件——这是安全设计。&#10;实物证据：开机后这行配置被翻译成虚拟机 &lt;code&gt;/etc/fstab&lt;/code&gt; 里的一条记录&#10;&lt;code&gt;lima-... /Users/wyf virtiofs ro,nofail,...&lt;/code&gt;（virtiofs 文件系统 + ro 只读）。&#10;附带福利：&lt;code&gt;limactl shell&lt;/code&gt; 进虚拟机会自动 cd 到你 Mac 上当前所在的目录。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;mountTypesUnsupported: [9p]&lt;/code&gt;&lt;/strong&gt; — 禁用一种挂载实现&#10;目录共享有多种后端技术，&lt;code&gt;9p&lt;/code&gt; 是老牌协议但 Rocky 9 内核支持不好。&#10;声明不支持后，Lima 改用 virtiofs（macOS 原生虚拟化框架自带，快且稳）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;networks: - vzNAT: true&lt;/code&gt;&lt;/strong&gt; — 让 Mac 能直接访问虚拟机（关键）&#10;不加这行时，虚拟机只有默认的 usernet 网卡（192.168.5.x），Mac &lt;strong&gt;访问不到&lt;/strong&gt;虚拟机 IP。&#10;加了 vzNAT 后，macOS 系统框架给虚拟机第二张网卡（lima0，192.168.64.x），&#10;&lt;strong&gt;Mac 浏览器可以直接访问&lt;/strong&gt;——后续在 Mac 上访问 NodePort/Ingress 就用这个 IP：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell k8s-rocky hostname -I &lt;span class="c1"&gt;# 取 192.168.64.x 那个&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;等价于 Lima 的 shared 网络，但 vzNAT 不需要安装 socket_vmnet、不需要 sudo，零配置。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;命令行参数与模板的关系&lt;/strong&gt;：&lt;code&gt;--cpus=4 --memory=6 --disk=30&lt;/code&gt; 是创建时的规格&#10;（模板里没写，也可以写进模板）；&lt;code&gt;--name=k8s-rocky&lt;/code&gt; 给虚拟机命名；&#10;&lt;code&gt;--tty=false&lt;/code&gt; 表示创建过程无需交互。这些只在&lt;strong&gt;创建时&lt;/strong&gt;有效，之后用&#10;&lt;code&gt;limactl stop&lt;/code&gt; / &lt;code&gt;start&lt;/code&gt; 开关机即可，参数已固化在 &lt;code&gt;~/.lima/k8s-rocky/&lt;/code&gt; 里。&lt;/p&gt;&#10;&lt;h3 id="附lima-日常管理命令速查都在-mac-上执行"&gt;&lt;a href="#%e9%99%84lima-%e6%97%a5%e5%b8%b8%e7%ae%a1%e7%90%86%e5%91%bd%e4%bb%a4%e9%80%9f%e6%9f%a5%e9%83%bd%e5%9c%a8-mac-%e4%b8%8a%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;附：Lima 日常管理命令速查（都在 Mac 上执行）&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl list&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看所有虚拟机及状态（Running/Stopped）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl shell k8s-rocky&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;进入虚拟机终端&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl shell k8s-rocky -- &amp;lt;命令&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不进入虚拟机，直接在 Mac 终端执行一条虚拟机里的命令&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl stop k8s-rocky&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;关机（虚拟机里所有配置和数据保留）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl start k8s-rocky&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开机（= 重启就是 stop 再 start）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl show-ssh k8s-rocky&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看 SSH 连接方式（可用标准 ssh 命令进虚拟机）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl delete k8s-rocky&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;删除（卸载）虚拟机，数据全丢、不可逆&lt;/strong&gt;，只影响 &lt;code&gt;~/.lima/k8s-rocky&lt;/code&gt;，不动 Mac 任何东西&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;推倒重建&lt;/strong&gt;（想从头再练一遍时）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-3"&gt;&lt;a class="lnlinks" href="#hl-8-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-8-4"&gt;&lt;a class="lnlinks" href="#hl-8-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl stop k8s-rocky&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl delete k8s-rocky&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 镜像已下载在 lima/images/，重建只需 2~3 分钟：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl start --name&lt;span class="o"&gt;=&lt;/span&gt;k8s-rocky --cpus&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; --memory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt; --disk&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; --tty&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; lima/rocky-9-ustc.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 记忆法：&lt;code&gt;limactl&lt;/code&gt; 开头的命令都在 &lt;strong&gt;Mac&lt;/strong&gt; 上执行（管理虚拟机）；&#10;本文第 2 步开始的命令都在&lt;strong&gt;虚拟机里&lt;/strong&gt;执行（折腾系统）。拿不准在哪，敲 &lt;code&gt;hostname&lt;/code&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="2-切换到-root软件源换国内镜像"&gt;&lt;a href="#2-%e5%88%87%e6%8d%a2%e5%88%b0-root%e8%bd%af%e4%bb%b6%e6%ba%90%e6%8d%a2%e5%9b%bd%e5%86%85%e9%95%9c%e5%83%8f" class="header-anchor"&gt;&lt;/a&gt;2. 切换到 root，软件源换国内镜像&#10;&lt;/h2&gt;&lt;p&gt;后续命令都以 root 执行（kubeadm 官方文档也是如此）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -i&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;网络预检&lt;/strong&gt;（30 秒钟，避免后面卡死。虚拟机出网状态会随 Mac 的网络环境变化——&#10;换网络、开关代理软件都可能改变它，所以&lt;strong&gt;环境有变化就先预检&lt;/strong&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-4"&gt;&lt;a class="lnlinks" href="#hl-10-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-5"&gt;&lt;a class="lnlinks" href="#hl-10-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-6"&gt;&lt;a class="lnlinks" href="#hl-10-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-7"&gt;&lt;a class="lnlinks" href="#hl-10-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-8"&gt;&lt;a class="lnlinks" href="#hl-10-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-9"&gt;&lt;a class="lnlinks" href="#hl-10-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-10"&gt;&lt;a class="lnlinks" href="#hl-10-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-11"&gt;&lt;a class="lnlinks" href="#hl-10-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-12"&gt;&lt;a class="lnlinks" href="#hl-10-12"&gt;12&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-13"&gt;&lt;a class="lnlinks" href="#hl-10-13"&gt;13&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-14"&gt;&lt;a class="lnlinks" href="#hl-10-14"&gt;14&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-15"&gt;&lt;a class="lnlinks" href="#hl-10-15"&gt;15&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-16"&gt;&lt;a class="lnlinks" href="#hl-10-16"&gt;16&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-17"&gt;&lt;a class="lnlinks" href="#hl-10-17"&gt;17&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-18"&gt;&lt;a class="lnlinks" href="#hl-10-18"&gt;18&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-19"&gt;&lt;a class="lnlinks" href="#hl-10-19"&gt;19&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-10-20"&gt;&lt;a class="lnlinks" href="#hl-10-20"&gt;20&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ① 先清理可能残留的代理配置——代理软件关着、配置却还指向它，&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 会造成&amp;#34;假性网络故障&amp;#34;，先排除这个干扰项：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep proxy /etc/dnf/dnf.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 有输出（proxy=http://...）则删掉：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/^proxy=/d&amp;#39;&lt;/span&gt; /etc/dnf/dnf.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env &lt;span class="p"&gt;|&lt;/span&gt; grep -i proxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 有输出（http_proxy=... 等）则清掉：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;unset&lt;/span&gt; http_proxy https_proxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ② 确认 Mac 上的代理软件状态（在 Mac 终端执行，空输出=没在运行）：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep -iE &lt;span class="s1"&gt;&amp;#39;clash|verge|mihomo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ③ 直连测试（虚拟机里执行。不用 -s：成功显示响应头，失败显示明确报错）：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -I -m &lt;span class="m"&gt;8&lt;/span&gt; https://mirrors.ustc.edu.cn/rocky/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 看到 HTTP/2 200 等响应头 → 直连正常，继续往下&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 看到 curl: (28) 超时等报错 → 直连出网被拦（常见于 Mac 装有企业安全软件），&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 打开 Mac 上的 Clash（需开启&amp;#34;允许局域网连接&amp;#34;），&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 然后去「附录 A.3」配好代理再回来&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 想看更详细过程时用 curl -v -m 10 &amp;lt;URL&amp;gt;，能看清卡在 DNS / TCP / TLS 哪一步&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Rocky 官方源国内很慢，换成中科大镜像（真实服务器如果网络好可跳过）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第一步永远是&amp;quot;先看清楚&amp;quot;&lt;/strong&gt;（改配置的黄金法则：&lt;strong&gt;先看 → 再改 → 后验证&lt;/strong&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-11-2"&gt;&lt;a class="lnlinks" href="#hl-11-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 动手前先确认目标文件的真实格式，顺便验证待会儿 sed 的模式能不能匹配上：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -nE &lt;span class="s1"&gt;&amp;#39;^(metalink|mirrorlist|#?baseurl)&amp;#39;&lt;/span&gt; /etc/yum.repos.d/rocky.repo &lt;span class="p"&gt;|&lt;/span&gt; head -6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;预期输出（Rocky 9.8 的出厂状态，实测）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-3"&gt;&lt;a class="lnlinks" href="#hl-12-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-4"&gt;&lt;a class="lnlinks" href="#hl-12-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-5"&gt;&lt;a class="lnlinks" href="#hl-12-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-12-6"&gt;&lt;a class="lnlinks" href="#hl-12-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;13:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&amp;amp;repo=BaseOS-$releasever$rltype&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;14:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;23:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&amp;amp;repo=BaseOS-$releasever-debug$rltype&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;24:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/debug/tree/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;32:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=source&amp;amp;repo=BaseOS-$releasever-source$rltype&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;33:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/source/tree/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;读法：&lt;code&gt;mirrorlist=&lt;/code&gt; 行（未注释）= 启用的官方动态源（国内慢，就是要换掉的对象）；&#10;&lt;code&gt;#baseurl=&lt;/code&gt; 行（带 &lt;code&gt;#&lt;/code&gt;）= 注释掉的备用地址（等下要启用并指向中科大）。&#10;每个仓库段（BaseOS / debug / source / AppStream……）都是同样两行成对出现。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 老版本 Rocky 显示的是 &lt;code&gt;metalink=&lt;/code&gt; + &lt;code&gt;#baseurl=https://...&lt;/code&gt;，格式不同。&#10;这正是换源 sed 要兼容两种格式的原因；如果将来版本又变了，以这一步看到的实际格式为准。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;确认格式后执行换源（兼容新老两种格式的写法）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -e &lt;span class="s1"&gt;&amp;#39;s|^metalink=|#metalink=|g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s|^mirrorlist=|#mirrorlist=|g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s|^#baseurl=https\?://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g&amp;#39;&lt;/span&gt; -i.bak /etc/yum.repos.d/rocky*.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 三个坑都要防：&#10;① sed 匹配不到时&lt;strong&gt;静默成功、不报错&lt;/strong&gt;，必须验证（很多人栽在这里）；&#10;② &lt;code&gt;-i.bak&lt;/code&gt; 每次执行都会&lt;strong&gt;重新备份当前文件&lt;/strong&gt;，重复执行会把&amp;quot;原始备份&amp;quot;覆盖成&amp;quot;改后的文件&amp;quot;。&#10;想稳妥留底，动手前先手动存一份：&lt;code&gt;cp /etc/yum.repos.d/rocky.repo{,.orig}&lt;/code&gt;（还原：&lt;code&gt;cp&lt;/code&gt; 反向拷贝）；&#10;③ 多行命令（带 &lt;code&gt;\&lt;/code&gt; 续行）粘贴到终端容易断行，报 &lt;code&gt;command not found&lt;/code&gt; / &lt;code&gt;sed: can't read&lt;/code&gt; 时，&#10;把命令拼成单行重贴（本文给的换源 sed 就是单行版，可直接复制）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;验证&lt;/strong&gt;（必须两项都过）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-3"&gt;&lt;a class="lnlinks" href="#hl-14-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-4"&gt;&lt;a class="lnlinks" href="#hl-14-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-5"&gt;&lt;a class="lnlinks" href="#hl-14-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-6"&gt;&lt;a class="lnlinks" href="#hl-14-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-14-7"&gt;&lt;a class="lnlinks" href="#hl-14-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -E &lt;span class="s1"&gt;&amp;#39;^baseurl&amp;#39;&lt;/span&gt; /etc/yum.repos.d/rocky.repo &lt;span class="p"&gt;|&lt;/span&gt; head -3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 必须看到输出：baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/BaseOS/$basearch/os/ 等&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -cE &lt;span class="s1"&gt;&amp;#39;^(metalink|mirrorlist)&amp;#39;&lt;/span&gt; /etc/yum.repos.d/rocky.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 必须是 0（动态源全部被注释）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 &lt;strong&gt;不换源也能跑？&lt;/strong&gt; mirrorlist 会按你的 IP 动态分配镜像，运气好分到国内 CDN 也快——&#10;但那是赌手气，不可复现。换中科大 baseurl 的意义是&lt;strong&gt;任何时间、任何网络环境都快且稳定&lt;/strong&gt;，&#10;后面装 containerd、kubeadm、拉镜像全是大流量下载，把不确定性压到最低。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="3-关闭-swap必须"&gt;&lt;a href="#3-%e5%85%b3%e9%97%ad-swap%e5%bf%85%e9%a1%bb" class="header-anchor"&gt;&lt;/a&gt;3. 关闭 swap（必须）&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;为什么必须&lt;/strong&gt;：k8s 调度器按&amp;quot;容器申请多少内存&amp;quot;做调度决策。开着 swap 时，&#10;内存不够系统会偷偷把内存页换到磁盘，kubelet 看到的内存使用量就失真了，&#10;调度决策变得不可预测——所以 kubelet 检测到 swap 开启会&lt;strong&gt;拒绝启动&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-3"&gt;&lt;a class="lnlinks" href="#hl-15-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-4"&gt;&lt;a class="lnlinks" href="#hl-15-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-15-5"&gt;&lt;a class="lnlinks" href="#hl-15-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapoff -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 永久关闭：注释掉 /etc/fstab 中含 swap 的行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/swap/s/^/#/&amp;#39;&lt;/span&gt; /etc/fstab&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证：应输出空行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapon --show&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 Rocky 云镜像（GenericCloud）默认就没有 swap（&lt;code&gt;/etc/fstab&lt;/code&gt; 里无 swap 条目、&lt;code&gt;free -h&lt;/code&gt; 的 Swap 全 0），&#10;这两条命令对它是无害的空操作，但必须执行——真实服务器默认有 swap，习惯要养成。&#10;（k8s 1.28+ 有实验性 swap 支持，学习阶段不启用。）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="4-配置防火墙与-selinux学习环境简化处理"&gt;&lt;a href="#4-%e9%85%8d%e7%bd%ae%e9%98%b2%e7%81%ab%e5%a2%99%e4%b8%8e-selinux%e5%ad%a6%e4%b9%a0%e7%8e%af%e5%a2%83%e7%ae%80%e5%8c%96%e5%a4%84%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;4. 配置防火墙与 SELinux（学习环境简化处理）&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-2"&gt;&lt;a class="lnlinks" href="#hl-16-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-3"&gt;&lt;a class="lnlinks" href="#hl-16-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-4"&gt;&lt;a class="lnlinks" href="#hl-16-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-5"&gt;&lt;a class="lnlinks" href="#hl-16-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-6"&gt;&lt;a class="lnlinks" href="#hl-16-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-7"&gt;&lt;a class="lnlinks" href="#hl-16-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-8"&gt;&lt;a class="lnlinks" href="#hl-16-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-9"&gt;&lt;a class="lnlinks" href="#hl-16-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-10"&gt;&lt;a class="lnlinks" href="#hl-16-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-16-11"&gt;&lt;a class="lnlinks" href="#hl-16-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 学习环境：直接关闭防火墙，避免端口问题干扰学习&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#（Rocky 云镜像默认未安装 firewalld，报 &amp;#34;Unit could not be found&amp;#34; 属正常，跳过即可）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl stop firewalld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable firewalld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# SELinux 设为宽容模式（容器运行时需要，云镜像默认 Enforcing，必须改）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;setenforce &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;s/^SELINUX=enforcing/SELINUX=permissive/&amp;#39;&lt;/span&gt; /etc/selinux/config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证：应输出 Permissive&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;getenforce&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SELinux 是什么&lt;/strong&gt;：Linux 普通权限（rwx、属主）管的是&amp;quot;用户能不能访问文件&amp;quot;，&#10;SELinux 更进一步，在内核里给&lt;strong&gt;每个进程&lt;/strong&gt;也戴上镣铐——即使是 root 进程，&#10;也只能碰安全策略允许的东西（Rocky/RHEL 系默认开启的强制访问控制）。三种模式：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;行为&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类比&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Enforcing（强制）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;违规操作&lt;strong&gt;直接拒绝&lt;/strong&gt;并记日志&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;保安：当场拦下&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Permissive（宽容）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;违规操作&lt;strong&gt;放行&lt;/strong&gt;，只记日志&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;摄像头：不拦，全拍下&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Disabled（关闭）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;完全不工作&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;纪委下班&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;学习环境用 Permissive：containerd/k8s 的某些文件操作会被默认策略误拦，&#10;Enforcing 会导致 Pod 莫名其妙起不来；Permissive 不挡路又保留日志，&#10;事后可用 &lt;code&gt;ausearch -m avc -ts recent&lt;/code&gt; 翻看&amp;quot;如果开着会拦什么&amp;quot;。&#10;两条命令的分工：&lt;code&gt;setenforce 0&lt;/code&gt; 管&amp;quot;现在&amp;quot;（重启失效），&lt;code&gt;/etc/selinux/config&lt;/code&gt; 管&amp;quot;重启后&amp;quot;。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 生产环境不要直接关防火墙，应放行 k8s 所需端口&#10;（6443、2379-2380、10250、10259、10257 及 NodePort 30000-32767）。&#10;等学到阶段 9（NetworkPolicy）时你会理解得更深。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="常见问题"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;常见问题&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q: 换源 sed 执行后 &lt;code&gt;dnf update&lt;/code&gt; 依然卡住？&lt;/strong&gt;&#10;先跑验证命令 &lt;code&gt;grep -E '^baseurl' /etc/yum.repos.d/rocky.repo | head -3&lt;/code&gt;。输出为空说明 sed 没匹配到&#10;（Rocky 9.8 是 &lt;code&gt;mirrorlist&lt;/code&gt;+&lt;code&gt;http://&lt;/code&gt;，老版本是 &lt;code&gt;metalink&lt;/code&gt;+&lt;code&gt;https://&lt;/code&gt;，本文第 2 步已兼容两种格式）。&#10;输出正常但 dnf 仍卡 0 字节 → 虚拟机直连出网被拦，看「附录 A」。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Q: &lt;code&gt;limactl start&lt;/code&gt; 报 403 / 下载镜像很慢？&lt;/strong&gt;&#10;Rocky 官方源（dl.rockylinux.org）国内约 50KB/s；中科大镜像站的 WAF 会拦截 Lima 的多线程下载器。&#10;按第 1 步的方法：curl 单线程手动下载 + 模板指向本地文件即可，约 1~2 分钟。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Q: 重启虚拟机后这些配置还在吗？&lt;/strong&gt;&#10;都在。本阶段的配置全部写入了系统文件，永久生效。&#10;（&lt;code&gt;limactl stop&lt;/code&gt; / &lt;code&gt;limactl start&lt;/code&gt; 就是关机/开机。）&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="附录-a网络分层排查实录虚拟机无法出网时必读"&gt;&lt;a href="#%e9%99%84%e5%bd%95-a%e7%bd%91%e7%bb%9c%e5%88%86%e5%b1%82%e6%8e%92%e6%9f%a5%e5%ae%9e%e5%bd%95%e8%99%9a%e6%8b%9f%e6%9c%ba%e6%97%a0%e6%b3%95%e5%87%ba%e7%bd%91%e6%97%b6%e5%bf%85%e8%af%bb" class="header-anchor"&gt;&lt;/a&gt;附录 A：网络分层排查实录（虚拟机无法出网时必读）&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本节是一次真实排查的完整记录：在一台装有&lt;strong&gt;企业安全软件（深信服/微步）+ Clash 代理&lt;/strong&gt;的 Mac 上，&#10;虚拟机所有直连外网流量被拦截，最终通过&amp;quot;借 Mac 的代理出网&amp;quot;解决。排查方法通用。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="a1-分层排查法自底向上逐层缩小范围"&gt;&lt;a href="#a1-%e5%88%86%e5%b1%82%e6%8e%92%e6%9f%a5%e6%b3%95%e8%87%aa%e5%ba%95%e5%90%91%e4%b8%8a%e9%80%90%e5%b1%82%e7%bc%a9%e5%b0%8f%e8%8c%83%e5%9b%b4" class="header-anchor"&gt;&lt;/a&gt;A.1 分层排查法（自底向上，逐层缩小范围）&#10;&lt;/h3&gt;&lt;p&gt;每层一条命令，在哪一层断，问题就在哪一层：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-17-1"&gt;&lt;a class="lnlinks" href="#hl-17-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-17-2"&gt;&lt;a class="lnlinks" href="#hl-17-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-17-3"&gt;&lt;a class="lnlinks" href="#hl-17-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-17-4"&gt;&lt;a class="lnlinks" href="#hl-17-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-17-5"&gt;&lt;a class="lnlinks" href="#hl-17-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-17-6"&gt;&lt;a class="lnlinks" href="#hl-17-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第1层 VM → 网关（Mac） ping -c 2 -W 3 192.168.5.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第2层 DNS 解析 getent hosts mirrors.ustc.edu.cn&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第3层 VM → 外网纯 IP ping -c 2 -W 3 223.5.5.5 # 阿里DNS，绕过域名&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第4层 VM → 外网 TCP curl -k --connect-timeout 6 https://110.242.68.66/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第5层 Mac → 外网 curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/ # Mac 终端执行&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第6层 VM 借 Mac 代理出网 curl -x http://192.168.5.2:7897 https://mirrors.ustc.edu.cn/rocky/ -sI&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实测结果与推论&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;层&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结果&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;推论&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM→网关&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 通&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;虚拟网卡正常&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DNS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 能解析&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DNS 由 Lima 网关在 Mac 侧代答，不依赖 VM 真实出网&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM→外网 IP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌ 100% 丢包&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;与域名无关，IP 层就断了&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM→外网 TCP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌ 000 超时&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同上&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac→外网&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 200&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac 网络本身没问题&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM 经 Mac 代理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 200&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM↔Mac 畅通，代理可作绕行方案&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;结论画像&lt;/strong&gt;：Mac 正常、VM 到 Mac 正常、VM 出网（任意目标）全断 → 问题在 Mac 系统网络层对&amp;quot;虚拟机转发流量&amp;quot;的拦截。&lt;/p&gt;&#10;&lt;p&gt;补充命令——虚拟机有两块网卡两条默认路由，可分别强制指定出口测试：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-18-1"&gt;&lt;a class="lnlinks" href="#hl-18-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-18-2"&gt;&lt;a class="lnlinks" href="#hl-18-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-18-3"&gt;&lt;a class="lnlinks" href="#hl-18-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-18-4"&gt;&lt;a class="lnlinks" href="#hl-18-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-18-5"&gt;&lt;a class="lnlinks" href="#hl-18-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip route &lt;span class="c1"&gt;# default via 192.168.64.1 (lima0, vzNAT, metric 100 优先)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# default via 192.168.5.2 (eth0, usernet, metric 200)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --interface eth0 ... &lt;span class="c1"&gt;# 强制走 usernet 出口&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --interface lima0 ... &lt;span class="c1"&gt;# 强制走 vzNAT 出口&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两个都 000 → 不是单条链路问题，是系统级拦截&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="a2-定位真凶企业安全软件的网络扩展"&gt;&lt;a href="#a2-%e5%ae%9a%e4%bd%8d%e7%9c%9f%e5%87%b6%e4%bc%81%e4%b8%9a%e5%ae%89%e5%85%a8%e8%bd%af%e4%bb%b6%e7%9a%84%e7%bd%91%e7%bb%9c%e6%89%a9%e5%b1%95" class="header-anchor"&gt;&lt;/a&gt;A.2 定位真凶：企业安全软件的网络扩展&#10;&lt;/h3&gt;&lt;p&gt;先排除代理软件干扰（彻底退出 Clash Verge 并 &lt;code&gt;limactl stop &amp;amp;&amp;amp; limactl start&lt;/code&gt; 重启虚拟机，无效），再查系统扩展：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-19-1"&gt;&lt;a class="lnlinks" href="#hl-19-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-19-2"&gt;&lt;a class="lnlinks" href="#hl-19-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-19-3"&gt;&lt;a class="lnlinks" href="#hl-19-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-19-4"&gt;&lt;a class="lnlinks" href="#hl-19-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-19-5"&gt;&lt;a class="lnlinks" href="#hl-19-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-19-6"&gt;&lt;a class="lnlinks" href="#hl-19-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mac 终端执行：列出所有系统扩展&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemextensionsctl list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 实测发现两个 activated+enabled 的企业安全组件：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# cn.threatbook.Cardinal.net-extension ← 微步在线（上网行为/威胁情报）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# com.sangfor.auem.sfservice.extension ← 深信服（终端安全/零信任）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这类安防客户端在 macOS 网络层挂&lt;strong&gt;内容过滤器&lt;/strong&gt;：本机进程的流量识别放行，&lt;strong&gt;虚拟机 NAT 转发的流量&#10;不是&amp;quot;本机认证进程&amp;quot;发出，全部丢弃&lt;/strong&gt;——完美对上 A.1 的现象画像。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 这类软件不要卸载或停用（公司管理制度，可能触发告警）。正确姿势是绕行。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;其他辅助排查命令（排除干扰项时用，均在 Mac 执行）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-20-1"&gt;&lt;a class="lnlinks" href="#hl-20-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-20-2"&gt;&lt;a class="lnlinks" href="#hl-20-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-20-3"&gt;&lt;a class="lnlinks" href="#hl-20-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-20-4"&gt;&lt;a class="lnlinks" href="#hl-20-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep -iE &lt;span class="s1"&gt;&amp;#39;clash|verge|mihomo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep &lt;span class="c1"&gt;# 确认代理软件进程是否退干净&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;networksetup -getwebproxy Wi-Fi &lt;span class="c1"&gt;# 看系统代理开关状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netstat -rn -f inet &lt;span class="p"&gt;|&lt;/span&gt; head -8 &lt;span class="c1"&gt;# 看默认路由是否被 VPN/TUN 劫持&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate &lt;span class="c1"&gt;# macOS 应用防火墙状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="a3-解决方案虚拟机借-mac-的代理出网"&gt;&lt;a href="#a3-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e8%99%9a%e6%8b%9f%e6%9c%ba%e5%80%9f-mac-%e7%9a%84%e4%bb%a3%e7%90%86%e5%87%ba%e7%bd%91" class="header-anchor"&gt;&lt;/a&gt;A.3 解决方案：虚拟机借 Mac 的代理出网&#10;&lt;/h3&gt;&lt;p&gt;前提：Clash Verge 运行中，且开启&amp;quot;允许局域网连接&amp;quot;（Allow LAN）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-21-1"&gt;&lt;a class="lnlinks" href="#hl-21-1"&gt; 1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-2"&gt;&lt;a class="lnlinks" href="#hl-21-2"&gt; 2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-3"&gt;&lt;a class="lnlinks" href="#hl-21-3"&gt; 3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-4"&gt;&lt;a class="lnlinks" href="#hl-21-4"&gt; 4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-5"&gt;&lt;a class="lnlinks" href="#hl-21-5"&gt; 5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-6"&gt;&lt;a class="lnlinks" href="#hl-21-6"&gt; 6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-7"&gt;&lt;a class="lnlinks" href="#hl-21-7"&gt; 7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-8"&gt;&lt;a class="lnlinks" href="#hl-21-8"&gt; 8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-9"&gt;&lt;a class="lnlinks" href="#hl-21-9"&gt; 9&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-10"&gt;&lt;a class="lnlinks" href="#hl-21-10"&gt;10&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-21-11"&gt;&lt;a class="lnlinks" href="#hl-21-11"&gt;11&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 虚拟机里，root 执行：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dnf 走代理（dnf 不读环境变量，必须写配置；永久生效）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;proxy=http://192.168.5.2:7897&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/dnf/dnf.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# curl 等命令行工具走代理（仅当前终端有效）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://192.168.5.2:7897&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://192.168.5.2:7897&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证 → 显示响应头即通&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -I -m &lt;span class="m"&gt;8&lt;/span&gt; https://mirrors.ustc.edu.cn/rocky/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;containerd 的代理配置是 systemd drop-in（它是不读环境变量的系统服务），&#10;见 &lt;a href="https://saflyer.cn/posts/k8s-00b-kernel-containerd/"&gt;阶段 0（下）&lt;/a&gt; 第 6 步。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ &lt;strong&gt;代理方案的善后&lt;/strong&gt;（重要）：哪天直连恢复了、或者你把 Clash 关了，这些代理配置会让&#10;dnf/curl/containerd 全部连不上（指向一个不存在的代理）。恢复直连前必须清理：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-22-1"&gt;&lt;a class="lnlinks" href="#hl-22-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-22-2"&gt;&lt;a class="lnlinks" href="#hl-22-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-22-3"&gt;&lt;a class="lnlinks" href="#hl-22-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-22-4"&gt;&lt;a class="lnlinks" href="#hl-22-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-22-5"&gt;&lt;a class="lnlinks" href="#hl-22-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/^proxy=/d&amp;#39;&lt;/span&gt; /etc/dnf/dnf.conf &lt;span class="c1"&gt;# 删 dnf 代理配置&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;unset&lt;/span&gt; http_proxy https_proxy &lt;span class="c1"&gt;# 清当前终端的代理变量&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果配过 containerd 代理，也要一并删掉：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f /etc/systemd/system/containerd.service.d/proxy.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl restart containerd&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;一句话：&lt;strong&gt;代理配置和代理软件必须同开同关&lt;/strong&gt;。这正是第 2 步「网络预检」第 ① 小步存在的原因。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;为什么 &lt;code&gt;192.168.5.2&lt;/code&gt; 可以写死在配置里&lt;/strong&gt;：它是 Lima 源码内置的 usernet 网关常量（不经过任何&#10;配置文件），语义是&amp;quot;Mac 本机&amp;quot;。虚拟机重启、Mac 重启、换 Wi-Fi、去公司都不会变。同理稳定：&#10;虚拟机 eth0 的 &lt;code&gt;192.168.5.15&lt;/code&gt;（按虚拟机 MAC 固定分配）、lima0 的 &lt;code&gt;192.168.64.2&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="a4-lima-网络拓扑速查"&gt;&lt;a href="#a4-lima-%e7%bd%91%e7%bb%9c%e6%8b%93%e6%89%91%e9%80%9f%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;A.4 Lima 网络拓扑速查&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-23-1"&gt;&lt;a class="lnlinks" href="#hl-23-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-2"&gt;&lt;a class="lnlinks" href="#hl-23-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-3"&gt;&lt;a class="lnlinks" href="#hl-23-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-4"&gt;&lt;a class="lnlinks" href="#hl-23-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-5"&gt;&lt;a class="lnlinks" href="#hl-23-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-6"&gt;&lt;a class="lnlinks" href="#hl-23-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-7"&gt;&lt;a class="lnlinks" href="#hl-23-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-23-8"&gt;&lt;a class="lnlinks" href="#hl-23-8"&gt;8&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─ 物理网（家里/公司 Wi-Fi，Mac 的 en0）—— 这层会随地点变&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─ Lima usernet（192.168.5.0/24，Lima 内置默认，无需配置）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 虚拟机 eth0 = 192.168.5.15，网关/DNS = 192.168.5.2（= Mac）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─ macOS vzNAT（192.168.64.0/24，模板里 vzNAT: true 开启）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 虚拟机 lima0 = 192.168.64.2，网关 = 192.168.64.1（= Mac）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← Mac 浏览器访问 NodePort/Ingress 用这个 IP&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-24-1"&gt;&lt;a class="lnlinks" href="#hl-24-1"&gt;1&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-2"&gt;&lt;a class="lnlinks" href="#hl-24-2"&gt;2&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-3"&gt;&lt;a class="lnlinks" href="#hl-24-3"&gt;3&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-4"&gt;&lt;a class="lnlinks" href="#hl-24-4"&gt;4&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-5"&gt;&lt;a class="lnlinks" href="#hl-24-5"&gt;5&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-6"&gt;&lt;a class="lnlinks" href="#hl-24-6"&gt;6&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-7"&gt;&lt;a class="lnlinks" href="#hl-24-7"&gt;7&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-8"&gt;&lt;a class="lnlinks" href="#hl-24-8"&gt;8&lt;/a&gt;&#10;&lt;/span&gt;&lt;span class="lnt" id="hl-24-9"&gt;&lt;a class="lnlinks" href="#hl-24-9"&gt;9&lt;/a&gt;&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 区分&amp;#34;我在 Mac 还是虚拟机里&amp;#34;：看提示符或问 hostname&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# wyf@MacBook-Pro % → Mac（zsh，%）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [wyf@lima-k8s-rocky ~]$ → 虚拟机普通用户&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [root@lima-k8s-rocky ~]# → 虚拟机 root&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hostname &lt;span class="c1"&gt;# lima-k8s-rocky = 虚拟机&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mac 上 Lima 的可选网络定义（shared/bridged/host，本教程未使用）：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.lima/_config/networks.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注意：里面没有 192.168.5.x —— usernet 网段是编译进 Lima 源码的出厂默认值&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;目录挂载的实物证据：模板里 &lt;code&gt;mounts: - location: &amp;quot;~&amp;quot;&lt;/code&gt; 开机后变成虚拟机 &lt;code&gt;/etc/fstab&lt;/code&gt; 里的一行&#10;&lt;code&gt;lima-... /Users/wyf virtiofs ro,nofail,...&lt;/code&gt;（virtiofs 共享文件系统，ro 只读），&#10;这就是虚拟机里能直接看到 Mac 主目录的原因。&lt;/p&gt;&#10;&lt;h3 id="a5-排查命令总表"&gt;&lt;a href="#a5-%e6%8e%92%e6%9f%a5%e5%91%bd%e4%bb%a4%e6%80%bb%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;A.5 排查命令总表&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;执行位置&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ip route&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;看默认路由/网卡/优先级&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;hostname -I&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;看虚拟机所有 IP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ping -c 2 -W 3 &amp;lt;IP&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测某层连通性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;getent hosts &amp;lt;域名&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测 DNS 解析&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;curl -I -m 8 &amp;lt;URL&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测 HTTP 通不通&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM/Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;curl --interface eth0 &amp;lt;URL&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;强制指定网卡出口&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;curl -x http://192.168.5.2:7897 &amp;lt;URL&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;经 Mac 代理测试&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;systemextensionsctl list&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查系统网络/安全扩展&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;networksetup -getwebproxy Wi-Fi&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查系统代理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;netstat -rn -f inet&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查 Mac 路由表是否被劫持&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ps aux | grep -iE 'clash|verge'&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;确认代理进程状态&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;limactl list&lt;/code&gt; / &lt;code&gt;limactl shell &amp;lt;名字&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看/进入虚拟机&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cat ~/.lima/_config/networks.yaml&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;看 Lima 可选网络定义&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="动手练习"&gt;&lt;a href="#%e5%8a%a8%e6%89%8b%e7%bb%83%e4%b9%a0" class="header-anchor"&gt;&lt;/a&gt;动手练习&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;用 &lt;code&gt;limactl shell k8s-rocky&lt;/code&gt; 以外的另一种方式进入 VM（提示：Lima 自动配置了 SSH，&lt;code&gt;ssh&lt;/code&gt; 加端口和密钥，用 &lt;code&gt;limactl show-ssh k8s-rocky&lt;/code&gt; 查看）。&lt;/li&gt;&#10;&lt;li&gt;用附录 A 的分层排查法，在虚拟机里依次执行第 1/2/5 层的命令，确认每层的输出你都看得懂。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="下一步"&gt;&lt;a href="#%e4%b8%8b%e4%b8%80%e6%ad%a5" class="header-anchor"&gt;&lt;/a&gt;下一步&#10;&lt;/h2&gt;&lt;p&gt;➡️ &lt;a href="https://saflyer.cn/posts/k8s-00b-kernel-containerd/"&gt;阶段 0（下）：内核参数与容器运行时&lt;/a&gt;&lt;/p&gt;&#10;</description></item></channel></rss>