Skip to content

解决容器运行时的沙盒镜像与kubeadm使用的沙盒镜像不一致问题

具体表现

txt
[preflight] You can also perform this action beforehand using 'kubeadm config images pull'
W0617 16:13:21.203208   47633 checks.go:846] detected that the sandbox image "registry.k8s.io/pause:3.8" of the container runtime is inconsistent with that used by kubeadm.It is recommended to use "registry.k8s.io/pause:3.10" as the CRI sandbox image.

这通常是由于 containerd 配置未正确指定默认 pause 镜像,导致 kubeadm 仍然使用旧版本的默认值。

解决方案

从你的 ctr -n=k8s.io images ls 输出可以看到,registry.k8s.io/pause:3.10 确实已经存在于 containerd 中,但 kubeadm 仍然报告检测到 pause:3.8。这通常是由于 containerd 配置未正确指定默认 pause 镜像,导致 kubeadm 仍然使用旧版本的默认值。


终极解决方案

1. 强制修改 containerd 的 sandbox_image 配置

bash
# 生成默认配置(如果不存在)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置,明确指定 pause:3.10
sudo sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.10"|g' /etc/containerd/config.toml

# 重启 containerd
sudo systemctl restart containerd

2. 验证 containerd 配置是否生效

bash
sudo grep sandbox_image /etc/containerd/config.toml

输出应为:

toml
sandbox_image = "registry.k8s.io/pause:3.10"

3. 重新初始化集群

bash
sudo kubeadm reset -f  # 先重置
sudo kubeadm init \
  --kubernetes-version v1.33.0 \
  --pod-network-cidr=192.168.0.0/16 \
  --apiserver-advertise-address=192.168.0.160 \
  --control-plane-endpoint=192.168.0.160 \
  --cri-socket unix:///var/run/containerd/containerd.sock

为什么问题仍然存在?

  1. containerd 未正确加载配置
  • 如果 /etc/containerd/config.toml 未被正确加载,containerd 仍会使用内置默认值(可能是 pause:3.8)。
  • 解决方法:确保 containerd 服务重启后配置生效:
    bash
    sudo systemctl restart containerd
    sudo systemctl status containerd  # 检查是否重启成功
  1. kubelet 缓存了旧配置
  • kubelet 可能缓存了旧的 sandbox 镜像设置。
  • 解决方法:重启 kubelet:
    bash
    sudo systemctl restart kubelet
  1. kubeadm 的默认值未覆盖
  • 即使 containerd 配置正确,kubeadm 可能仍会检查运行时默认值。
  • 解决方法:在 kubeadm init 时显式指定 --config 文件,覆盖默认值(见下文)。

高级方案:使用 kubeadm 配置文件

如果上述方法仍无效,可以通过配置文件强制指定 pause 镜像:

bash
cat <<EOF | sudo tee kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.33.0
imageRepository: registry.k8s.io
networking:
  podSubnet: "192.168.0.0/16"
apiServer:
  extraArgs:
    advertise-address: 192.168.0.160
controlPlaneEndpoint: "192.168.0.160:6443"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
featureGates:
  KubeletInUserNamespace: true
sandboxImage: registry.k8s.io/pause:3.10
EOF

# 初始化集群
sudo kubeadm init --config kubeadm-config.yaml --cri-socket unix:///var/run/containerd/containerd.sock

验证最终结果

  1. 检查运行中的 Pod 是否使用 pause:3.10

    bash
    kubectl describe pod -n kube-system kube-apiserver-$(hostname) | grep Image:

    预期输出:

    Image: registry.k8s.io/pause:3.10
  2. 检查 kubelet 日志

    bash
    journalctl -u kubelet -n 50 --no-pager | grep sandbox

    应无 pause:3.8 相关警告。


其他注意事项

  1. 关于 cgroups v1 的警告
  • 这是另一个独立问题,如果需要消除警告,需升级系统到支持 cgroups v2 的发行版(如 Ubuntu 22.04+)。
  • 临时忽略:不影响集群功能。
  1. 离线环境特殊处理
  • 确保所有依赖镜像(如 kube-apiservercoredns 等)均已导入 containerd:
    bash
    sudo ctr -n=k8s.io images ls -q

总结

根本原因是 containerd 的默认配置未正确指定 pause:3.10,导致 kubeadm 检测到旧版本。通过以下步骤可彻底解决:

  1. 修正 /etc/containerd/config.toml,明确设置 sandbox_image
  2. 重启 containerd 使配置生效。
  3. 重新初始化集群,必要时使用 --config 文件覆盖默认值。

执行后,pause:3.8 警告将消失,集群会稳定使用 pause:3.10

最后更新2026/06/09 05:35
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal