还在按 Docker 教程装 K8S?你那教程大概过期 4 年了
还在按 Docker 教程装 K8S?你那教程大概过期 4 年了
Kubernetes 1.24 在 2022 年 5 月把 dockershim 删了。
写这篇的时候是 2026 年 9 月底。
中间隔了 4 年零 4 个月。
卡住的不是你
这两天有个学员甩我一张报错:
error executing kubelet: failed to create cgroup ...
Container runtime status: containerd not running
我让他贴一下 kubeadm init 之前的准备步骤——他就是按某度第一篇教程跑的:
yum install docker -y
systemctl enable --now docker
这条命令在 K8S 1.23 之前是通的。1.24 之后,kubelet 不再认 docker socket,kubeadm init 走到 CRI 校验那一步直接过不去。
是教程过期了。
为什么过期——一条 6 年时间线
K8S 处理容器运行时这件事不是突然变脸的,是从 1.16 开始一点点推,1.24 推到头。这事至少经历了 6 年:
2016
└─ Docker 是 K8S 唯一容器运行时(dockershim 内置在 kubelet)
2018
└─ containerd 1.1 从 Docker 拆出来,独立成 CNCF 项目
2019
└─ K8S 1.16 提出 CRI 规范
2020
└─ K8S 1.20 宣布 dockershim deprecate(还能用但开始警告)
2022.05 ★ K8S 1.24 把 dockershim 删了——这一天是个分水岭
2024
└─ containerd 2.x 落地,sandbox_image 跟 sandbox 解耦
2026
└─ Rocky Linux 10.2 / Ubuntu 22.04 LTS / CentOS Stream 9
默认全是 containerd
2022 年 5 月到今天,4 年零 4 个月。这段时间里大部分中文 K8S 教程没改过。
老教程卡在哪几步
把两套做法并排放:
| 步骤 | 老教程(Docker) | 新做法(containerd) |
|---|---|---|
| 装运行时 | yum install docker -y |
yum install containerd.io -y |
| 启服务 | systemctl enable --now docker |
systemctl enable --now containerd |
| cgroup 驱动 | 改 /etc/docker/daemon.json |
containerd 里设 SystemdCgroup = true |
| 拉镜像 | docker pull nginx |
crictl pull nginx 或 nerdctl pull nginx |
| 进容器 | docker exec -it xxx bash |
crictl exec -it xxx bash |
表格底下补几个工程细节:
- containerd 默认 socket:
/run/containerd/containerd.sock,不是 docker.sock - K8S 1.22 之后强制 systemd cgroup,cgroupfs 不能再用
nerdctl是 containerd 出品的 Docker 命令兼容工具,老习惯不用改crictl是 CRI 标准工具,排查节点用它
我自己装过,加上被学员问过,三步报错最多
不是凭感觉。是跑过、被问过,攒下来的。
1. 还在 docker pull,敲出来 command not found
老教程这一步几乎人手一份,抄过来就直接敲。改两个:
crictl pull registry.k8s.io/pause:3.9
或
nerdctl pull nginx
crictl 是 CRI 标准,所有 K8S 节点都能用;nerdctl 命令兼容 Docker,老习惯直接平移过来。
2. containerd active,kubelet 还是连不上 socket
systemctl status containerd 显示 active。但 kubelet 启动报连不上 CRI socket。
多半是 containerd 的 CRI 插件没开。/etc/containerd/config.toml 里这一段默认是开的,但有些精简镜像(尤其 K8s 工具镜像)会把它关掉:
[plugins."io.containerd.grpc.v1.cri"]
disable_apparmor = true
disable_cgroup = false
disable_hugetlb_controller = true
disable_proc_mount = true
restrict_oom_score_adj = true
配完一定 systemctl restart containerd。改配置不重启这条铁律——每次开课我都强调一次,答疑里这条被问最多。
3. cgroup 驱动不一致,kubelet 反复重启
kubelet 日志里反反复复就是这条:
failed to create cgroup ... driver "cgroupfs" not supported
K8S 1.22 之后默认走 systemd。要点是让 containerd 端和 kubelet 端都对齐:
containerd 端:
[plugins."io.containerd.grpc.v1.cri"]
SystemdCgroup = true
kubelet 端(默认值就是 systemd,但显式写出来不亏):
--cgroup-driver=systemd
那现在怎么装
半年以上没摸过这套的,按这个走:
- 装 containerd,不装 docker。
yum install containerd.io -y一行解决。 - 配 CRI 插件开 + systemd cgroup。改
/etc/containerd/config.toml,再systemctl restart containerd。 - 配镜像加速。分两类仓库,走两条不同的路:
- 控制面镜像(
registry.k8s.io系,如 pause、控制组件):kubeadm init顺手加--image-repository=registry.aliyuncs.com/google_containers,把镜像名直接换成阿里云同名仓库(pause、kube-apiserver 这些,地址变成registry.aliyuncs.com/google_containers/pause之类)。 - docker.io 业务镜像(Calico、nginx 等):给 containerd 配 docker.io 加速通道,常用
docker.m.daocloud.io,一条 sed 把 yaml 里的docker.io/calico/替换成docker.m.daocloud.io/calico/,镜像名变、拉取路径不变。
- 控制面镜像(
kubeadm init+kubeadm join,CNI 用 Calico v3.30(镜像docker.io/calico/...走上面这条加速通道,不是直接用阿里云的镜像)。
nerdctl 和 crictl 两个都装上。前者管日常拉镜像(命令兼容 docker),后者管排查节点问题(CRI 标准)。
写在最后
4 年前那本《Kubernetes 权威指南》是好书。今天重新翻,里面的 docker 命令照着敲还是会卡住。
K8S 自己也在升级——1.24 删 dockershim、1.22 推 systemd cgroup、1.36 加 --cloud-provider=external 参数,每一版都把上一版的"常识"翻新一遍。
我自己在 51CTO 录了一套《Kubernetes v1.36 安装实战》课(对标 CKA 1.36),从 containerd 装起到 kubeadm init 完,所有命令都在本地集群实测过两遍。
之前在 Docker 教程上卡过的,可以来看看。
关注清哥,下期把 K8S 1.36 新增的 --cloud-provider=external 这块讲透。这是 CKA 1.36 考纲里新加的,金融级同城双活演练这一步最容易翻车。

浙公网安备 33010602011771号