Ubuntu 上 Kubernetes 与 Docker 的兼容性要点
在 Ubuntu 上,Kubernetes 自 v1.24 起移除了内置的 dockershim,Kubelet 不再直接对接 Docker 引擎;因此“直接用 Docker 作为运行时”的做法仅能在 v1.23 及更早版本使用。若要在新版本继续使用 Docker,需通过 cri-dockerd 提供 CRI 适配层;更推荐的方式是改用 Containerd 作为运行时(原生 CRI,资源占用更低、维护更简单)。
版本兼容矩阵与运行时选择
| Kubernetes 版本 |
推荐/可用运行时 |
说明 |
| ≤ v1.23.x |
Docker 19.03–20.10.x |
可直接使用 Docker(内置 dockershim)。历史实践中常见组合如:v1.19 配 Docker 19.03、v1.20–v1.23 配 Docker 20.10。 |
| ≥ v1.24.x |
Containerd ≥1.6(推荐);或 Docker + cri-dockerd |
v1.24 起移除 dockershim;若必须用 Docker,需额外部署 cri-dockerd 作为 CRI 接口。 |
- 历史兼容参考:v1.21–v1.23 通常与 Docker 19.03/20.10 搭配;v1.19 常见搭配为 Docker 19.03。以上矩阵用于快速选型与排障基线。
在 Ubuntu 上的实践建议
- 新集群(Ubuntu 20.04/22.04,K8s ≥v1.24)
- 直接采用 Containerd:安装 containerd.io,生成默认配置并将 SystemdCgroup = true,使用 kubeadm 初始化集群(无需再安装 Docker 引擎作为运行时)。该路径与 Kubernetes 的 CRI 原生集成、维护成本更低。
- 既有 Docker 集群升级或必须使用 Docker CLI
- 保留 Docker 用于构建/本地开发,但为 K8s 节点部署 cri-dockerd,在 kubeadm 初始化/加入时通过 –cri-socket=unix:///var/run/cri-dockerd.sock 指定 CRI 套接字;注意 cri-dockerd 的版本需与 K8s 版本匹配(如 v0.3.x 对应 K8s v1.30.x 场景)。
快速自检与常见问题
- 查看运行时与版本
- kubectl get nodes -o wide(查看节点与容器运行时)
- docker --version(若已安装 Docker)
- crictl version / ctr version(Containerd 工具)
- 常见报错与处理
- “kubelet 不支持 Docker”:K8s ≥v1.24 未装 cri-dockerd 或未指定 –cri-socket;安装 cri-dockerd 并在 kubeadm 命令中显式指定套接字即可。
- 镜像拉取慢:为 Containerd 配置 registry mirrors(/etc/containerd/config.toml 的 [plugins.“io.containerd.grpc.v1.cri”.registry.mirrors]),或使用国内镜像源加速。
- 资源占用偏高:迁移至 Containerd 可显著降低节点资源开销(无 dockershim 额外层)。