Kubeadm初始化踩坑记:containerd默认禁用CRI的解决方案(附详细排查步骤)
Kubeadm初始化实战containerd运行时配置全解析与排错指南当你在Linux服务器上敲下kubeadm init命令时满心期待Kubernetes集群的诞生却突然遭遇container runtime is not running的红色错误提示——这种挫败感相信每个Kubernetes初学者都深有体会。特别是在使用containerd作为容器运行时的情况下这个看似简单的报错背后往往隐藏着容易被忽视的配置细节。1. 理解containerd与CRI的协作机制containerd作为行业标准的容器运行时其实是一个模块化的守护进程。它通过插件系统提供各种功能而CRIContainer Runtime Interface插件正是Kubernetes与containerd通信的桥梁。默认安装containerd时你可能会惊讶地发现CRI插件竟然是被禁用的状态。这其实源于containerd的设计哲学按需启用功能。在/etc/containerd/config.toml配置文件中你会看到这样的配置段disabled_plugins [cri]这个看似无害的配置行正是导致kubeadm init失败的罪魁祸首。Kubeadm在初始化时会通过CRI接口与containerd通信当它发现这个接口不可用时就会抛出那个令人沮丧的错误。提示containerd从1.5版本开始将CRI插件从核心分离这是导致默认禁用CRI的历史原因2. 从报错到解决的完整诊断流程当遇到container runtime is not running错误时一个系统化的排查流程能帮你快速定位问题验证containerd服务状态systemctl status containerd确保服务处于active (running)状态检查CRI插件是否启用containerd config dump | grep disabled_plugins如果输出中包含cri说明问题已经找到检查套接字文件权限ls -l /var/run/containerd/containerd.sock确保kubelet用户通常是root有读写权限验证CRI接口可用性ctr version如果这个命令失败说明containerd配置有更基础的问题3. 深度配置containerd与Kubernetes集成仅仅启用CRI插件可能还不足以让Kubernetes完美运行这里有几个进阶配置项值得关注containerd配置文件关键参数参数推荐值作用说明systemd_cgrouptrue与systemd更好的集成sandbox_imageregistry.k8s.io/pause:3.6指定Pod沙箱镜像max_concurrent_downloads3控制镜像下载并发数完整的配置示例[plugins.io.containerd.grpc.v1.cri] sandbox_image registry.k8s.io/pause:3.6 [plugins.io.containerd.grpc.v1.cri.containerd] snapshotter overlayfs [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true修改配置后记得重启containerd服务使更改生效systemctl restart containerd4. Kubeadm初始化前的环境检查清单在运行kubeadm init之前建议完成以下准备工作内核参数检查cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system交换分区检查swapoff -a sed -i / swap / s/^/#/ /etc/fstab防火墙规则配置firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port10250/tcp firewall-cmd --reloadSELinux模式调整setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config5. 常见问题与高级调试技巧即使按照上述步骤配置仍然可能遇到各种惊喜。这里分享几个实际案例中的经验案例一镜像拉取失败错误现象Failed to pull image registry.k8s.io/pause:3.6: rpc error: code Unknown desc failed to pull and unpack image registry.k8s.io/pause:3.6: failed to resolve reference registry.k8s.io/pause:3.6: failed to do request: Head https://registry.k8s.io/v2/pause/manifests/3.6: dial tcp: lookup registry.k8s.io on [::1]:53: read udp [::1]:42823-[::1]:53: read: connection refused解决方案containerd config default /etc/containerd/config.toml sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml systemctl restart containerd案例二cgroup驱动不匹配错误现象error: failed to parse kernel config: unable to load kernel module configs解决方案kubeadm init --cri-socket unix:///var/run/containerd/containerd.sock --pod-network-cidr10.244.0.0/16案例三证书过期问题预防措施kubeadm init phase certs all --apiserver-cert-extra-sansyour-domain.com kubeadm init phase kubeconfig all在Kubernetes部署这条路上containerd配置只是众多挑战中的一个。每次遇到问题并成功解决后不妨将解决过程记录下来——这不仅能巩固你的知识当下次遇到类似问题时你也能更快地找到方向。