1. 概述
在 Kubernetes 中从私有仓库拉取 Docker 镜像需要进行正确的认证配置。私有仓库通过控制谁可以访问镜像来提升安全性。在 Kubernetes 中,这通常涉及创建 Docker 仓库 Secret 并配置 Pod 使用该 Secret。
本教程将一步步介绍如何在 Kubernetes 中安全地配置私有 Docker 仓库的镜像拉取流程。这将确保集群能够正确地进行身份验证并访问私有镜像,从而提升安全性和效率。
2. 前提条件
在开始之前,请确保满足以下条件:
- 一个正常运行的 Kubernetes 集群
- 可以访问私有 Docker 仓库(例如 Docker Hub、Nexus 或 Artifactory)
- 已安装并配置好 kubectl,用于与集群通信
3. 生成 Docker 仓库 Secret
Kubernetes 通过 Secret 来管理敏感信息,例如 Docker 仓库的凭证。这些 Secret 会在拉取镜像时用于认证私有仓库。我们可以通过以下两种方式创建 Docker 仓库 Secret。
3.1. 从已有凭证生成 Secret
如果你已经通过 docker login
登录过私有仓库,可以直接使用已有的凭证生成 Secret。此时,Docker 的认证信息已经保存在 ~/.docker/config.json
文件中,我们可以直接使用这个文件创建 Secret:
$ kubectl create secret generic <secret-name> --from-file=.dockerconfigjson=~/.docker/config.json --type=kubernetes.io/dockerconfigjson --namespace=<namespace>
✅ 该命令会从 ~/.docker/config.json
创建一个 Kubernetes Secret,并将其应用到指定的命名空间中。这种方式非常方便,因为它利用了已有的配置,避免了手动输入凭证的麻烦。
3.2. 通过命令行手动输入凭证生成 Secret
另一种方式是通过命令行手动输入凭证创建 Secret。这种方式适用于首次配置或当凭证未保存在 ~/.docker/config.json
中的情况:
$ kubectl create secret docker-registry <secret-name> --docker-server=<registry-server> --docker-username=<username> --docker-password=<password> --docker-email=<email> --namespace=<namespace>
⚠️ 这种方法存在安全隐患,因为敏感信息可能会被保存在 shell 的历史记录中。此外,其他用户可能在执行命令时看到这些凭证。
4. 配置 Pod 使用 Secret
创建好 Docker 仓库 Secret 后,下一步是配置 Pod 使用该 Secret 来拉取镜像。Kubernetes 提供了两种主要方式来将 Secret 与 Pod 关联。
4.1. 在容器配置中直接使用 imagePullSecrets
最直接的方式是在 Pod 的配置中指定 imagePullSecrets
字段。
以下是一个示例 YAML 配置:
apiVersion: v1
kind: Pod
metadata:
namespace: <namespace>
name: <pod_name>
spec:
containers:
- name: <container_name>
image: <registry-server>/<image-name>:<tag>
imagePullSecrets:
- name: <secret-name>
✅ imagePullSecrets
字段告诉 Kubernetes 在拉取容器镜像时使用指定的 Secret。
4.2. 使用 Service Account
对于需要多个 Pod 访问私有仓库的场景,更推荐使用 Service Account,这样可以实现更可扩展的配置。
首先创建一个 Service Account:
$ kubectl create serviceaccount <sa-name> -n <namespace>
然后将其与 Secret 关联:
$ kubectl patch serviceaccount <sa-name> -p '{"secrets":[{"name":"<secret-name>"}]}' -n <namespace>
✅ 通过将 Service Account 与 Secret 绑定,所有使用该账户的 Pod 都可以自动拉取私有仓库中的镜像。
最后,创建一个 Pod 配置文件 pod.yaml
,并指定使用该 Service Account:
apiVersion: v1
kind: Pod
metadata:
namespace: <namespace>
name: <pod-name>
spec:
serviceAccountName: <sa-name>
containers:
- name: <container-name>
image: <registry-server>/<image-name>:<tag>
5. 部署与验证
完成 Secret 创建和 Pod 配置后,可以使用以下命令部署:
$ kubectl apply -f pod.yaml
✅ 使用以下命令查看 Pod 的事件日志,确认是否成功从私有仓库拉取镜像:
$ kubectl describe pod <pod-name>
🔍 检查是否有与镜像拉取相关的错误信息。如果没有错误,说明 Pod 已成功使用私有仓库的镜像。
6. 小结
在 Kubernetes 中从私有仓库拉取镜像的关键在于创建 Docker Registry Secret 并正确配置 Pod 使用它。
✅ 通过使用 imagePullSecrets
或绑定 Service Account,可以灵活地满足不同规模和复杂度的部署需求。选择合适的方式可以提升安全性和管理效率。