目录
一、问题描述
Kubenetes 拉取 Harbor 私有仓库镜像报 401 Unauthorized 错误:
Failed to pull image "192.168.1.48/shop/common-api:4.2.3.1": rpc error: code = Unknown desc = failed to pull and unpack image "192.168.1.48/shop/common-api:4.2.3.1": failed to resolve reference "192.168.1.48/shop/common-api:4.2.3.1": pulling from host 192.168.1.48 failed with status code [manifests 4.2.3.1]: 401 Unauthorized
二、解决方法
需要在 Kubenetes 配置 Secret 访问 Harbor。
1.登录
docker login 192.168.1.48
2.查看登录的密钥数据
cat ~/.docker/config.json
3.加密密钥
cat ~/.docker/config.json | base64 -w 0
4.Harbor 上创建机器人账号
Harbor 上创建机器人账号,账号名称与将要创建的 Secret 名称一致:
5.创建 Secret
(1)方式一:命令行创建
kubectl create secret docker-registry harbor-secret --docker-server="192.168.1.48" \
--docker-email=[email protected] \
--docker-username='admin' \
--docker-password='Harbor12345' \
-n shop-service
(2)方式二:yaml 文件创建
创建 harbor-secret.yaml 文件,其中 .dockerconfigjson 的值为第 3 步获得的加密串:
vi harbor-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: harbor-secret
namespace: shop-service
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuNDgiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9LAoJCSIxOTIuMTY4LjEuNDg6NDQzIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0iCgkJfQoJfQp9
type: kubernetes.io/dockerconfigjson
执行:
kubectl apply -f harbor-secret.yaml
6.Pod 上应用 Secret
Pod 上指定 imagePullSecrets:
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: my-nginx
image: 192.168.10.48/shop/nginx:1.21.1
ports:
- containerPort: 80
7.设置自动关联 Secret
从第 6 步我们看到,每次在创建 Pod 时都需要通过 imagePullSecrets 字段引用相应 namespace 下的 secret,很不方便,可以通过 kubectl patch 命令来将 namespace 和对应的 secret 自动关联,执行如下语句,关联后就不需要在 Pod 上指定 imagePullSecrets:
kubectl patch serviceaccount default -n shop-service -p '{"imagePullSecrets":[{"name":"harbor-secret"}]}'