我们的应用镜像都是存放在私有的镜像仓库里,比如Harbor,在拉取镜像的时候是需要提供凭证的。那么Kubernetes中如何从私有镜像仓库拉取镜像呢?
Kubernetes从私有仓库读取镜像也是需要密钥的。凭据可以用以下方式提供:
1.配置节点向私有仓库进行身份验证,所有 Pod 均可读取任何已配置的私有仓库,这个需要集群管理员配置节点。
2.kubelet 凭据提供程序,动态获取私有仓库的凭据,kubelet 可以被配置为使用凭据提供程序 exec 插件来访问对应的私有镜像库。
3.预拉镜像,所有 Pod 都可以使用节点上缓存的所有镜像。
4.在 Pod 中设置 ImagePullSecrets,只有提供自己密钥的 Pod 才能访问私有仓库
5.特定于厂商的扩展或者本地扩展,如果使用定制的节点配置,云平台提供商可以实现让节点向容器仓库认证的机制。
推荐还是使用 ImagePullSecrets,本文以此为例说明。我们先来创建拉取镜像的凭证secret,它实际上secret的一个特定的类型:kubernetes.io/dockercfg 或者 kubernetes.io/dockerconfigjson
secret类型
1.使用 Docker Config 创建 Secret
kubectl create secret docker-registry regcred \ --docker-server=<镜像仓库服务器> \ --docker-username=<用户名> \ --docker-password=<密码> \ --docker-email=<邮箱地址>查看创建的secret,kubectl get secret regcred -o yaml
2.或者使用 kubernetes.io/dockerconfigjson 类型的 Secret 来通过镜像仓库的身份验证。
服务器上我们 docker login 一个镜像仓库,会生成一个文件:<path/to/.docker/config.json>,如下图:
docker/config.json
kubectl create secret generic regcred \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson请注意,这些secret需要各自添加下namespace,只针对各自的命名空间生效。一个示例yaml:
apiVersion: v1kind: Secretmetadata: name: regcred namespace: awesomeappsdata: .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==type: kubernetes.io/dockerconfigjson3.在 Pod 中引用 ImagePullSecretsapiVersion: v1kind: Podmetadata: name: private-regspec: containers: - name: private-reg-container image: <your-private-image> imagePullSecrets: - name: regcred镜像就可以自动获取凭证下载了。
如果您在日常运维工作中遇到了任何问题或挑战,无论是关于系统配置、性能优化、故障排除还是其他方面,都欢迎您随时留言或私信我。我会尽我所能为您提供解决方案或建议。相互学习,积累更多的经验和知识,让工作更加顺畅高效!
参考 1.https://kubernetes.io/zh-cn/docs/concepts/containers/images/
参考2.https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials