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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM