Authentication
如果在tekton中使用git或者docker需要使用者名密碼登入,需要怎麼設定呢?
我們知道kubernetes中是使用
Secret
,使用
volumes
或者
env
将這個配置檔案直接mount到pod中。
類似tekton也沿用了這一思路
Tekton Authentication
Tekton 可以直接使用了Kubernetes
Secret
定義的類型,處理Git和Docker登入
Git | Docker |
---|---|
| |
以下示範一個以docker basic-auth authentication為例的設定
- 先建立一個包含密碼的
。并加上Secret
的tekton
,這個非常重要。annotations
apiVersion: v1 kind: Secret metadata: name: basic-user-pass annotations: tekton.dev/docker-0: https://gcr.io # Described below type: kubernetes.io/basic-auth stringData: username: <cleartext username> password: <cleartext password>
必須要是要以annotations
開頭tekton.dev/docker-
- 建立
綁定這個ServiceAccount
Secret
apiVersion: v1 kind: ServiceAccount metadata: name: build-bot secrets: - name: basic-user-pass
- 在運作配置中綁定這個
如ServiceAccount
TaskRun
再如apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: build-push-task-run-2 spec: serviceAccountName: build-bot taskRef: name: build-push
PipelineRun
apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: demo-pipeline namespace: default spec: serviceAccountName: build-bot pipelineRef: name: demo-pipeline
- 最後執行即可
kubectl apply --filename secret.yaml serviceaccount.yaml run.yaml
至于具體發生了什麼,其實就是tekton自動将
Secret
mount到了HOME目錄,原理跟kubernetes是相似的。
其中的關鍵的關鍵就是
Secret
中的這個
annotations
,必須是
tekton.dev/git-
or
tekton.dev/docker-
開頭
tekton就是根據這個
annotations
,判斷對應是docker還是git,找到對應的使用者名密碼。
避免全局使用credentials
細心的讀者會發現
serviceAccount
綁定在
PipelineRun
或
TaskRun
上,那麼對整個
Pipeline
或
Task
都生效的
所有步驟不管有沒有需要登入認證,pod裡都會有credentials
如果想避免這裡情況,那麼就不能用上文所述的這種做法了。
一個變通的辦法是單獨将不同的
Secret
放到不同的
workspace
中,
對應的
task
可以根據需要挂載一個或者多個
workspace
使用credentials。
skopeo
接下來我們實際使用skopeo示範這兩種認證方法
skopeo是一個給docker image打标簽的工具,不需要把鏡像完整拖下來,直接在registry上操作。
集中認證方式
- 先建立docker登入Secret,注意annotations中定義了對應docker.io這個倉庫
apiVersion: v1 kind: Secret metadata: name: docker-creds annotations: tekton.dev/docker-0: https://docker.io type: kubernetes.io/basic-auth stringData: username: massivezh password: xxxx-xxxx-xxxx-xxxx-xxxx
- 建立
ServiceAccount
apiVersion: v1 kind: ServiceAccount metadata: name: secret-service-account secrets: - name: docker-creds # 這裡可以一次性綁定多個Secret,對應不同的repo # - name: quay-creds
- 最後在
中綁定TaskRun
serviceAccountName
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: skopeo-run spec: serviceAccountName: secret-service-account params: - name: srcImageURL value: docker://docker.io/massivezh/kaniko-nocode:latest - name: destImageURL value: docker://docker.io/massivezh/kaniko-nocode:1 taskRef: name: skopeo-copy workspaces: - name: images-url emptyDir: {}
- 檢視運作結果
docker hub已經有了# kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME skopeo-run True Succeeded 29m 29m
的鏡像tag:1
獨立認證方式
這個使用
workspace
的方法,可能已經在其他地方看到過了
- 改造skopeo,增加一個
,将workspace
挂載到HOME目錄dockerconfig
# diff -u skopeo-copy.yaml workspaces-cred/skopeo-copy-mod.yaml --- skopeo-copy.yaml 2022-09-18 11:30:18.692333792 +0800 +++ workspaces-cred/skopeo-copy-mod.yaml 2022-09-18 11:53:23.459643040 +0800 @@ -22,6 +22,10 @@ workspaces: - name: images-url + - name: dockerconfig + description: Includes a docker `config.json` + optional: true + mountPath: /tekton/home/.docker
-
手動登入産生docker login
/root/.docker/config.json
- 将
轉化成config.json
secret
- 在
中設定TaskRun
workspaces
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: skopeo-run-mod spec: params: - name: srcImageURL value: docker://docker.io/massivezh/kaniko-nocode:latest - name: destImageURL value: docker://docker.io/massivezh/kaniko-nocode:2 taskRef: name: skopeo-copy-mod workspaces: - name: images-url emptyDir: {} - name: dockerconfig secret: secretName: dockerhub-secret
- 檢視運作結果
docker hub已經有了# kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME skopeo-run-mod True Succeeded 3m26s 3m13s
的鏡像tag:2
一次修改多個tag
前面說的都是一次隻打一個tag,如果需要批量處理打tag,需要設定
images-url
這個參數
首先建立一個
configmap
,裡面對應的檔案名必須是
url.txt
把需要修改的tag清單全部寫在這裡面
#cat url.txt
docker://quay.io/temp/kubeconfigwriter:v1 docker://quay.io/skopeotest/kube:v1
docker://quay.io/temp/kubeconfigwriter:v2 docker://quay.io/skopeotest/kube:v2
kubectl create configmap image-configmap --from-file=url.txt
預設一次隻處理一個,這個值是空的
workspaces:
- name: images-url
emptyDir: {}
我們替換成
configmap
包含
url.txt
檔案
workspaces:
- name: images-url
configmap:
name: image-configmap
運作過程中這個
url.txt
會mount到pod裡供skopeo使用。
參考:
https://hub.tekton.dev/tekton/task/skopeo-copy
https://github.com/tektoncd/catalog/tree/main/task/skopeo-copy/0.2
https://tekton.dev/docs/pipelines/auth/