1. 概述

目前,kubectl run 并没有直接支持通过参数传递镜像拉取密钥(Image Pull Secret)的功能。不过我们仍然可以通过以下几种方式实现目的:

  • 配置默认 ServiceAccount 使用指定的镜像拉取 Secret;
  • 创建自定义 ServiceAccount 并绑定 Secret;
  • 或者在 kubectl run 时直接修改生成的 Pod 定义来附加 Secret。

本文将介绍这三种方式的具体操作流程,适用于使用私有镜像部署 Pod 的场景。

2. 使用默认 ServiceAccount

2.1 创建镜像拉取 Secret

首先,我们使用如下命令创建一个 Docker Registry 类型的 Secret:

$ kubectl create secret docker-registry baeldung-secret \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=your-docker-username \
  --docker-password=your-docker-password \
  --docker-email=your-email@example.com

⚠️ 注意:如果镜像仓库不在 Docker Hub,请根据实际情况修改 --docker-server 的值。

2.2 将 Secret 绑定到默认 ServiceAccount

可以通过 kubectl edit 编辑默认 ServiceAccount:

$ kubectl edit serviceaccount default

在编辑器中添加如下字段:

imagePullSecrets:
- name: baeldung-secret

或者使用 kubectl patch 命令实现相同效果:

$ kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "baeldung-secret"}]}'

2.3 使用 kubectl run 启动 Pod

绑定成功后,执行如下命令即可拉取私有镜像:

$ kubectl run test --image=baeldung/image

2.4 验证是否成功拉取镜像

运行以下命令查看 Pod 的事件信息:

$ kubectl describe pod test

在输出的 Events 区块中,如果看到类似如下信息说明镜像拉取成功:

Normal  Pulled     7s    kubelet  Successfully pulled image "baeldung/image"

优点:配置一次即可在多个 Pod 中复用。
缺点:不适合生产环境精细权限控制需求。

3. 使用自定义 ServiceAccount

3.1 创建自定义 ServiceAccount

$ kubectl create serviceaccount baeldung

3.2 绑定 Image Pull Secret

同样使用 kubectl patch 命令:

$ kubectl patch serviceaccount baeldung -p '{"imagePullSecrets": [{"name": "baeldung-secret"}]}'

3.3 使用自定义 ServiceAccount 启动 Pod

$ kubectl run test --image=baeldung/image \
  --overrides='{ "spec": { "serviceAccount": "baeldung" } }'

3.4 验证 Pod 使用的 ServiceAccount

查看 Pod 描述信息:

$ kubectl describe pod test

在输出中确认 Service Account 字段是否为 baeldung

优点:便于权限隔离和审计,适合生产环境。
⚠️ 建议:不同业务模块使用不同 ServiceAccount,提升可维护性。

4. 覆盖 Pod 定义方式

4.1 直接在 kubectl run 中指定 imagePullSecrets

这种方式不需要修改 ServiceAccount,直接在 Pod 定义中添加:

$ kubectl run test --image=baeldung/image \
  --overrides='{"spec": {"imagePullSecrets":[{"name": "baeldung-secret"}]}}'

4.2 验证是否成功

同样使用:

$ kubectl describe pod test

优点:快速、临时使用,适合测试或紧急修复。
缺点:无法复用,每次都需要手动添加。

5. 总结

方法 适用场景 是否持久化 推荐程度
默认 ServiceAccount 快速测试 ⭐⭐
自定义 ServiceAccount 生产环境 ⭐⭐⭐⭐
覆盖 Pod 定义 临时使用 ⭐⭐⭐
  • ✅ 推荐优先使用自定义 ServiceAccount,便于权限管理和审计;
  • ⚠️ 避免在生产环境中长期使用默认 ServiceAccount;
  • 🧪 对于测试或紧急修复,可使用覆盖 Pod 定义的方式,快速拉取私有镜像。

如你正在构建 CI/CD 流水线,建议将镜像拉取 Secret 绑定到对应的 ServiceAccount,避免每次部署都手动指定,提高自动化程度。


原始标题:How to Pass Image Pull Secret Using ‘kubectl run’