Tekton笔记(四)之Authentication及catalog skopeo

Authentication

如果在tekton中使用git或者docker需要用户名密码登录,需要怎么设置呢?

我们知道kubernetes中是使用Secret,使用volumes或者env将这个配置文件直接mount到pod中。

类似tekton也沿用了这一思路

Tekton Authentication

Tekton 可以直接使用了Kubernetes Secret定义的类型,处理Git和Docker登录

GitDocker
kubernetes.io/basic-auth
kubernetes.io/ssh-auth
kubernetes.io/basic-auth
kubernetes.io/dockercfg
kubernetes.io/dockerconfigjson

以下演示一个以docker basic-auth authentication为例的设置

  1. 先创建一个包含密码的Secret。并加上tektonannotations,这个非常重要。

    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绑定在PipelineRunTaskRun上,那么对整个PipelineTask都生效的

所有步骤不管有没有需要登录认证,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的镜像
    在这里插入图片描述

独立认证方式

这个使用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

    # kubectl create secret generic dockerhub-secret --from-file=/root/.docker/config.json
    
  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的镜像
    在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值