【Kubernetes系列】Kubenetes如何访问Harbor私有仓库(401 Unauthorized问题解决)


一、问题描述

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"}]}'

猜你喜欢

转载自blog.csdn.net/u012069313/article/details/125331000