一.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