天天看點

Tekton筆記(四)之Authentication及catalog skopeoAuthenticationskopeo參考:

Authentication

如果在tekton中使用git或者docker需要使用者名密碼登入,需要怎麼設定呢?

我們知道kubernetes中是使用

Secret

,使用

volumes

或者

env

将這個配置檔案直接mount到pod中。

類似tekton也沿用了這一思路

Tekton Authentication

Tekton 可以直接使用了Kubernetes

Secret

定義的類型,處理Git和Docker登入

Git Docker

kubernetes.io/basic-auth

kubernetes.io/ssh-auth

kubernetes.io/basic-auth

kubernetes.io/dockercfg

kubernetes.io/dockerconfigjson

以下示範一個以docker basic-auth authentication為例的設定

  1. 先建立一個包含密碼的

    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-

    開頭
  2. 建立

    ServiceAccount

    綁定這個

    Secret

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot
    secrets:
      - name: basic-user-pass
               
  3. 在運作配置中綁定這個

    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
               
  4. 最後執行即可
    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上操作。

集中認證方式

  1. 先建立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
    
               
  2. 建立

    ServiceAccount

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: secret-service-account
    secrets:
      - name: docker-creds
    # 這裡可以一次性綁定多個Secret,對應不同的repo
    #  - name: quay-creds
               
  3. 最後在

    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: {}
    
               
  4. 檢視運作結果
    # kubectl get taskrun
    NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
    skopeo-run       True        Succeeded   29m         29m
               
    docker hub已經有了

    tag:1

    的鏡像
    Tekton筆記(四)之Authentication及catalog skopeoAuthenticationskopeo參考:

獨立認證方式

這個使用

workspace

的方法,可能已經在其他地方看到過了

  1. 改造skopeo,增加一個

    workspace

    ,将

    dockerconfig

    挂載到HOME目錄
    # 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
               
  2. docker login

    手動登入産生

    /root/.docker/config.json

  3. config.json

    轉化成

    secret

  4. 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
    
               
  5. 檢視運作結果
    # kubectl get taskrun
    NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
    skopeo-run-mod   True        Succeeded   3m26s       3m13s
               
    docker hub已經有了

    tag:2

    的鏡像
    Tekton筆記(四)之Authentication及catalog skopeoAuthenticationskopeo參考:

一次修改多個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/