在Kubernetes中配置私有仓库镜像拉取需通过Secret和imagePullSecrets实现。以下是关键步骤与实践经验:
-
创建docker-registry类型Secret
kubectl create secret docker-registry regcred \ --docker-server=registry.example.com \ --docker-username=<user> \ --docker-password=<password> \ --docker-email=<email>
*注意:若使用自签名证书,需在节点Docker配置中添加
"insecure-registries": ["registry.example.com"]
并重启containerd -
Pod配置引用Secret 在deployment/pod的yaml中指定:
spec: containers: - name: app image: registry.example.com/app:v1 imagePullSecrets: - name: regcred
实践中常见挑战及解决方案:
- 证书验证失败:当私有仓库使用自签名证书时,需将CA证书写入所有节点的
/etc/docker/certs.d/registry.example.com/ca.crt
,并在containerd配置中声明信任 - 网络策略拦截:需确保Calico/CNI网络策略允许节点访问私有仓库的5000/443端口,特别是跨VPC场景
- 镜像拉取超时:通过
kubectl describe pod
查看Events,若出现ImagePullBackOff,需检查DNS解析(可添加hostAliases)、MTU大小(overlay网络常见问题) - 多命名空间管理:通过Kustomize生成namespace-specific的secret,或使用ClusterSecret方案(需搭配第三方控制器)
- Harbor集成问题:当使用Robot Account时,需注意生成的token可能包含特殊字符,建议base64加密后存入Secret
优化实践:
- 通过ServiceAccount全局绑定imagePullSecrets:
apiVersion: v1 kind: ServiceAccount metadata: name: default imagePullSecrets:
- name: regcred
- 对生产环境建议部署Harbor仓库,并启用镜像扫描和保留策略
- 在CI/CD流水线中,通过Vault动态生成临时仓库凭证并注入Secret