配置K8s拉取私有Harbor仓库镜像的授权认证

最近到了定期修改修改基础设施密码的时间, 在调整了 Harbor 的密码后遇到了 K8s 集群无法拉取 Harbor 仓库的镜像的问题, 记录下 K8s 中重新生成 imagePullSecrets 和配置授权的过程

为Docker配置授权(非必须)

既然来都来了, 顺手给 Docker 也配置一下授权, Docker 的授权文件在~/.docker/config.json

1
2
3
4
5
6
7
8

{
"auths": {
"harbor.hysz.co": {
"auth": "YourAuthToken"
}
}
}

这里的密文实际上通过Base64解密后是username:password的形式

配置完成后docker pull测试是否生效

创建Kubernetes Secret

为了让 Kubernetes 节点能够拉取私有镜像, 我们需要创建一个Docker registry类型的 Secret, 它包含 Harbor 登录信息, K8s 可以使用这个Secret来进行镜像拉取认证

在开始之前准备好好以下信息:

  • Harbor 仓库地址: harbor.example.com
  • Harbor 用户名: your-username
  • Harbor 密码: your-password
  • Namespace: default(根据实际情况修改)

然后使用以下命令创建Secret

1
2
3
4
5
6
kubectl create secret docker-registry <secret_name> \
--docker-server=harbor.example.com \
--docker-username=your-username \
--docker-password=your-password \
--docker-email=your-email@example.com \
--namespace=default

其中<secret_name>是自定义的 Secret 名称, --docker-email是你的电子邮件地址, 通常情况下非必要

!!!注意
请务必要知晓, 创建的Secret和命名空间是绑定的, 是无法跨命名空间使用Secret

配置 Pod 使用 Secret

需要在Pod的定义文件中指定这个Secret来拉取私有镜像, 你可以在 Pod 或者 Deployment 的 YAML 文件中设置imagePullSecrets字段

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: <harbor_registry_url>/<project_name>/<image_name>:<tag>
imagePullSecrets:
- name: <secret_name>

配置完成后应用 Pod 配置, 查看 Pod 是否能成功拉取镜像并运行

1
2
kubectl apply -f <your-pod-definition.yaml>
kubectl get pods

设置默认的 imagePullSecrets (可选)

如果你希望在命名空间内的所有 Pod 都默认使用这个 Secret, 可以为整个命名空间配置默认的 imagePullSecrets, 这样就不需要在每个 Pod 的定义中都添加配置

1
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "<secret_name>"}]}' -n <namespace>

这样在这个命名空间<namespace>中, 所有 Pod 都会自动使用指定的 Secret 来拉取镜像