多集群下的 Tekton 流水线

多集群下的 Tekton 流水线

作者:陈少文 2021-06-26 14:22:34

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

[[407477]]

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

  1. kubectl get node 
  2.  
  3. NAME    STATUS   ROLES                         AGE    VERSION 
  4. node1   Ready    control-plane,master,worker   151m   v1.20.4 
  1. helm version 
  2.  
  3. version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"

子集群 dev2

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

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

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

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

  1. apiVersion: v1 
  2. clusters: 
  3. - cluster: 
  4.     ... 
  5.   name: dev1.cluster.local 
  6. contexts: 
  7. - context: 
  8.     cluster: dev1.cluster.local 
  9.     user: dev1-kubernetes-admin 
  10.   name: dev1-context 
  11. users: 
  12. name: dev1-kubernetes-admin 
  13.   user
  14.     ... 

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

  1. apiVersion: v1 
  2. clusters: 
  3. - cluster: 
  4.     ... 
  5.   name: dev2.cluster.local 
  6. contexts: 
  7. - context: 
  8.     cluster: dev2.cluster.local 
  9.     user: dev2-kubernetes-admin 
  10.   name: dev2-context 
  11. users: 
  12. name: dev2-kubernetes-admin 
  13.   user
  14.     ... 

合并 kubeconfig

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

查看添加的集群 Context

  1. kubectl config get-contexts 
  2.  
  3. CURRENT   NAME           CLUSTER              AUTHINFO                NAMESPACE 
  4.           dev1-context   dev1.cluster.local   dev1-kubernetes-admin 
  5.           dev2-context   dev2.cluster.local   dev2-kubernetes-admin 

切换到主集群 dev1

  1. kubectl config use-context dev1-context 
  2.  
  3. Switched to context "dev1-context"

3.2 在主集群上安装 KubeFed

使用 Helm 安装 KubeFed

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

查看负载

  1. kubectl get deploy,pod -n kube-federation-system 
  2.  
  3. NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE 
  4. deployment.apps/kubefed-admission-webhook    1/1     1            1           95s 
  5. deployment.apps/kubefed-controller-manager   2/2     2            2           95s 
  6.  
  7. NAME                                              READY   STATUS    RESTARTS   AGE 
  8. pod/kubefed-admission-webhook-598bd776c6-gv4qh    1/1     Running   0          95s 
  9. pod/kubefed-controller-manager-6d9bf98d74-n8kjz   1/1     Running   0          17s 
  10. pod/kubefed-controller-manager-6d9bf98d74-nmb2j   1/1     Running   0          14s 

3.3 在主集群上安装 kubefedctl

执行命令:

  1. wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.8.0/kubefedctl-0.8.0-linux-amd64.tgz 
  2. tar -zxvf kubefedctl-*.tgz 
  3. mv kubefedctl /usr/local/bin/ 

3.4 添加集群

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

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

查看集群列表:

  1. kubectl -n kube-federation-system get kubefedclusters 
  2.  
  3. NAME           AGE   READY 
  4. dev1-context   45s   True 
  5. dev2-context   16s   True 

3.5 测试集群是否联邦成功

  • 查看已经联邦化的资源

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

  1. kubectl get crd |grep federated 
  2.  
  3. federatedclusterroles.types.kubefed.io                2021-06-26T06:22:50Z 
  4. federatedconfigmaps.types.kubefed.io                  2021-06-26T06:22:50Z 
  5. federateddeployments.types.kubefed.io                 2021-06-26T06:22:50Z 
  6. federatedingresses.types.kubefed.io                   2021-06-26T06:22:50Z 
  7. federatedjobs.types.kubefed.io                        2021-06-26T06:22:50Z 
  8. federatednamespaces.types.kubefed.io                  2021-06-26T06:22:50Z 
  9. federatedreplicasets.types.kubefed.io                 2021-06-26T06:22:50Z 
  10. federatedsecrets.types.kubefed.io                     2021-06-26T06:22:50Z 
  11. federatedserviceaccounts.types.kubefed.io             2021-06-26T06:22:50Z 
  12. federatedservices.types.kubefed.io                    2021-06-26T06:22:50Z 
  13. federatedservicestatuses.core.kubefed.io              2021-06-26T06:22:50Z 
  14. federatedtypeconfigs.core.kubefed.io                  2021-06-26T06:22:50Z 

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

  1. kubectl get federatedtypeconfigs.core.kubefed.io -n kube-federation-system 
  2.  
  3. NAME                                     AGE 
  4. clusterroles.rbac.authorization.k8s.io   29m 
  5. configmaps                               29m 
  6. deployments.apps                         29m 
  7. ingresses.extensions                     29m 
  8. jobs.batch                               29m 
  9. namespaces                               29m 
  10. replicasets.apps                         29m 
  11. secrets                                  29m 
  12. serviceaccounts                          29m 
  13. services                                 29m 
  • 创建一个联邦的 Namespace

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

  1. apiVersion: v1 
  2. kind: Namespace 
  3. metadata: 
  4.   name: testing-fed 
  5. --- 
  6. apiVersion: types.kubefed.io/v1beta1 
  7. kind: FederatedNamespace 
  8. metadata: 
  9.   name: testing-fed 
  10.   namespace: testing-fed 
  11. spec: 
  12.   placement: 
  13.     clusters: 
  14.     - name: dev1-context 
  15.     - name: dev2-context 
  • 在主集群创建一个联邦的 Deployment

常见的 Deployment 是这样:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: nginx 
  5.   namespace: default 
  6. spec: 
  7.   replicas: 1 
  8.   selector: 
  9.     matchLabels: 
  10.       app: nginx 
  11.   template: 
  12.     metadata: 
  13.       labels: 
  14.         app: nginx 
  15.     spec: 
  16.       containers: 
  17.       - image: nginx 
  18.         name: nginx 

而联邦的 Deployment 是这样。

  1. apiVersion: types.kubefed.io/v1beta1 
  2. kind: FederatedDeployment 
  3. metadata: 
  4.   name: nginx-fed 
  5.   namespace: testing-fed 
  6. spec: 
  7.   overrides: 
  8.     - clusterName: dev1-context 
  9.       clusterOverrides: 
  10.         - path: /spec/replicas 
  11.           value: 2 
  12.     - clusterName: dev2-context 
  13.       clusterOverrides: 
  14.         - path: /spec/replicas 
  15.           value: 3 
  16.   placement: 
  17.     clusters: 
  18.       - name: dev1-context 
  19.       - name: dev2-context 
  20.   template: 
  21.     metadata: 
  22.       labels: 
  23.         app: nginx 
  24.       namespace: testing-fed 
  25.     spec: 
  26.       replicas: 1 
  27.       selector: 
  28.         matchLabels: 
  29.           app: nginx 
  30.       template: 
  31.         metadata: 
  32.           labels: 
  33.             app: nginx 
  34.         spec: 
  35.           containers: 
  36.             - image: nginx 
  37.               name: nginx 

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

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

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

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

  • 验证资源是否分发成功

在 dev1 集群上

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

在 dev2 集群上

  1. kubectl -n testing-fed get pod 
  2.  
  3. NAME                         READY   STATUS    RESTARTS   AGE 
  4. nginx-fed-6799fc88d8-2ld4k   1/1     Running   0          7m49s 
  5. nginx-fed-6799fc88d8-6dncp   1/1     Running   0          7m49s 
  6. nginx-fed-6799fc88d8-x64fb   1/1     Running   0          7m49s 

4. 联邦化 Tekton 的 CRD 资源

4.1 安装 Tekton

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

  1. 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 就需要手动开启。

执行命令:

  1. kubefedctl enable clustertasks.tekton.dev 
  2. kubefedctl enable conditions.tekton.dev 
  3. kubefedctl enable pipelineresources.tekton.dev 
  4. kubefedctl enable pipelineruns.tekton.dev 
  5. kubefedctl enable pipelines.tekton.dev 
  6. kubefedctl enable runs.tekton.dev 
  7. kubefedctl enable taskruns.tekton.dev 
  8. 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 字段。

执行命令:

  1. kubectl edit crd federatedtasks.types.kubefed.io 

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

  1. apiVersion: apiextensions.k8s.io/v1 
  2. ... 
  3. spec: 
  4.   versions: 
  5.   - name: v1beta1 
  6.     schema
  7.       openAPIV3Schema: 
  8.         properties: 
  9.           spec: 
  10.             properties: 
  11.               overrides: 
  12.                 ... 
  13.               placement: 
  14.                 ... 
  15.               template: 
  16.                 type: object 
  17.                 x-kubernetes-preserve-unknown-fields: true 
  18.             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
  1. kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.4/git-clone.yaml -n testing-fed 
  • 在主集群 dev1 上创建 FederatedTaskRun 资源分发到子集群 dev2
  1. apiVersion: types.kubefed.io/v1beta1 
  2. kind: FederatedTaskRun 
  3. metadata: 
  4.   name: git-clone-test 
  5.   namespace: testing-fed 
  6. spec: 
  7.   placement: 
  8.     clusters: 
  9.     - name: dev2-context 
  10.   template: 
  11.     metadata: 
  12.       namespace: testing-fed 
  13.     spec: 
  14.       workspaces: 
  15.         - nameoutput 
  16.           emptyDir: {} 
  17.       taskRef: 
  18.         name: git-clone 
  19.       params: 
  20.         - name: url 
  21.           value: https://github.com/kelseyhightower/nocode 
  • 在子集群 dev2 上查看 Tekton 的 Taskrun 任务
  1. kubectl get taskrun -n testing-fed 
  2.  
  3. NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME 
  4. 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

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/243297.html<

(0)
运维的头像运维
上一篇2025-04-25 05:03
下一篇 2025-04-25 05:04

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注