1. 概述
Kubernetes 是目前最主流的容器编排系统之一,它通过 Pod 来运行容器镜像。默认情况下,Kubernetes 可以直接拉取公开镜像,但当我们需要从私有仓库拉取镜像时,就必须进行身份验证。
Docker Hub 是一个广泛使用的容器镜像仓库,支持公有和私有镜像。本文将介绍两种在 Kubernetes 中拉取私有 Docker Hub 镜像的常见方法,并说明其适用场景。
2. 创建 Kubernetes Secret
要拉取私有镜像,首先需要向 Kubernetes 提供 Docker Hub 的认证信息。这可以通过创建类型为 docker-registry
的 Secret 实现。
✅ 步骤如下:
- 创建一个新的命名空间(用于测试):
kubectl create ns baeldung-ns
- 创建 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-username
和 your-docker-password
为你的 Docker Hub 账号信息。
- 查看 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 和命名空间隔离来进一步增强安全性。