<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Containerd on WYF 的技术博客</title><link>https://saflyer.cn/tags/containerd/</link><description>Recent content in Containerd 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/tags/containerd/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>