1. 概述

Kubernetes 是目前最主流的容器编排系统之一,它通过 Pod 来运行容器镜像。默认情况下,Kubernetes 可以直接拉取公开镜像,但当我们需要从私有仓库拉取镜像时,就必须进行身份验证。

Docker Hub 是一个广泛使用的容器镜像仓库,支持公有和私有镜像。本文将介绍两种在 Kubernetes 中拉取私有 Docker Hub 镜像的常见方法,并说明其适用场景。

2. 创建 Kubernetes Secret

要拉取私有镜像,首先需要向 Kubernetes 提供 Docker Hub 的认证信息。这可以通过创建类型为 docker-registry 的 Secret 实现。

步骤如下:

  1. 创建一个新的命名空间(用于测试):
kubectl create ns baeldung-ns
  1. 创建 Secret:
kubectl create secret \
docker-registry baeldung-image-pull-secret \
--docker-username=your-docker-username \
--docker-password=your-docker-password \
-n baeldung-ns

⚠️ 注意替换 your-docker-usernameyour-docker-password 为你的 Docker Hub 账号信息。

  1. 查看 Secret 是否创建成功:
kubectl get secret -n baeldung-ns

输出应类似:

NAME                         TYPE                             DATA   AGE
baeldung-image-pull-secret   kubernetes.io/dockerconfigjson   1      11s

至此,认证信息已准备好,接下来介绍如何在 Pod 中使用这个 Secret。

3. 引用 Secret

3.1. 使用 imagePullSecrets 字段

这是最直接的方式:在 Pod 定义中显式指定 imagePullSecrets 字段。

示例 YAML 文件 pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: baeldung-private-image
  namespace: baeldung-ns
spec:
  containers:
  - image: baeldung/baeldung-private-image:1.0
    name: baeldung-private-image
    imagePullPolicy: IfNotPresent
  imagePullSecrets:
  - name: baeldung-image-pull-secret

部署并验证:

kubectl apply -f pod.yaml -n baeldung-ns
kubectl get pods -n baeldung-ns

✅ 成功后 Pod 状态应为 Running

⚠️ 如果 Secret 名称错误或未创建,Pod 会处于 ImagePullBackOff 状态。

3.2. 绑定到默认 ServiceAccount

如果多个 Pod 都需要使用同一个 Secret,手动在每个 Pod 中添加 imagePullSecrets 就显得繁琐。这时可以考虑将 Secret 绑定到 ServiceAccount。

示例:为 default ServiceAccount 添加 Secret:

kubectl patch serviceaccount default \
-p '{"imagePullSecrets": [{"name": "baeldung-image-pull-secret"}]}' \
-n baeldung-ns

此时 Pod YAML 中无需再指定 imagePullSecrets

apiVersion: v1
kind: Pod
metadata:
  name: baeldung-private-image
  namespace: baeldung-ns
spec:
  containers:
  - image: baeldung/baeldung-private-image:1.0
    name: baeldung-private-image
    imagePullPolicy: IfNotPresent

部署后验证:

kubectl apply -f pod.yaml -n baeldung-ns
kubectl get pods -n baeldung-ns

✅ 输出应为运行中的 Pod。

⚠️ 虽然示例使用了 default ServiceAccount,但在生产环境中建议使用自定义的 ServiceAccount,以提升安全性和可维护性。

4. 总结

本文介绍了在 Kubernetes 中拉取私有 Docker Hub 镜像的两种常用方式:

  • 通过 Pod 的 imagePullSecrets 字段:适用于少量 Pod 或测试环境
  • **通过绑定 ServiceAccount 的 imagePullSecrets**:适合多个 Pod 共享 Secret,提高管理效率

两种方式各有优劣,实际使用中应根据场景选择。此外,Secret 应妥善管理,避免敏感信息泄露。生产环境中建议结合 RBAC 和命名空间隔离来进一步增强安全性。


原始标题:How to Pull Private Images From Docker Hub in Kubernetes