首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多集群下的 Tekton 流水线

多集群下的 Tekton 流水线

原创
作者头像
陈少文
修改于 2021-06-28 02:20:45
修改于 2021-06-28 02:20:45
1.1K00
代码可运行
举报
文章被收录于专栏:陈少文陈少文
运行总次数:0
代码可运行

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 流水线任务。

  1. 准备两个集群

主集群 dev1

1 2 3 4

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

1 2 3

helm version version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}

子集群 dev2

1 2 3 4

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

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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14

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 等信息,格式如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

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

  1. 合并 kubeconfig

1 2

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

  1. 查看添加的集群 Context

1 2 3 4 5

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

  1. 切换到主集群 dev1

1 2 3

kubectl config use-context dev1-context Switched to context "dev1-context".

3.2 在主集群上安装 KubeFed

  1. 使用 Helm 安装 KubeFed

1 2 3

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

  1. 查看负载

1 2 3 4 5 6 7 8 9 10

kubectl get deploy,pod -n kube-federation-system NAME 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-nmb2j 1/1 Running 0 14s

3.3 在主集群上安装 kubefedctl

执行命令:

1 2 3

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 上。

1 2 3 4 5

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

1 2 3 4 5

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 26424 join.go:299] Created federated cluster resource

查看集群列表:

1 2 3 4 5

kubectl -n kube-federation-system get kubefedclusters NAME AGE READY dev1-context 45s True dev2-context 16s True

3.5 测试集群是否联邦成功

  • 查看已经联邦化的资源

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14

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 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 中也可以看到已经开启联邦的资源。

1 2 3 4 5 6 7 8 9 10 11 12 13

kubectl get federatedtypeconfigs.core.kubefed.io -n kube-federation-system NAME AGE clusterroles.rbac.authorization.k8s.io 29m configmaps 29m deployments.apps 29m ingresses.extensions 29m jobs.batch 29m namespaces 29m replicasets.apps 29m secrets 29m serviceaccounts 29m services 29m

  • 创建一个联邦的 Namespace

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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 是这样:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

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 是这样。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

apiVersion: 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: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- overrides, 根据不同集群, 需要覆盖的字段属性。这里将 dev1 上的副本数改为 2,而将 dev2 上的副本数改为 3- placement, 资源需要放置的集群列表。这里放置在 dev1、dev2 两个集群。
- template, 资源的模板。这里是 Deployment 去掉 apiVersion 和 kind 的剩余部分。
  • 验证资源是否分发成功

在 dev1 集群上

1 2 3 4 5

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 集群上

1 2 3 4 5 6

kubectl -n 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

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 2 3 4 5 6 7 8

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 kubefedctl 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 字段。

执行命令:

1

kubectl edit crd federatedtasks.types.kubefed.io

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

apiVersion: apiextensions.k8s.io/v1 ... spec: versions: - name: v1beta1 schema: openAPIV3Schema: properties: spec: properties: overrides: ... placement: ... 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

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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

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 emptyDir: {} taskRef: name: git-clone params: - name: url value: https://github.com/kelseyhightower/nocode

  • 在子集群 dev2 上查看 Tekton 的 Taskrun 任务

1 2 3 4

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. 参考


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
6点半下班,已经成为公司最后走的人
ArrayList 确切地说,应该叫做动态数组,因为它的底层是通过数组来实现的,当往 ArrayList 中添加元素时,会先检查是否需要扩容,如果当前容量+1 超过数组长度,就会进行扩容。
沉默王二
2024/05/15
980
6点半下班,已经成为公司最后走的人
每次面完美团,都是一把汗。。
不知不觉,银 4 已经走过一半了,明显能感受到大家的学习热情在减退,不管是 24 届春招,还是 25 届暑期实习,以及社招,希望大家都能有一个好的去处。
沉默王二
2024/04/19
3560
每次面完美团,都是一把汗。。
招银网络科技,心痛拒了!
Lambda 表达式主要用于提供一种简洁的方式来表示匿名方法,使 Java 具备了函数式编程的特性。
沉默王二
2024/05/14
1320
招银网络科技,心痛拒了!
这是周鸿祎的简历,600元的迈巴赫卖了990万
最近,互联网的早期网红周鸿祎又重新回到了大众的视野中心,600 元起拍的迈巴赫最终卖到了 990 万,这 10000 倍的溢价背后,是附送周老板的一次饭局,嘿嘿,有点当年巴菲特老爷子的味道(嗯,这饭这车都挺贵)。
沉默王二
2024/05/06
2140
这是周鸿祎的简历,600元的迈巴赫卖了990万
百度二面,有点小激动!附面试题
前几天刚面完百度,这不,没两天就收到二面邀请了,还有点小激动呢!来看看这次都问了哪些面试题吧,附答案仅供参考。
磊哥
2024/06/19
1710
年少不知编制香,错把技术当成宝。
周五晚上线下见了一名读者,和他的交集也有好多年了。21年就专门写过一篇关于他的帖,老读者应该有印象,当时阅读不低,内容也很干。
沉默王二
2024/04/19
1210
年少不知编制香,错把技术当成宝。
MySQL八:读懂MVCC多版本并发控制
mysql在并发的情况下,会引起脏读,幻读,不可重复读等一系列的问题,为解决这些问题,引入了mvcc的机制。本文就详细看看mvcc是怎么解决脏读,幻读等问题的。
云扬四海
2022/09/26
8110
京东后端实习一面,凉凉。。
今天继续给大家带来硬核面经,这次我们以《Java 面试指南》中同学 10 的 京东后端实习一面(已挂)为例,来看看如果你在面试中遇到这些面试题的话,该如何回答?
沉默王二
2024/03/25
8440
京东后端实习一面,凉凉。。
深入了解Mysql的MVCC机制
早上上班途中,趁着坐地铁的功夫翻了翻高性能mysql这本书,准备回顾一下MVCC这块的知识点,因为书中对MVCC的讲解不是很多,于是我很快便看完了这一段落,但是文章末尾有一段话引起了我的思考。
敲得码黛
2021/11/01
1.4K0
深入了解Mysql的MVCC机制
阿里年包80万,还是洒水车司机月薪3000
牛客上刷到一条帮选 offer 的帖子,上来就是“阿里 80 万年包,边缘业务”,于是很有诚意的点进去,想帮牛友分担一点选择上的负担,结果看得汗流浃背。
沉默王二
2024/06/04
1440
阿里年包80万,还是洒水车司机月薪3000
美团研发岗的薪酬一览表。。
String、StringBuilder和StringBuffer在 Java 中都是用于处理字符串的,它们之间的区别是,String 是不可变的,平常开发用得最多,当遇到大量字符串连接时,就用 StringBuilder,它不会生成很多新的对象,StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的。
沉默王二
2024/05/14
1760
美团研发岗的薪酬一览表。。
MySql避坑指南:可重复读隔离级别下,并发情况下更新丢失问题避坑
解决并发问题,当然锁最靠谱,所以MySql也提了共享锁、排它锁等。但是一个并发性能良好的系统一旦加锁,不可避免的造成访问的串行化,影响并发性能。所以MySql提供了一种乐观锁的实现:MVCC(多版本并发控制),来解决读-写并发不加锁。
崔认知
2023/06/20
3.7K2
MySql避坑指南:可重复读隔离级别下,并发情况下更新丢失问题避坑
华为的职级与薪资体系。。
站在一个旁观者的角度,我个人对任何厂都是没有抵触情绪的,只要发 offer,只要钱给到位,只要不拖延,只要能就业,就算是好公司(咱要求不高)。
沉默王二
2024/05/14
2970
华为的职级与薪资体系。。
决定放弃华为宝贵的offer了
,实习和正式 offer 之间还是有蛮大差别的,去小厂的话,有更大的概率接触到核心业务,以此来增加自己秋招的竞争力。但去大厂,更大概率就是打杂,需要自己竖起耳朵,多听多问多沉淀,才能不会显得走过场。
沉默王二
2024/06/04
1760
决定放弃华为宝贵的offer了
偷偷盘点一下京东研发岗薪资
京东这几天的热度真的非常高,据说零售部门开始严查考勤,并且调整了午休时间,整整缩短了一个小时,从原来的 11:30-13:30 调整为 12:00-13:00。
沉默王二
2024/05/23
1.3K0
偷偷盘点一下京东研发岗薪资
有点惊喜,理想一面通关了!
这次给大家分享一位同学面试理想汽车的Java 后端校招一面面经,顺利通过一面了,进入二面。考察的知识点, 针对八股文的涉及的内容,我帮大家列了一下:
小林coding
2024/03/18
2160
有点惊喜,理想一面通关了!
推荐一家还不错的互联网中厂。
我是从大一下学期开始学习 Java 的,当时已经学完了 C语言,但苦于 C语言没有很好的应用方向,就开始学习 Java 了,因为我了解到,绝大多数的互联网公司后端服务都是用 Java 开发的,另外就是学习资料也非常丰富,就业岗位和薪资待遇都比较理想。
沉默王二
2024/04/26
1890
推荐一家还不错的互联网中厂。
微众银行一面,细节拉满!!
AQS,全称是 AbstractQueuedSynchronizer,中文意思是抽象队列同步器,由 Doug Lea 设计,是 Java 并发包java.util.concurrent的核心框架类,许多同步类的实现都依赖于它,如 ReentrantLock、Semaphore、CountDownLatch 等。
沉默王二
2024/04/26
1750
微众银行一面,细节拉满!!
这是璩静的简历,4条短视频丢了百度千万年薪的工作
在技术派实战项目中,很多地方都用到了 Redis,比如说用户活跃排行榜、作者白名单、常用热点数据(文章标签、文章分类)、计数统计(文章点赞收藏评论数粉丝数)等等。
沉默王二
2024/05/14
1700
这是璩静的简历,4条短视频丢了百度千万年薪的工作
公务员薪资开始赶超互联网!
接下来,继续给大家分享一个《Java 面试指南-农行面经同学 3》的 面试原题,来看看农行面试官都喜欢问哪些问题,好做到知彼知己百战不殆。
沉默王二
2024/04/26
1300
公务员薪资开始赶超互联网!
相关推荐
6点半下班,已经成为公司最后走的人
更多 >
LV.1
「沉默王二」公号作者
目录
  • 1. 多集群构建 Tekton 的优势
  • 2. Kubernetes Cluster Federation
  • 3. 联邦化 Kubernetes 集群
    • 3.1 准备集群并配置 Context
    • 3.2 在主集群上安装 KubeFed
    • 3.3 在主集群上安装 kubefedctl
    • 3.4 添加集群
    • 3.5 测试集群是否联邦成功
  • 4. 联邦化 Tekton 的 CRD 资源
    • 4.1 安装 Tekton
    • 4.2 联邦化 Tekton 的 CRD
    • 4.3 编辑新创建的联邦 CRD 资源添加字段
    • 4.4 测试多集群下分发 Tekton 对象
  • 5. 总结
  • 6. 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档