本文永久链接: https://www.xtplayer.cn/kubernetes/k8s-1-35-cannot-use-the-existing-local-images/

在 Kubernetes v1.33 之前,IfNotPresent 策略的行为比较”单纯”:只要节点本地有镜像,不管当前 Pod 有没有权限,kubelet 都会直接使用,不会去检查凭证。

这就导致了一个安全隐患:假如节点上有一个从私有仓库拉取的镜像,后续任何一个 Pod 只要也引用同名镜像(哪怕没有拉取凭证),kubelet 发现本地镜像存在,就会直接让这个 Pod 用上它。这等于让未授权的 Pod 绕过了权限检查。

为了解决这个问题,Kubernetes 社区从 v1.33 版本开始引入了一个新特性。当这个特性启用后,IfNotPresent 的行为变了:如果镜像已存在,kubelet 会验证当前 Pod 的凭证是否有权拉取该镜像。如果凭证不匹配或无效,kubelet 会为了执行鉴权而重新拉取镜像,从而保障安全。

排查小贴士:如果你使用的是 Kubernetes v1.33 或更新版本,可以检查 kubelet 的配置参数 imagePullCredentialsVerificationPolicy。如果它被设置为 AlwaysVerify(或默认值 NeverVerifyPreloadedImages 以外可能导致重新鉴权的选项),就可能触发镜像重拉。

参考文档:https://kubernetes.io/zh-cn/docs/concepts/containers/images/#ensureimagepullcredentialverification

1.35 默认启用这个功能后,对于离线环境通过导入镜像方式安装 rke2-k8s 集群,Kubelet 无法进行鉴权验证从而导致无法使用本地镜像。

基于以上信息,当需要通过导入镜像方式安装 rke2 集群或者其他应用时,可以通过以下配置去禁用 imagePullCredentialsVerificationPolicy。

mkdir -p /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/

cat >/var/lib/rancher/rke2/agent/etc/kubelet.conf.d/extend-kubelet.conf <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
imagePullCredentialsVerificationPolicy=NeverVerify
EOF