使用Kubernetes Deployment拉取私有镜像失败,Pod配置正常
部署Deployment时遭遇镜像拉取错误:
rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/registryName/projectName:latest": failed to unpack image on snapshotter overlayfs: unexpected media type text/html
Deployment配置文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: <projectName>-deployment namespace: <projectNamespace> spec: selector: matchLabels: app: <projectname> replicas: 1 template: metadata: labels: app: <projectName> spec: containers: - name: private-reg image: <registry>/<projectName>:latest ports: - containerPort: 9000 imagePullSecrets: - name: docker-hub-cred
但使用以下Pod配置却能正常拉取镜像并运行:
apiVersion: v1 kind: Pod metadata: name: <projectName>-pod namespace: <projectNamespace> spec: containers: - name: <projectName> image: <registry>/<projectName>:latest imagePullSecrets: - name: docker-hub-cred
1. 修正标签大小写不匹配问题
Kubernetes标签是大小写敏感的,你的Deployment里spec.selector.matchLabels.app的值是小写的<projectname>,但Pod模板中metadata.labels.app是驼峰式的<projectName>,这会导致Deployment无法匹配到创建的Pod,进而不断触发镜像拉取操作,间接引发异常。
把Deployment的selector标签改成和模板一致:
spec: selector: matchLabels: app: <projectName> # 改为和模板一致的名称
2. 确认镜像地址一致性
虽然Pod能正常运行,但还是要检查Deployment里的image字段是否和Pod完全一致,确保<registry>变量替换正确,没有拼写错误(比如私有仓库域名、项目名大小写)。
3. 验证部署
修正配置后重新部署:
kubectl apply -f deployment.yml -n <projectNamespace>
查看Deployment状态和事件,确认是否正常:
kubectl describe deployment <projectName>-deployment -n <projectNamespace> kubectl get events -n <projectNamespace>
补充说明
错误中的unexpected media type text/html意味着拉取到的内容不是镜像层,而是HTML页面(通常是仓库返回的404/403错误页面)。既然Pod能正常拉取,说明镜像地址和拉取密钥没问题,核心问题大概率是Deployment的标签匹配错误导致的异常循环拉取。
内容的提问来源于stack exchange,提问作者35Zoll

