Appearance
解决容器运行时的沙盒镜像与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 containerd2. 验证 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为什么问题仍然存在?
- containerd 未正确加载配置
- 如果
/etc/containerd/config.toml未被正确加载,containerd 仍会使用内置默认值(可能是pause:3.8)。 - 解决方法:确保
containerd服务重启后配置生效:bashsudo systemctl restart containerd sudo systemctl status containerd # 检查是否重启成功
- kubelet 缓存了旧配置
- kubelet 可能缓存了旧的 sandbox 镜像设置。
- 解决方法:重启 kubelet:bash
sudo systemctl restart kubelet
- 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验证最终结果
检查运行中的 Pod 是否使用
pause:3.10:bashkubectl describe pod -n kube-system kube-apiserver-$(hostname) | grep Image:预期输出:
Image: registry.k8s.io/pause:3.10检查 kubelet 日志:
bashjournalctl -u kubelet -n 50 --no-pager | grep sandbox应无
pause:3.8相关警告。
其他注意事项
- 关于
cgroups v1的警告
- 这是另一个独立问题,如果需要消除警告,需升级系统到支持
cgroups v2的发行版(如 Ubuntu 22.04+)。 - 临时忽略:不影响集群功能。
- 离线环境特殊处理
- 确保所有依赖镜像(如
kube-apiserver、coredns等)均已导入 containerd:bashsudo ctr -n=k8s.io images ls -q
总结
根本原因是 containerd 的默认配置未正确指定 pause:3.10,导致 kubeadm 检测到旧版本。通过以下步骤可彻底解决:
- 修正
/etc/containerd/config.toml,明确设置sandbox_image。 - 重启 containerd 使配置生效。
- 重新初始化集群,必要时使用
--config文件覆盖默认值。
执行后,pause:3.8 警告将消失,集群会稳定使用 pause:3.10。
