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,可以灵活地满足不同规模和复杂度的部署需求。选择合适的方式可以提升安全性和管理效率。


原始标题:Pulling Images from a Private Registry in Kubernetes