使用 Tektoncd Operator 管理 Tekton 组件
作者:阳明 2022-07-27 07:39:45云计算云原生 Tektoncd Operator 是一个 Kubernetes 的扩展,用于在 Kubernetes 集群上安装、升级和管理 TektonCD Pipelines、Dashboard、Triggers 等。我们只需要编写各个组件的 yaml 就可以直接来管理 Tekton 的各种组件。
Tektoncd Operator是一个 Kubernetes 的扩展,用于在 Kubernetes 集群上安装、升级和管理 TektonCD Pipelines、Dashboard、Triggers 等。我们只需要编写各个组件的 yaml 就可以直接来管理 Tekton 的各种组件。
CRD | 描述 |
TektonConfig | 配置要安装和管理的 Tekton 组件。 |
TektonPipeline | 配置安装管理 Tekton Pipeline 组件。 |
TektonTrigger | 配置安装管理 Tekton Trigger 组件。 |
TektonDashboard | 配置安装管理 Tekton Dashboard 组件。 |
TektonResult | 配置安装管理 Tekton Result 组件。 |
TektonAddon | 配置安装管理插件,目前仅支持 Openshift。 |
安装
安装 Tektoncd Operator 有多种方式。
从 Operator Hub 安装
可以直接前往 Operator Hub 页面 https://operatorhub.io/operator/tektoncd-operator 进行安装,其生命周期将由Operator Lifecycle Manager (OLM)进行管理。
使用资源清单文件安装
可以直接从 Github Release 页面 https://github.com/tektoncd/operator/releases 获取资源清单文件,使用这种方式安装,需要自己管理 Operator 的生命周期。
直接使用下面的命令进行安装即可。
$kubectlapply-fhttps://storage.googleapis.com/tekton-releases/operator/latest/release.yaml
由于官方使用的镜像是gcr的镜像,所以正常情况下我们是获取不到的,如果你的集群由于某些原因获取不到镜像,可以使用下面的资源清单文件:
$kubectlapply-fhttps://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/operator/release.v0.60.0.yml
默认情况下 Tektoncd Operator 创建的对象会使用 gcr 的镜像,比如 Tekton Pipelines 控制器的镜像,可以通过环境变量IMAGE_PIPELINES_TEKTON_PIPELINES_CONTROLLER来指定对应的镜像,如下所示的环境变量是覆盖默认的 gcr 镜像的配置方式:
-name: IMAGE_PIPELINES_PROXYvalue: cnych/tekton-operator-proxy-webhook:v0.60.0-name: IMAGE_JOB_PRUNER_TKNvalue: cnych/tekton-operator-pruner-tkn:v0.60.0-name: IMAGE_PIPELINES_TEKTON_PIPELINES_CONTROLLERvalue: cnych/tekton-controller:v0.37.2-name: IMAGE_PIPELINES_WEBHOOKvalue: cnych/tekton-webhook:v0.37.2-name: IMAGE_PIPELINES_ARG__ENTRYPOINT_IMAGEvalue: cnych/tekton-entrypoint:v0.37.2-name: IMAGE_PIPELINES_ARG__GIT_IMAGEvalue: cnych/tekton-git-init:v0.37.2-name: IMAGE_PIPELINES_ARG__IMAGEDIGEST_EXPORTER_IMAGEvalue: cnych/tekton-imagedigestexporter:v0.37.2-name: IMAGE_PIPELINES_ARG__KUBECONFIG_WRITER_IMAGEvalue: cnych/tekton-kubeconfigwriter:v0.37.2-name: IMAGE_PIPELINES_ARG__NOP_IMAGEvalue: cnych/tekton-nop:v0.37.2-name: IMAGE_TRIGGERS_TEKTON_TRIGGERS_CONTROLLERvalue: cnych/tekton-triggers-controller:v0.20.1-name: IMAGE_TRIGGERS_WEBHOOKvalue: cnych/tekton-triggers-webhook:v0.20.1-name: IMAGE_TRIGGERS_TEKTON_TRIGGERS_CORE_INTERCEPTORSvalue: cnych/tekton-triggers-interceptors:v0.20.1-name: IMAGE_TRIGGERS_ARG__EL_IMAGEvalue: cnych/tekton-triggers-eventlistenersink:v0.20.1
上面的方式会创建一个名为tekton-operator的命名空间,其中包含一个 Operator 和一个 Webhook 的 Pod:
$kubectlgetpods-ntekton-operatorNAMEREADYSTATUSRESTARTSAGEtekton-operator-9d747548b-67t7m2/2Running09m42stekton-operator-webhook-6cc769b85d-fssq91/1Running09m42s
安装 Operator 后,就可以安装所需的 Tekton 组件,例如 Tekton Pipeline、Tekton Triggers。
每个 Tekton 组件都有一个自定义资源,用于安装和管理组件。
$kubectlgetcrd|greptekton|grepoperatortektonchains.operator.tekton.dev2022-07-25T00:51:07Ztektonconfigs.operator.tekton.dev2022-07-25T00:51:07Ztektondashboards.operator.tekton.dev2022-07-25T00:51:07Ztektonhubs.operator.tekton.dev2022-07-25T00:51:07Ztektoninstallersets.operator.tekton.dev2022-07-25T00:51:07Ztektonpipelines.operator.tekton.dev2022-07-25T00:51:07Ztektonresults.operator.tekton.dev2022-07-25T00:51:07Ztektontriggers.operator.tekton.dev2022-07-25T00:51:07Z
其中TektonConfig是创建其他组件的顶级 CRD。所以我们只需创建具有所需配置的TektonConfig对象即可,它将会帮助我们安装相应的其他组件。
TektonConfig将根据传递给它的配置文件创建TektonPipeline、TektonTriggers和其他组件 CR 对象,其中有一个profile的字段,可以用于确定要安装的所有组件。
Tektoncd Operator 内置了 3 个profile:lite、all、basic。
all:此配置文件将安装所有组件。basic:此配置文件将仅安装 TektonPipeline 和 TektonTrigger 组件。lite:此配置文件将仅安装 TektonPipeline 组件。比如我们要安装 pipelines、triggers 和 dashboard,可以使用all这个profile进行安装,如下资源清单所示:
#tekton-operator-profile-all.yamlapiVersion: operator.tekton.dev/v1alpha1kind: TektonConfigmetadata:name: configspec:profile: alltargetNamespace: tekton-pipelinespruner:resources:-pipelinerun-taskrunkeep: 100schedule: "0 8 * * *"
其中targetNamespace用来指定安装 Tekton 组件的命名空间,默认为tekton-pipelines,pruner为 Tekton 资源提供自动清理功能。
resources:指定可以自动清理的资源。keep:清理时要保留的最大资源数。schedule:清理资源的频率。直接安装上面的资源对象即可:
$kubectlapply-ftekton-operator-profile-all.yaml$kubectlgettektonconfigNAMEVERSIONREADYREASONconfigv0.60.0True
上面的TektonConfig对象我们配置的profile为all,会自动为我们创建tektonpipelines、tektontriggers、tektondashboard组件对象:
$kubectlgettektonpipelinesNAMEVERSIONREADYREASONpipelinev0.37.0True$kubectlgettektontriggersNAMEVERSIONREADYREASONtriggerv0.20.1True$kubectlgettektondashboardNAMEVERSIONREADYREASONdashboardv0.27.0True
上面的这几个 cr 对象创建后就会自动创建对应的组件,如下所示:
$kubectlgetpods-ntekton-pipelinesNAMEREADYSTATUSRESTARTSAGEtekton-dashboard-84dc6f966b-g8flx0/1ImagePullBackOff03m48stekton-operator-proxy-webhook-7587596c79-ld8vm1/1Running030mtekton-pipelines-controller-78bc48896b-sd9fk1/1Running030mtekton-pipelines-webhook-5f48c855b4-js54q1/1Running030mtekton-triggers-controller-668b94cb5b-ggbk71/1Running027mtekton-triggers-core-interceptors-66b7ddd78c-pq7gb1/1Running027mtekton-triggers-webhook-c8fd7755d-rknch1/1Running027m
由于 dashboard 组件的镜像没有对应的覆盖的环境变量,所以需要我们手动进行修改:
$kubectleditdeploytekton-dashboard-ntekton-pipelines......image: cnych/tekton-dashboard:v0.28.0......
Dashboard 的服务默认通过 ClusterIP 方式进行暴露,我们可以手动创建一个 Ingress 对象或者修改 Service 为 NodePort 方式进行暴露。
$kubectlgetsvc-ntekton-pipelinesNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEtekton-dashboardClusterIP10.102.221.101<none>9097/TCP28mtekton-operator-proxy-webhookClusterIP10.96.175.155<none>443/TCP33mtekton-pipelines-controllerClusterIP10.99.0.85<none>9090/TCP,8008/TCP,8080/TCP33mtekton-pipelines-webhookClusterIP10.106.195.14<none>9090/TCP,8008/TCP,443/TCP,8080/TCP33mtekton-triggers-controllerClusterIP10.99.84.154<none>9000/TCP30mtekton-triggers-core-interceptorsClusterIP10.97.83.136<none>8443/TCP30mtekton-triggers-webhookClusterIP10.108.88.140<none>443/TCP30m
测试
Tekon 的组件安装完成后,接下来我们来运行一个简单的 Pipeline。
首先创建一个如下所示的 Task 任务,下面的任务中会在 bash 容器中去执行echo “Hello, world!”的命令。
#hello-task.yamlapiVersion: tekton.dev/v1beta1kind: Taskmetadata:name: hellospec:steps:-name: helloimage: bash:latestcommand:-echoargs:-"Hello, world!"
用同样的方式再创建一个goodbye的任务,只需要将上面的 echo 内容修改为goodbye即可。
然后就可以定义一个 Pipeline 流水线了,如下所示:
#hello-goodbye-pipeline.yamlapiVersion: tekton.dev/v1beta1kind: Pipelinemetadata:name: hello-goodbye-pipelinespec:tasks:-name: hellotaskRef:name: hello-name: goodbyerunAfter:-hellotaskRef:name: goodbye
通过taskRef引用对应的 Task 对象。
直接创建上面的资源对象即可:
$kubectlgetpipelineNAMEAGEhello-goodbye-pipeline24s$kubectlgettaskNAMEAGEgoodbye101shello107s
要执行该流水线,我们还需要创建一个PipelineRun的对象才会真正执行。
#hello-goodbye-pipeline-run.yamlapiVersion: tekton.dev/v1beta1kind: PipelineRunmetadata:generateName: hello-goodbye-pipeline-spec:pipelineRef:name: hello-goodbye-pipeline
创建上面的资源即可,需要注意我们这里使用的generateName属性,需要使用kubectl create命令进行创建。正常创建后很快就会按照上面 Pipeline 的描述去执行两个任务了。
要想卸载 Tekton 我们也只需要将定义的TektonConfig对象删除即可。
如果不想使用 TektonCD Operator 内置的几个profile,我们也可以自己手动去分别配置不同组件的 CR 实例,另外 TektonCD Operator 现阶段提供的可配置方式并不多,特别是对于国内用户来说镜像这个老大难的问题,只能通过环境变量去全局覆盖 Operator,还有部分镜像压根没有覆盖,如果是在国内使用并且不能使用 gcr 镜像的话可能体验就不是那么顺畅了。