Kubernetes配置Secret访问Harbor私有镜像仓库

一.kubernetes配置pod访问私有harbor

从yaml文件中应用harbor私有库中的镜像时,如果不创建secret会出现401 Unauthorized的错误。

这里以运行nginx pod,在harbor私有库kubernetes中下载nginx镜像为例,列出kubernetes配置pod访问私有harbor的步骤。

  • 1.在有docker环境的机器上绑定hosts并登录harbor
vim /etc/hosts
# 增加:
172.16.108.7   harbor域名

docker login harbor域名
Username: ******
Password: ****** 
  • 2.docker官方hub下载nginx镜像,修改标签后上传到本地harbor
# 搜索、下载镜像
docker search nginx
docker pull nginx
# 修改标签名为本地harbor的kubernetes仓库
docker tag nginx:latest harbor域名/kubernetes/nginx:latest
# 上传此镜像到harbor私有仓库kubernetes中
docker push harbor域名/kubernetes/nginx:latest 
  • 3.在harbor的私有库kubernetes中新建机器人账户,可以选择权限,一般只pull权限就足够

  • 4.利用刚才新建机器人账户生成的username和token创建secret
    kubernetes集群使用docker-registry类型的secret来通过仓库的身份验证,进而提取私有镜像

kubectl create secret docker-registry docker-registry-creds --docker-server="harbor域名"
--docker-email=test@test.com 
--docker-username='******' 
--docker-password='******'

注意:

--docker-server 是私有docker仓库全限定域名(FQDN)
--docker-username 是机器人账户的username,需要用单引号引起来。
--docker-password 是机器人账户生成的token,需要用单引号引起来。
--docker-email 是docker邮箱(非必须)。
这样就成功地将集群中的docker凭据设置为名为docker-registry-creds的secret。
  • 5.创建nginx pod
vim nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: harbor域名/kubernetes/nginx:latest 
    ports:
    - containerPort: 80
  imagePullSecrets:
    - name: docker-registry-creds

利用imagePullSecrets来引用刚创建的docker-registry-creds

# 查看创建的secret
kubectl get secrets
# 创建nginx pod   
kubectl apply -f nginx.yaml 
# 查看创建的pod   
kubectl get pods
# 查看nginx pod的详细信息
kubectl describe pod nginx    

这样,在运行创建pod的yaml文件时就可以使用harbor私有库中的镜像了。

二.不同的namespece配置不同的secret,pod使用secret访问私有harbor

namespace在很多情况下用于实现多租户的资源隔离,通过将集群内部的资源对象分配到不同的namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。

如果不特别指明namespace,则用户创建的pod、RC、service都将被系统创建到这个默认的名为default的namespace中。

这里以名为test-namespace的namespace,名为test-secret的secret为例,列出创建不同namespace,并使用不同的secret访问harbor私有仓库的步骤。

  • 1.创建namespace

命令方式创建:

kubectl create namespace test-namespace
kubectl get namespaces

yaml文件方式创建:

vim test-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test-namespace
  labels:
    name: test-namespace

kubectl apply -f test-namespace.yaml
或 
kubectl create –f test-namespace.yaml
  • 2.在harbor页面创建名为test-secret的机器人账户

  • 3.一般情况下创建的secret都是在默认的namespace default中的,这里先创建default下的secret

# 创建命令
kubectl create secret docker-registry test-secret --docker-server="harbor域名" 
--docker-email=test@test.com 
--docker-username='******' 
--docker-password='******'
-n test-namespace   

# --all-namespace可以查看所有namespace下的secrets
kubectl get secrets --all-namespaces
# -n参数来查看指定namespace下的secret
kubectl get secrets -n test-namespace

注意:.dockerconfigjson的值包括了登录harbor的用户名和密码等信息,通过以下命令可以查看

kubectl get secret test-secret -n test-namespace --output="jsonpath={.data..dockerconfigjson}"|base64 -d

# 输出结果为
{"auths":{"harbor.pwesports.net":{"username":"robot$kubernetes+test-secret","password":"jjFu85zTNG6AOSvfoNzPU7pt95v0LmIB","email":"zhangyiwen117968@pwrd.com","auth":"cm9ib3Qka3ViZXJuZXRlcyt0ZXN0LXNlY3JldDpqakZ1ODV6VE5HNkFPU3Zmb056UFU3cHQ5NXYwTG1JQg=="}}}
  • 4.在该namespace下创建nginx pod时,通过imagePullSecrets来引用刚才创建的test-namespace下的test-secret
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: test-namespace
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: harbor.pwesports.net/kubernetes/nginx:latest 
    ports:
    - containerPort: 80
  imagePullSecrets:
- name: test-secret

# 查看pod
kubectl get pods -n test-namespace

可以看到nginx pod创建成功,不同pod的创建同理,实现了不同namespace下的资源隔离和权限控制。

三.kubectl patch实现自动关联

上面已经实现了不同namespace下用不同的secret去访问harbor私有仓库时的资源隔离和权限控制,但每次在创建pod时都需要通过imagePullSecrets字段引用相应namespace下的secret,这样显然不太方便,这里可以通过kubectl patch命令来将namespace和对应的secret相关联,避免繁琐。

以test-namespace与test-secret为例,关联的命令为:

kubectl patch serviceaccount default -n test-namespace -p '{"imagePullSecrets":[{"name":"test-secret"}]}'

# 查看详细信息:
kubectl get pod nginx -n test-namespace -o yaml

spec:
  containers:
  - image: harbor.pwesports.net/kubernetes/nginx:latest
    imagePullPolicy: Always
    name: nginx
    ports:
    - containerPort: 80
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-zwvwv
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  imagePullSecrets:
  - name: test-secret

这样,这个namespace下的所有pod在创建时都不需要指定secrets了。

参考文档:

https://kubernetes.io/zh/docs/concepts/configuration/secret/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#patch
https://docs.rackspace.com/docs/rkaas/v2.1.x/external/rkaas-userguide/configure-docker-registry
原文地址:https://www.cnblogs.com/even160941/p/15504870.html