还在按 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 nginxnerdctl 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

那现在怎么装

半年以上没摸过这套的,按这个走:

  1. 装 containerd,不装 docker。yum install containerd.io -y 一行解决。
  2. 配 CRI 插件开 + systemd cgroup。改 /etc/containerd/config.toml,再 systemctl restart containerd
  3. 配镜像加速。分两类仓库,走两条不同的路
    • 控制面镜像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/,镜像名变、拉取路径不变。
  4. kubeadm init + kubeadm join,CNI 用 Calico v3.30(镜像 docker.io/calico/... 走上面这条加速通道,不是直接用阿里云的镜像)。

nerdctlcrictl 两个都装上。前者管日常拉镜像(命令兼容 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 考纲里新加的,金融级同城双活演练这一步最容易翻车。

posted @ 2026-09-16 21:18  运维清哥  阅读(11)  评论(1)    收藏  举报