离线环境下Kubernetes无法识别ctr导入的本地镜像
验证镜像引用与Pod Spec的一致性
用命令查看Cilium Pod的实际镜像配置,确认和你导入的镜像完全匹配:microk8s kubectl get pod <cilium-pod-name> -n kube-system -o yaml | grep -A3 image同时检查containerd中镜像的完整摘要:
microk8s ctr --namespace k8s.io image inspect quay.io/cilium/cilium:v1.14.2 | grep -A5 digest确保两者的
sha256摘要完全一致,无大小写或字符差异。重新导入镜像排除损坏问题
可能镜像导入过程中存在损坏,删除现有镜像后重新导入:# 删除旧镜像 microk8s ctr --namespace k8s.io image rm quay.io/cilium/cilium:v1.14.2 quay.io/cilium/cilium@sha256:6263f3a3d5d63b267b538298dbeb5ae87da3efacf09a2c620446c873ba807d35 # 重新导入镜像文件 microk8s ctr --namespace k8s.io image import <cilium-image-file.tar>导入完成后再次确认镜像存在:
microk8s ctr --namespace k8s.io image ls | grep cilium验证kubelet与containerd的配置一致性
检查microk8s的kubelet是否指向正确的containerd套接字:# 查看kubelet配置中的容器运行时端点 cat /var/snap/microk8s/current/args/kubelet | grep container-runtime-endpoint正常输出应为
--container-runtime-endpoint=unix:///var/snap/microk8s/current/run/containerd.sock,确保你导入镜像使用的microk8s ctr命令连接的是同一套接字(该命令默认使用microk8s内置的containerd)。用测试Pod验证镜像可用性
创建一个极简测试Pod,直接使用目标镜像和Never拉取策略,验证镜像是否能被kubelet识别:apiVersion: v1 kind: Pod metadata: name: test-cilium-image namespace: kube-system spec: containers: - name: test-cilium image: quay.io/cilium/cilium:v1.14.2@sha256:6263f3a3d5d63b267b538298dbeb5ae87da3efacf09a2c620446c873ba807d35 imagePullPolicy: Never command: ["sleep", "3600"]应用后查看Pod状态:
microk8s kubectl apply -f test.yaml microk8s kubectl get pod test-cilium-image -n kube-system如果测试Pod能正常启动,说明问题出在Cilium Helm Chart的配置中(比如存在未导入的sidecar镜像、拉取策略被模板覆盖等);如果测试Pod同样失败,说明镜像或containerd与kubelet的交互存在问题。
检查Helm Values中的拉取策略配置
确认你的values.yml中是否正确设置了全局镜像拉取策略,以及Cilium组件的拉取策略:global: imagePullPolicy: Never image: pullPolicy: Never operator: image: pullPolicy: Never确保所有涉及镜像的组件都设置了
Never拉取策略,避免部分容器被默认设置为IfNotPresent或Always。
内容的提问来源于stack exchange,提问作者Tomas

