启用内置 Tekton Hub

概述

从 v4.6.4 开始,全新安装默认不再部署内置的 Tekton Hub。Tekton catalog 构件改由平台的独立 ArtifactHub 组件提供。ArtifactHub 拥有自己的生命周期,因此 catalog 更新(新工具、Task 修复、版本升级)可以快速交付,不受 operator 发布节奏的影响。

operator 仍完全支持将内置 Tekton Hub 作为过渡选项进行部署。本指南介绍如何启用它、新默认行为如何确保现有的 Tekton Hub 在 operator 升级期间继续工作,以及如何禁用它。

本节中的其他指南(例如 Tekton Hub 配置 和自定义 Catalog)均假设已按照本指南启用内置 Tekton Hub。

INFO

开关的默认值在 v4.6.4 中发生了变化。更早的 v4.6.x 版本(v4.6.0 – v4.6.3)会自动部署内置 Tekton Hub。将此类环境升级到 v4.6.4 后,现有的 Tekton Hub 会被保留(请参阅升级时的默认行为),而不会被删除。

开关的工作方式

operator 是否部署内置 Tekton Hub,由 operator 级别的开关控制:该开关是 tekton-operator 命名空间中 tekton-config-defaults ConfigMap 的 AUTOINSTALL_TEKTONHUB 键。其默认值为 "preserve"。

该开关有三种状态:

值含义全新安装升级(现有 Tekton Hub)
"preserve"(默认)仅观察:既不创建,也不删除。保留现有的 Tekton Hub,并等待其变为 Ready。不部署 Tekton Hub。保留现有的 Tekton Hub 并重用其 catalog。
"true"确保内置 Tekton Hub 存在(需要 profile: all;否则回退到 preserve)。部署 Tekton Hub。保留现有的 Tekton Hub。
"false"以破坏性方式删除任何现有的 Tekton Hub(仅可选择启用)。不部署 Tekton Hub。删除现有的 Tekton Hub。

未设置、为空或无法识别的值都会映射到 "preserve",因此拼写错误绝不会意外触发破坏性的 "false" 行为。

WARNING

"false" 会主动删除 TektonHub CR 及其工作负载。当开关为 "false" 时手动应用 TektonHub 清单并不能解决问题——operator 会再次将其删除。要部署内置 Tekton Hub,请先将开关设置为 "true"。

启用内置 Tekton Hub

将开关设置为 "true"。该值会注入 operator 的环境变量中,而环境变量不会热重载——更改 ConfigMap 后必须重启 operator pod。

# 1) Turn the switch on
$ kubectl -n tekton-operator patch configmap tekton-config-defaults \
    --type merge -p '{"data":{"AUTOINSTALL_TEKTONHUB":"true"}}'

# 2) Restart the operator so it re-reads the environment
$ kubectl -n tekton-operator delete pod -l name=tekton-operator

# 3) The operator creates the TektonHub CR for a profile=all TektonConfig shortly
#    after the restart. If the command below reports NotFound, the CR has not been
#    created yet — wait a moment and re-run it.
$ kubectl wait --for=condition=Ready tektonhub/hub --timeout=600s
NOTE

请使用 kubectl delete pod 而不是 kubectl rollout restart 重启 operator:在由 OLM 管理的集群上,OLM 会还原 rollout restart 在 Deployment 上设置的重启注解,因此 operator pod 永远不会被重新创建。删除 pod 在所有环境中都能生效。ConfigMap 本身的值不会被 OLM 还原。

升级时的默认行为

在默认值为 "preserve" 时,升级已运行内置 Tekton Hub 的环境(例如从 v4.6.3 → v4.6.4)无需执行任何操作:现有的 Tekton Hub 会被保留并继续提供其 catalog,因此 Task 和 Pipeline 引用会继续解析。保留和重用 catalog 都会自动进行:

  • TektonHub CR 以及所有内置 Tekton Hub 工作负载都会被保留,operator 会等待 hub 变为 Ready。
  • 导入 kube-public 命名空间的 catalog ConfigMaps(*-latest 工具镜像 ConfigMaps、概览模板 ConfigMaps、工具镜像 ConfigMaps 和邮件模板 ConfigMaps)会在 operator 的内部升级过程中保留,因此升级前提供的 catalog 就是升级后提供的 catalog。
  • 该环境当前运行的 catalog 镜像会被自动捕获并固定,因此升级不会将 catalog 切换到 registry 中可能不存在的工具镜像集(对于隔离网络安装尤其重要)。

只有当你使用 "true" 显式启用内置 Tekton Hub,并希望控制其使用的 catalog 镜像时,才需要执行下面固定 Catalog中的步骤。

将 Catalog 固定到升级前的镜像

operator bundle 不再提供 catalog 引用的工具镜像(buildah、golang、maven 等)。因此,新 catalog 引用的工具镜像版本可能不存在于你的环境中。对于隔离网络安装,这种情况尤其常见,因为新版本的镜像同步列表不再包含这些工具镜像。另一方面,你的升级前 catalog 引用的工具镜像可以保证存在,因为它们与上一版本一起完成了同步。

因此,在升级后重新启用内置 Tekton Hub 时,建议将 catalog 固定到升级前的 catalog 镜像,这样升级就不会影响现有 Pipeline。

步骤 1 — 升级前,记录当前的 catalog 镜像:

$ kubectl -n tekton-pipelines get deployment tekton-hub-api \
    -o jsonpath='{.spec.template.spec.initContainers[?(@.name=="catalog-sidecar")].image}'

步骤 2 — 升级后,按照上述说明启用开关,然后通过 TektonConfig CR 固定已记录的镜像:

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  profile: all
  hub:
    options:
      deployments:
        tekton-hub-api:                   # deployment name, must match exactly
          spec:
            template:
              spec:
                initContainers:
                  - name: catalog-sidecar # init container name, must match exactly
                    image: <catalog-image-recorded-before-the-upgrade>
WARNING

两个名称必须完全匹配,并且名称不匹配时的失败方式不同:不匹配的部署名称会被静默忽略,而不匹配的初始化容器名称不会覆盖 catalog-sidecar,而是向部署中添加一个新的初始化容器,这可能会导致 pod 无法启动。出于此目的,在 spec.hub 下除 options 之外的子字段均不受支持。

禁用内置 Tekton Hub

要移除已部署的内置 Tekton Hub,请将开关设置为 "false",并以相同方式重启 operator:

$ kubectl -n tekton-operator patch configmap tekton-config-defaults \
    --type merge -p '{"data":{"AUTOINSTALL_TEKTONHUB":"false"}}'

$ kubectl -n tekton-operator delete pod -l name=tekton-operator

随后,operator 会移除已部署的内置 Tekton Hub。当开关为 "false" 时:

  • TektonHub CR 和所有内置 Tekton Hub 工作负载都会被移除。TektonConfig CR 保持为 Ready。
  • 与 catalog 一起导入 kube-public 命名空间的概览模板 ConfigMaps 会随 Tekton Hub 一起被移除。
  • kube-public 命名空间中的工具镜像 ConfigMaps(catalog-tool-image-*)和邮件模板 ConfigMaps 会被保留。它们会继续指向升级前的工具镜像地址,而这些地址存在于你的 registry 中。
WARNING

"false" 具有破坏性,并且需要显式启用。如果你只是希望停止部署新的 Tekton Hub,同时保持任何现有实例不变,请改用默认的 "preserve",不要设置 "false"。