K8S 1.35 以及以上版本不能使用本地已有的镜像
本文永久链接: 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/ |


