当前位置:首页 > 热点 > 多集群下的 Tekton 流水线

多集群下的 Tekton 流水线

2026-11-13 [培训资讯] 来源:人文荟萃网

1. 多集群构建 Tekton 的优势

借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。

上面是一张 Tekton 在多集群下的示意图。为什么 Tekton 需要多集群执行流水线?

随时可变的 Kubernetes 集群。单一的 Kubernetes 集群, 无法满足运维的要求, 不能随时对集群进行变更。多集群下, 可以下架部分集群进行维护。 更大规模的构建。CI 对 CPU、内存、IO 资源的消耗很大, 容易压垮节点甚至集群。多集群能有效分担负载压力,提高可用性。 业务隔离。业务对代码安全等级、构建速度、构建环境要求不一样, 多集群能够提供隔离的环境, 定制化的流水线服务。 2. Kubernetes Cluster Federation

Kubernetes Cluster Federation 简称 KubeFed。KubeFed v2 相较于 v1 最大的改变是将 API Server 移除, 并且通过 CRD 机制完成 Federated Resource 的扩展。KubeFed Controller 管理这些 CRD, 并实现同步 Resources 跨集群编排等功能,实现模块化和定制化。下面是社区的架构图:

KubeFed 配置了两种类型的信息:

Type configuration, 声明 KubeFed 处理的 API 类型 Cluster configuration, 声明 KubeFed 管理哪些集群

Type configuration 有三个基本概念:

Templates, 定义资源在集群中的模板描述 Placement, 定义资源需要分发到哪些集群 Overrides, 定义在集群中,需要覆盖 Templates 的字段内容

此外,通过 Status、Policy 和 Scheduling 可以实现更高级的功能:

Status 收集分发资源在各个集群中的状态 Policy 允许将资源分配给哪些集群的策略控制 Scheduling 允许资源跨集群迁移副本

除此,KubeFed 还提供了 MultiClusterDNS,可以用于多集群之间的服务发现。

3. 联邦化 Kubernetes 集群 3.1 准备集群并配置 Context

这里部署两个集群: dev1 作为主集群,用来作为 Tekton 的控制面,不运行流水线任务; dev2 作为子集群,用来执行 Tekton 流水线任务。

准备两个集群

主集群 dev1

kubectl get node  NAME    STATUS   ROLES                         AGE    VERSION node1   Ready    control-plane,master,worker   151m   v1.20.4  helm version  version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d41多集8ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"} 

子集群 dev2

kubectl get node  NAME    STATUS   ROLES                         AGE   VERSION node1   Ready    control-plane,master,worker   42d   v1.20.4 

在主集群上配置全部集群的 Context(要求集群 Apiserver 入口在一个网络,能够直连),用来添加子集群

这里 contexts 中的 name 不能含义 @ 等特殊字符, 否则 join 时会报错。因为 name 会用来创建 Secret, 需要符合 Kubernetes 的命名规范。

将主集群 dev1 的 kubeconfig 放在 ~/.kube/config-1,并修改 name 等信息,格式如下:

apiVersion: v1 clusters: - cluster:     ...   name: dev1.cluster.local contexts: - context:     cluster: dev1.cluster.local     user: dev1-kubernetes-admin   name: dev1-context users: - name: dev1-kubernetes-admin   user:     ... 

将子集群 dev2 的 kubeconfig 放在 ~/.kube/config-2,并修改 name 等信息,格式如下:

apiVersion: v1 clusters: - cluster:     ...   name: dev2.cluster.local contexts: - context:     cluster: dev2.cluster.local     user: dev2-kubernetes-admin   name: dev2-context user群下s: - name: dev2-kubernetes-admin   user:     ... 

合并 kubeconfig

cd $HOME/.kube/ KUBECONFIG=config-1:config-2 kubectl config view --flatten > $HOME/.kube/config 

查看添加的集群 Context

kubectl config get-contexts  CURRENT   NAME           CLUSTER              AUTHINFO                NAMESPACE           dev1-context   dev1.cluster.local   dev1-kubernetes-admin           dev2-context   dev2.cluster.local   dev2-kubernetes-admin 

切换到主集群 dev1

kubectl config use-context dev1-context  Switched to context "dev1-context".  3.2 在主集群上安装 KubeFed

使用 Helm 安装 KubeFed

git clone https://github.com/kubernetes-sigs/kubefed.git cd kubefed/charts/ helm install kubefed ./kubefed/ --namespace kube-federation-system --create-namespace 

查看负载

kubectl get deploy,pod -n kube-federation-system  NAME                  &的 nbsp;                      READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps/kubefed-admission-webhook    1/1     1            1           95s deployment.apps/kubefed-controller-manager   2/2     2            2           95s  NAME                                              READY   STATUS    RESTARTS   AGE pod/kubefed-admission-webhook-598bd776c6-gv4qh    1/1     Running   0          95s pod/kubefed-controller-manager-6d9bf98d74-n8kjz   1/1     Running   0          17s pod/kubefed-controller-manager-6d9bf98d74-nmb2Tej   1/1     Running   0          14s  3.3 在主集群上安装 kubefedctl

执行命令:

wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.8.0/kubefedctl-0.8.0-linux-amd64.tgz tar -zxvf kubefedctl-*.tgz mv kubefedctl /usr/local/bin/  3.4 添加集群

在主集群上执行命令, 将 dev1、dev2 都添加到主集群 dev1 上。

kubefedctl join dev1-context --host-cluster-context dev1-context --kubefed-namespace=kube-federation-system --v=2  I0625 14:32:42.969373   25920 join.go:861] Using secret named: dev1-context-dev1-context-token-2w8km I0625 14:32:42.972316   25920 join.go:934] Created secret in host cluster named: dev1-context-ln6vx I0625 14:32:42.991399   25920 join.go:299] Created federated cluster resource  kubefedctl join dev2-context --host-cluster-context dev1-context --kubefed-namespace=kube-federation-system --v=2  I0625 14:33:11.836472   26424 join.go:861] Using secret named: dev2-context-dev1-context-token-dcl8s I0625 14:33:11.840121   26424 join.go:934] Created secret in host cluster named: dev2-context-264dz I0625 14:33:11.898044  &nktbsp;26424 join.go:299] Created federated cluster resource 

查看集群列表:

kubectl -n kube-federation-system get kubefedclusters  NAME           AGE   READY dev1-context   45s   True dev2-context   16s   True  3.5 测试集群是否联邦成功 查看已经联邦化的资源

安装 KubeFed 之后,常见的很多资源都已经联邦化,可以在 CRD 中查看:

kubectl get crd |grep federated  federatedclusterroles.types.kubefed.io                2021-06-26T06:22:50Z federatedconfigmaps.types.kubefed.io                  2021-06-26T06:22:50Z federateddeployments.types.kubefed.io                 2021-06-26T06:22:50Z federatedingresses.types.kubefed.io                   2021-06-26T06:22:50Z federatedjobs.types.kubefed.io                        2021-06-26T06:22:50Z federatednamespaces.types.kubefed.io               &nonbsp;  2021-06-26T06:22:50Z federatedreplicasets.types.kubefed.io                 2021-06-26T06:22:50Z federatedsecrets.types.kubefed.io                     2021-06-26T06:22:50Z federatedserviceaccounts.types.kubefed.io             2021-06-26T06:22:50Z federatedservices.types.kubefed.io                    2021-06-26T06:22:50Z federatedservicestatuses.core.kubefed.io              2021-06-26T06:22:50Z federatedtypeconfigs.core.kubefed.io                  2021-06-26T06:22:50Z 

在 federatedtypeconfigs 中也可以看到已经开启联邦的资源。

kubectl get federatedtypeconfigs.core.kubefed.io -n kube-federation-system  NAME                                     AGE clusterroles.rbac.authorization.k8s.io   29m configmaps      & 流nbsp;                        29m deployments.apps                         29m ingresses.extensions                     29m jobs.batch                               29m namespaces                               29m replicasets.apps                         29m secrets                                  29m serviceaccounts                          29m services       &水线nbsp;                         29m  创建一个联邦的 Namespace

Namespace 级别的资源需要放置在联邦化的 Namespace 下,否则在进行资源分发时,Controller 会报错。

apiVersion: v1 kind: Namespace metadata:   name: testing-fed --- apiVersion: types.kubefed.io/v1beta1 kind: FederatedNamespace metadata:   name: testing-fed   namespace: testing-fed spec:   placement:     clusters:     - name: dev1-context     - name: dev2-context  在主集群创建一个联邦的 Deployment

常见的 Deployment 是这样:

apiVersion: apps/v1 kind: Deployment metadata:   name: nginx   namespace: default spec:   replicas: 1   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - image: nginx         name: nginx 

而联邦的 Deployment 是这样。

apiVersi多集on: types.kubefed.io/v1beta1 kind: FederatedDeployment metadata:   name: nginx-fed   namespace: testing-fed spec:   overrides:     - clusterName: dev1-context       clusterOverrides:         - path: /spec/replicas           value: 2     - clusterName: dev2-context       clusterOverrides:         - path: /spec/replicas           value: 3   placement:     clusters:       - name: dev1-context       - name: dev2-context   template:     metadata:       labels:         app: nginx       namespace: testing-fed     spec:       replicas: 1       selector:         matchLabels:          &n群下bsp;app: nginx       template:         metadata:           labels:             app: nginx         spec:           containers:             - image: nginx               name: nginx 

FederatedDeployment 编写时,需要注意三个字段

- overrides, 根据不同集群, 需要覆盖的字段属性。这里将 dev1 上的副本数改为 2,而将 dev2 上的副本数改为 3。

- placement, 资源需要放置的集群列表。这里放置在 dev1、dev2 两个集群。

- template, 资源的模板。这里是 Deployment 去掉 apiVersion 和 kind 的剩余部分。

验证资源是否分发成功

在 dev1 集群上

kubectl -n testing-fed get pod  NAME                         READY   STATUS    RESTARTS   AGE nginx-fed-6799fc88d8-7llk9   1/1     Running   0          8m2s nginx-fed-6799fc88d8-clc5w   1/1     Running   0          8m2s 

在 dev2 集群上

kubectl -n&nb的 sp;testing-fed get pod  NAME                         READY   STATUS    RESTARTS   AGE nginx-fed-6799fc88d8-2ld4k   1/1     Running   0          7m49s nginx-fed-6799fc88d8-6dncp   1/1     Running   0          7m49s nginx-fed-6799fc88d8-x64fb   1/1     Running   0          7m49s  4. 联邦化 Tekton 的 CRD 资源

4.1 安装 Tekton

在所有集群上都需要安装 Tekton

kubectl apply -f https://raw.githubusercontent.com/shaowenchen/scripts/main/image-sync/tektondev/dockerhub/release-0.24.1.yaml 

由于 Tekton 社区使用的是 gcr.io 的镜像, 有些主机环境上可能无法拉取。我在 Dockerhub 上对其进行了备份, 在这里可以找到相关的 yaml, https://github.com/shaowenchen/scripts/tree/main/image-sync/tektondev/dockerhub 。

4.2 联邦化 Tekton 的 CRD

安装 KubeFed 时, 会默认将常见的 Deployment、Secret 等联邦化, 但如果是用户自定义的 CRD 就需要手动开启。

执行命令:

kubefedctl enable clustertasks.tekton.dev kubefedctl enable conditions.tekton.dev kubefedctl enable pipelineresources.tekton.dev kubefedctl enable pipelineruns.tekton.dev kubefedctl enable pipelines.tekton.dev kubefTeedctl enable runs.tekton.dev kubefedctl enable taskruns.tekton.dev kubefedctl enable tasks.tekton.dev 

以 taskruns 为例, kubefedctl enable taskruns.tekton.dev 会自动创建两个资源:

customresourcedefinition.apiextensions.k8s.io/federatedtaskruns.types.kubefed.io, 联邦 CRD 资源 federatedtaskruns federatedtypeconfig.core.kubefed.io/taskruns.tekton.dev, 在 kube-federation-system 命名空间下, 创建 federatedtypeconfig 类型的资源 taskruns 开启资源分发使能

4.3 编辑新创建的联邦 CRD 资源添加字段

缺少这一步, 会导致同步到子集群的 CR 资源内容为空。因为 kubefedctl enable 联邦化 CRD 资源缺少 template 字段。

执行命令:

kubectl edit crd federatedtasks.types.kubefed.io 

在与 overrides 、placement 平级的层次,添加下面示例的 template 内容即可。

apiVersion: apiextensions.k8s.io/v1 ... spec:   versions:   - name: v1beta1     schema:       openAPIV3Schema:         properties:           spec:             properties:               overrides:                 ...               placement:                 ...    &nktbsp;          template:                 type: object                 x-kubernetes-preserve-unknown-fields: true             type: object 

如果觉得不够清晰,可以参考 https://github.com/shaowenchen/scripts/tree/main/image-sync/tektondev/kubefed 修改。如果你也是使用版本 0.24.1, 可以直接 kubectl apply 这些 CRD 资源。

4.4 测试多集群下分发 Tekton 对象

这里为了避免粘贴大量 yaml, 直接提前预先在子集群上创建 Task 资源, 而没有使用 FederatedTask 进行分发。

在子集群上创建 Task kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.4/git-clone.yaml -n testing-fed  在主集群 dev1 上创建 FederatedTaskRun 资源分发到子集群 dev2 apiVersion: types.kubefed.io/v1beta1 kind: FederatedTaskRun metadata:   name: git-clone-test   namespace: testing-fed spec:   placement:     clusters:     - name: dev2-context   template:     metadata:       namespace: testing-fed     spec:       workspaces:         - name: output         &nonbsp; emptyDir: {}       taskRef:         name: git-clone       params:         - name: url           value: https://github.com/kelseyhightower/nocode  在子集群 dev2 上查看 Tekton 的 Taskrun 任务 kubectl get taskrun -n testing-fed  NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME git-clone-test   True        Succeeded   15s         7s  5. 总结

本文主要介绍并实践了利用 KubeFed 管理多集群,对 Tekton CRD 资源进行联邦化。

多集群下的 Tekton,使用主集群管理资源,使用子集群执行流水线,能够有效均衡负载,增加流水线的并发执行量,提高 CICD 系统的可维护性。

这里的 KubeFed 主要是用来存储并分发 Tekton 对象资源。如果自研编码,可以通过数据存储加循环控制器完成,但是利用 KubeFed Controller 能快速实现,同时避免了很多潜在的问题。KubeFed 用于做跨集群的资源分发,非常适用。

6. 参考

https://github.com/kubernetes-sigs/kubefed

 

(责任编辑:组合优惠)

推荐文章
  • 标签: Gemini 3 Deep Think 谷歌 AI推理

    标签: Gemini 3 Deep Think 谷歌 AI推理 云梦级2月14日云梦级消息,谷歌北京时间 13 日晚间宣布对 Gemini 3 Deep Think 进行重大升级,号称是专门针对科学、研究与工程场景的开发的“推理模式”,旨在推动智能前沿发展。 据介...[详细]
  • 标签: 财政部 新能源汽车 车船税 纯电动商用车

    标签: 财政部 新能源汽车 车船税 纯电动商用车 云梦级7月3日云梦级消息,据央视新闻报道,财政部、税务总局、工业和信息化部今天(3日)联合发布公告,调整节能汽车、新能源汽车车船税优惠政策。 自2027年1月1日起,取消对节能汽车减半征收车船税政策,...[详细]
  • 阿里云宣布携手英伟达,布局具身智能与Physical AI

    阿里云宣布携手英伟达,布局具身智能与Physical AI 2025年杭州云栖大会上传来重磅消息:阿里云与英伟达宣布达成深度合作,共同进军 Physical AI(物理AI) 领域。此次合作旨在将人工智能技术与物理世界深度融合,加速具身智能和辅助驾驶等前沿应用...[详细]
  • 如何制定一个成功的数据科学培训计划

    如何制定一个成功的数据科学培训计划 数据科学家目前仍很短缺。一些公司通过设立培训计划以重新培训员工去担任数据科学职位,从而填补这一空缺。 那些知道如何帮助组织机构充分利用其信息资源的技术专业人员(尤其是数据科学家)目前需求量很大而供应短...[详细]
  • 月球探索新突破!AI 助力撞击坑研究,效率提升惊人

    月球探索新突破!AI 助力撞击坑研究,效率提升惊人 在全球科技迅速发展的今天,中国科学家正借助人工智能的力量,推动月球科学研究的新进展。近日,在2025中国国际大数据产业博览会上,中国科学院地球化学研究所正式发布了 “月球科学多模态专业大模型 V2.0...[详细]
  • 标签: 小红书 AI托管 虚假互动 内容治理

    标签: 小红书 AI托管 虚假互动 内容治理 云梦级3月10日云梦级消息,小红书今日发布针对AI托管运营账号的最新治理公告,宣布将严厉打击利用技术手段进行非真实内容创作及虚假互动的行为,违规账号最高将被直接予以封禁。 针对近期部分用户采用AI工具...[详细]
  • 标签: 亿咖通 路特斯 ECX LOT

    标签: 亿咖通 路特斯 ECX LOT 云梦级12月30日云梦级消息,全球出行科技企业ECARX亿咖通科技(纳斯达克股票代码:ECX)今日宣布,已于2025年12月23日与全球领先的智能豪华出行提供商路特斯科技(纳斯达克股票代码:LOT)签...[详细]
  • 为什么从第一天起就应该在 Kubernetes 上构建应用

    为什么从第一天起就应该在 Kubernetes 上构建应用 如果你正在从头开发一个新的项目,诸如一个新的 APP,服务或者网站,你主要的关注点通常不是如何在高可用的网络中大规模的运行它。相反,你可能会专注于为你的目标客户打造合适的产品或寻找适合市场的产品。如果...[详细]
  • 英国监管机构担忧云计算市场竞争,计划审查微软和亚马逊市场地位

    英国监管机构担忧云计算市场竞争,计划审查微软和亚马逊市场地位 英国竞争与市场管理局(CMA)近日对云计算市场的竞争状况表达了关切,并将微软和亚马逊定位为该市场的领军企业。CMA 在周二发布的声明中提到,其独立调查小组建议监管机构依据新出台的数字市场法规,对亚马逊...[详细]
  • Anthropic支付15亿美元和解版权诉讼 AI训练数据争议创纪录赔偿

    Anthropic支付15亿美元和解版权诉讼 AI训练数据争议创纪录赔偿 AI初创公司Anthropic近日同意支付至少15亿美元,以和解一起涉及50万本书籍的版权侵权诉讼。这一和解协议创下美国版权案件史上的最高金额记录,标志着AI行业与内容创作者之间版权争议的重要里程碑。...[详细]
热点阅读