如何从 IBM Cloud Delivery Pipeline (Tekton) 访问私有 Container Registry

How do I access a private Container Registry from IBM Cloud Delivery Pipeline (Tekton)

我正在尝试在我的一项任务中使用来自私有容器注册表的容器映像。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: echo-hello-world
spec:
  steps:
    - name: echo
      image: de.icr.io/reporting/status:latest
      command:
        - echo
      args:
        - "Hello World"

但是当我 运行 在 IBM Cloud Delivery Pipeline (Tekton) 中执行此任务时,无法拉取图像

 message: 'Failed to pull image "de.icr.io/reporting/status:latest": rpc error: code = Unknown desc = failed to pull and unpack image "de.icr.io/reporting/status:latest": failed to resolve reference "de.icr.io/reporting/status:latest": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized'

我阅读了几个教程和博客,但到目前为止找不到解决方案。这可能是我需要完成的,以便 IBM Cloud Delivery Pipeline (Tekton) 可以访问我的私有容器注册表:https://tekton.dev/vault/pipelines-v0.15.2/auth/#basic-authentication-docker

到目前为止,我已经在我的 .tekton 目录中创建了一个 secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
 name: basic-user-pass
 annotations:
   tekton.dev/docker-0: https://de.icr.io # Described below
type: kubernetes.io/basic-auth
stringData:
  username: $(params.DOCKER_USERNAME)
  password: $(params.DOCKER_PASSWORD)

我也在创建一个 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
 name: default-runner
secrets:
 - name: basic-user-pass

在我的触发器定义中,我告诉管道使用 default-runner ServiceAccount:

apiVersion: tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: theTemplateTrigger
spec:
  resourcetemplates:
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: pipelinerun-$(uid)
    spec:
      serviceAccountName: default-runner
      pipelineRef:
        name: hello-goodbye

您创建的秘密(类型 basic-auth)不允许 Kubelet 提取您的 Pods 图像。

doc mentions 这些秘密旨在在您的任务容器运行时内提供一些配置。然后可以在构建作业期间使用它,将图像拉或推到注册表。

虽然 Kubelet 需要 some different configuration(例如:键入 dockercfg),以便在拉取镜像/启动容器时进行身份验证。

我找到了将我的 API 密钥传递到我的 IBM Cloud Delivery Pipeline (Tekton) 的方法,我的管道中的任务现在能够从我的私有容器注册表中提取容器映像。

这是我的工作触发器模板:

apiVersion: tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: theTemplateTrigger
spec:
  params:
    - name: pipeline-dockerconfigjson
      description: dockerconfigjson for images used in .pipeline-config.yaml
      default: "eyJhdXRocyI6e319" # ie. {"auths":{}} base64 encoded
  resourcetemplates:
    - apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: $(tt.params.pipeline-dockerconfigjson)
      metadata:
        name: pipeline-pull-secret
      type: kubernetes.io/dockerconfigjson      
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: pipelinerun-$(uid)
      spec:
        pipelineRef:
          name: hello-goodbye
        podTemplate:
          imagePullSecrets:
            - name: pipeline-pull-secret

它首先定义了一个参数叫pipeline-dockerconfigjson:

  params:
    - name: pipeline-dockerconfigjson
      description: dockerconfigjson for images used in .pipeline-config.yaml
      default: "eyJhdXRocyI6e319" # ie. {"auths":{}} base64 encoded

第二部分将传递给这个参数的值变成Kubernetes secret:

    - apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: $(tt.params.pipeline-dockerconfigjson)
      metadata:
        name: pipeline-pull-secret
      type: kubernetes.io/dockerconfigjson

然后这个秘密被推送到 PodTemplate 的 imagePullSecrets 字段。

最后一步是用有效的 dockerconfigjson 填充参数,这可以在交付管道 UI (IBM Cloud UI) 中完成。

要为我的注册表创建一个有效的 dockerconfigjson de.icr.io,我必须使用以下 kubectl 命令:

kubectl create secret docker-registry mysecret \
 --dry-run=client \
 --docker-server=de.icr.io  \
 --docker-username=iamapikey \                     
 --docker-password=<MY_API_KEY> \
 --docker-email=<MY_EMAIL> \
 -o yaml

然后在输出中有一个有效的 base64 编码 .dockerconfigjson 字段。

另请注意,有一个 public 示例 tekton 任务目录: https://github.com/open-toolchain/tekton-catalog/tree/master/container-registry

有关 IBM Cloud 持续交付 Tekton 的更多信息: https://www.ibm.com/cloud/blog/ibm-cloud-continuous-delivery-tekton-pipelines-tools-and-resources

Tektonized 工具链模板:https://www.ibm.com/cloud/blog/toolchain-templates-with-tekton-pipelines