为 Task 镜像 selector 添加自定义镜像

本指南介绍如何为 UI 中 Task 表单的 image 参数配置 selector 选项,涵盖以下两种场景:

  • hub Tasks 添加镜像
  • 您自己的命名空间 Tasks 添加镜像

目录

功能概述

  • 每个 selector 选项来自一个带有 data.name(标签)和 data.image(值)的 ConfigMap
  • 任务特定标签(例如 catalog.tekton.dev/tool-image-python)使 UI 能将 ConfigMaps 与正确的 Task 参数匹配。
  • UI 会使用 Task 注解中指定的命名空间(例如 kube-public),并根据 Task 描述符中定义的标签选择器查询该命名空间,然后用查询结果渲染 selector。

使用场景

  • Task selector 添加自定义的镜像仓库镜像。
  • 在现有 selector 选项旁引入新的运行时小版本。
  • 为自定义 Task 提供加固镜像选项。

前提条件

  • 已安装 Tekton Pipelines。
  • 您可以在 kube-public 中创建 ConfigMaps
  • 您可以在目标 Task 上设置 style.tekton.dev/descriptorsHub Tasks 已提供该设置;自定义 Tasks 需要您自行添加)。

场景 A:为 Hub Task selector 添加镜像

当扩展 Hub Task 的 selector 时,请使用此路径。

1. 从 Task 描述符中查找标签选择器

定位 Task 上的 style.tekton.dev/descriptors 注解,找到 path 指向 image 参数的条目。

urn:alm:descriptor:expression:props.options:api 结尾的描述符包含 labelSelector=... 查询;该标签键必须存在于您的 ConfigMap 中。

以下示例中,您需要在 kube-public 命名空间创建带有 catalog.tekton.dev/tool-image-python 标签的 ConfigMap

kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          ...
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python
          ...

有关 style.tekton.dev/descriptors 的更多信息,请参见 如何配置动态表单

2. 在 kube-public 中创建 ConfigMap

使用该标签键创建一个 ConfigMap

默认 Tasks 会附带带有 catalog.tekton.dev/source: system 标签的 ConfigMaps,表示平台提供的条目。请勿修改或删除这些,且您的自定义 ConfigMaps 不应包含此标签。

apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-task-python-custom
  namespace: kube-public
  labels:
    catalog.tekton.dev/tool-image-python: "3.10"
data:
  name: "Python 3.10"
  image: "registry.example.com/tekton/python:3.10"

3. 应用并验证

kubectl apply -f tekton-task-python-custom.yaml
# configmap/tekton-task-python-custom created

kubectl -n kube-public get configmap -l catalog.tekton.dev/tool-image-python=3.10
# NAME                             DATA   AGE
# tekton-task-python-custom        2      15s

打开 Task 表单;selector 现在应包含 Python 3.10,并将镜像设置为 registry.example.com/tekton/python:3.10

场景 B:为您自己的 Task selector 添加镜像

当您控制 Task 定义且需要配置描述符及 ConfigMaps 时,请使用此路径。

1. 在 Task 上配置 style.tekton.dev/descriptors

示例 image selector 的 Task 描述符:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          - urn:alm:descriptor:label:en:PYTHON_IMAGE
          - urn:alm:descriptor:description:en:The used Python image.
          - urn:alm:descriptor:com.tectonic.ui:select:image
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom
          - urn:alm:descriptor:props:select:allowCreate
          - urn:alm:descriptor:expression:props.options:path:items
          - urn:alm:descriptor:expression:props.options:label:path:data.name
          - urn:alm:descriptor:expression:props.options:value:path:data.image
          - urn:alm:descriptor:com.tectonic.ui:validation:required
spec:
  params:
    - name: PYTHON_IMAGE
      description: Image used for Python steps.
      type: string
  steps:
    - name: python-script
      image: $(params.PYTHON_IMAGE)
      script: |
        #!/bin/sh
        # Define your task script

描述符条目及含义:

描述符条目作用示例备注
path指向作为 selector 渲染的参数params.PYTHON_IMAGE
urn:alm:descriptor:label:en表单中显示的英文字段标签PYTHON_IMAGE
urn:alm:descriptor:description:en字段的英文帮助文本The used Python image.
urn:alm:descriptor:com.tectonic.ui:select:image将字段渲染为镜像选择器无需更改
urn:alm:descriptor:expression:props.options:api获取 selector 选项的 API(命名空间 + 标签选择器)/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom示例中从 kube-public 命名空间获取带有 catalog.tekton.dev/tool-image-python-custom 标签的 ConfigMaps。
urn:alm:descriptor:props:select:allowCreate允许除 selector 选项外的手动输入
urn:alm:descriptor:expression:props.options:path指向 API 响应中的列表路径urn:alm:descriptor:expression:props.options:path:items示例中使用 List API,因此值来自 items
urn:alm:descriptor:expression:props.options:label:path从条目中读取 selector 显示文本urn:alm:descriptor:expression:props.options:label:path:data.name示例中值来自 ConfigMapdata.name
urn:alm:descriptor:expression:props.options:value:path从条目中读取 selector 值(镜像)urn:alm:descriptor:expression:props.options:value:path:data.image示例中值来自 ConfigMapdata.image
urn:alm:descriptor:com.tectonic.ui:validation:required标记字段为必填

有关 style.tekton.dev/descriptors 的更多信息,请参见 如何配置动态表单

2. 在 kube-public 中创建匹配的 ConfigMap

使用与描述符查询相同的标签键。对于自定义 Tasks,建议使用不会与默认 Task selector 冲突的标签键,以避免在 Hub Tasks 中意外显示。

默认 Tasks 会附带带有 catalog.tekton.dev/source: system 标签的 ConfigMaps,表示平台提供的条目。请勿修改或删除这些,且您的自定义 ConfigMaps 不应包含此标签。

apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-task-python-3-13
  namespace: kube-public
  labels:
    catalog.tekton.dev/tool-image-python-custom: "3.13-team"
data:
  name: "Python 3.13 (Team Edition)"
  image: "registry.example.com/internal/python:3.13"

您也可以将 ConfigMap 放置在您喜欢的其他命名空间;只需确保 ConfigMap 的命名空间与 Taskstyle.tekton.dev/descriptors 注解中指定的命名空间相同。 例如,您可以将 Task 的注解设置如下,请将 <NAMESPACE> 替换为您的命名空间。

kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    # replace <NAMESPACE> with your namespace
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          ...
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/<NAMESPACE>/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom
          ...

3. 应用并验证

kubectl apply -f custom-task-python-3-13.yaml
# configmap/custom-task-python-3-13 created

kubectl -n kube-public get configmap -l catalog.tekton.dev/tool-image-python-custom=3.13-team
# NAME                             DATA   AGE
# custom-task-python-3-13          2      15s

打开您的 Task 表单;selector 应列出 Python 3.13 (Team Edition),并将镜像设置为 registry.example.com/internal/python:3.13

维护提示

  • 通过编辑并重新应用其 ConfigMap 来更新自定义选项。
  • 通过删除您自定义的 ConfigMap 来废弃选项;请勿修改任何带有 catalog.tekton.dev/source: system 标签的 ConfigMap