如何从 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
我正在尝试在我的一项任务中使用来自私有容器注册表的容器映像。
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