互联网技术 / 互联网资讯 · 2024年1月14日 0

Tekton 流水线在多集群环境中的应用

多集群构建 Tekton 的优势

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

多集群下的 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 跨集群编排等功能,实现模块化和定制化。下面是社区的架构图:

多集群下的 Tekton 流水线

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

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

Type configuRation 有三个基本概念:

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

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

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

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

联邦化 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:”fe51cd1e31e6a202CBA7dead9552a6d418ded79a”,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 …

将子集群 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 Users: – naMe: dev2-kubeRnetes-adMin …

合并 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 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

执行命令:

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 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 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 29M deployMents.apps 29M ingReSSes.extensions 29M jobs.BATch 29M naMespaces 29M Replicasets.apps 29M secRets 29M seRviceaCCOunts 29M seRvices 29M seRvicestatUSes.coRe.kubefed.io 29M typeconfigs.coRe.kubefed.io 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 是这样。

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 编写时,需要注意三个字段

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