1. 访问私有镜像仓库
当你的Docker镜像存储在私有镜像仓库(如私有Docker Hub、Harbor、ACR、ECR等)时,需要凭据才能拉取镜像。
当Pod被调度到某个节点上时,kubelet会尝试拉取Pod中指定的镜像。如果镜像位于私有仓库,kubelet就会使用private-registry-auth这个Secret中的凭证去拉取。
注意:如果Pod中指定了多个镜像,且来自不同的私有仓库,那么可能需要多个imagePullSecret,每个对应一个仓库。或者,也可以创建一个包含多个仓库凭证的Secret(但一个Secret通常只对应一个仓库)。
另外,除了在Pod级别指定imagePullSecrets,还可以在ServiceAccount级别指定,这样所有使用该ServiceAccount的Pod都会自动使用这些imagePullSecrets,避免了在每个Pod中重复配置。
2. 提供认证凭据
private-registry-auth 是一个提前创建的Secret对象,包含:
-
用户名和密码
-
或Docker配置JSON文件
-
或访问令牌
创建对应的Secret
需要提前创建这个Secret:
bash
# 方法1:使用用户名密码创建
kubectl create secret docker-registry private-registry-auth \
--docker-server=<registry-url> \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<email>
# 方法2:使用已有的docker config文件
kubectl create secret generic private-registry-auth \
--from-file=.dockerconfigjson=/path/to/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
使用场景示例
yaml
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
template:
spec:
imagePullSecrets:
- name: private-registry-auth # 引用之前创建的Secret
containers:
- name: app
image: private-registry.example.com/mycompany/app:v1.0 # 私有镜像
工作原理
-
Pod创建时:kubelet从私有仓库拉取镜像
-
身份验证 :使用
imagePullSecrets中的凭据进行认证 -
镜像拉取:认证成功后拉取镜像到节点
最佳实践
yaml
bash
# 可以将imagePullSecrets绑定到ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
imagePullSecrets:
- name: private-registry-auth # 所有使用这个SA的Pod都会自动继承
# 然后在Pod中引用这个ServiceAccount
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
serviceAccountName: default # 自动获得imagePullSecrets
containers:
- name: app
image: private.registry/app:v1
替代方案比较
| 方式 | 优点 | 缺点 |
|---|---|---|
| Pod级imagePullSecrets | 灵活,不同Pod可用不同凭据 | 每个Pod都要配置 |
| ServiceAccount级 | 统一管理,减少重复配置 | 所有使用该SA的Pod共享凭据 |
| 节点级配置 | 在节点docker daemon配置 | 不推荐,安全性差 |
这个配置是现代Kubernetes安全实践中保护私有镜像访问的重要部分。