您现在的位置是:热点 >>正文
多集群下的 Tekton 流水线
热点8870091人已围观
简介...
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 群下users: - 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 &nb的 sp; 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-6d9bf98d74Te-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 &nbktsp; 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   流; 29m deployments.apps 29m ingresses.extensions 29m jobs.batch 29m namespaces 29m replicasets.apps 29m secrets 29m serviceaccounts 29m services &nbs水线p; 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: &群下nbsp; 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 集群上
ku的 bectl -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 。
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.teTekton.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 字段。
执行命令:
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: ...&nbktsp; 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 &onnbsp; 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
Tags:
相关文章
多云管理:技术、人员、流程面临的挑战
热点尽管云计算技术已经推出十多年的时间,但企业从私有云、内部部署或公共云环境中管理其当前迭代的工具仍在快速发展。调研机构Gartner公司表示,全球90多家云计算供应商提供了不同的云计算管理功能,其中包括...
【热点】
阅读更多鹿晗什么梗
热点鹿晗关晓彤什么梗?王牌对王牌只要关晓彤在的地方,鹿晗的名字就随处可见,因此有人说关晓彤应该领双份工资王牌对王牌只要关晓彤在的地方,鹿晗的名字就随处可见,因此有人说关晓彤...鹿晗的年龄是什么梗?鹿晗的...
【热点】
阅读更多AWS Marketplace China上线一年 近100家ISV上架超200个产品
热点4月6日消息,由西云数据运营的AWS Marketplace China面向亚马逊云科技中国区域用户全面上线已有一年。 亚马逊云科技提供的数据显示,目前已经有Cisco、Palo Alto、F5、Fo...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.yidian51.com/taobao/谷歌蜘蛛池租用【tg:seogoogle987】,YGl
- https://www.thealexandrian.net/?s=谷歌蜘蛛池租用【tg:seogoogle987】,EMv
- https://www.temu.com/search_result.html?search_key=谷歌蜘蛛池租用【tg:seogoogle987】KSS
- https://www.pinkpanda.ro/magazin/ingrijirea-tenului?page=87&q=谷歌蜘蛛池租用【tg:seogoogle987】,kMH
- https://www.nslcleaders.org/?s=谷歌蜘蛛池租用【tg:seogoogle987】,Zmn
- https://www.ncetm.org.uk/search?action=CHECK&q=谷歌蜘蛛池租用【tg:seogoogle987】,Pb4
- https://www.teamlab.art/zh-hans/?submit=谷歌蜘蛛池租用【tg:seogoogle987】,6K2
- https://www.teamlab.art/th/?submit=谷歌蜘蛛池租用【tg:seogoogle987】,GAW
- https://www.toy-people.com/?s=谷歌蜘蛛池租用【tg:seogoogle987】,bMj
- https://www.reallywildbirdfood.co.uk/store/search?q=谷歌蜘蛛池租用【tg:seogoogle987】,nfB
- https://www.rockngem.com/?action=CHECK&s=谷歌蜘蛛池租用【tg:seogoogle987】,Ht1
- https://www.safetv.go.kr/base/search/view?searchWord=谷歌蜘蛛池租用【tg:seogoogle987】gxi
- https://www.nuovabai.it/catalogsearch/result/?action=SEARCH&q=谷歌蜘蛛池租用【tg:seogoogle987】,2AA
- https://www.jusoen.com/addreng.asp?p1=谷歌蜘蛛池租用【tg:seogoogle987】RV7
- https://www.trockenmittel.ch/catalogsearch/result/?iC=ZM3&q=谷歌蜘蛛池租用【tg:seogoogle987】,Ymz
- https://www.lauben.com/en/?action=SEARCH&s=谷歌蜘蛛池租用【tg:seogoogle987】,XJg
- https://www.ushmm.org/search/results/?ID=8s0587Oi8UTv74zPPM4fuhwjNpe2hsEE&q=谷歌蜘蛛池租用【tg:seogoogle987】,Kol
- https://www.theaerogroup.net/?cat=28&s=谷歌蜘蛛池租用【tg:seogoogle987】,P5i
- https://www.simcoemuskokahealth.org/SearchResults.aspx?SearchQuery=谷歌蜘蛛池租用【tg:seogoogle987】,8dy
- https://wwwcp.umes.edu/search/谷歌蜘蛛池租用【tg:seogoogle987】,Yof
- https://www.scq.ubc.ca/?page=2&s=谷歌蜘蛛池租用【tg:seogoogle987】,stt
- https://www.whirlpool.com.hk/chinese/catalogsearch/result?cat=30&q=谷歌蜘蛛池租用【tg:seogoogle987】,fSz
- https://www.shacknews.com/editorial-search?q=谷歌蜘蛛池租用【tg:seogoogle987】,XBD
- https://www.nonsolocap.it/cap?action=SEARCH&k=谷歌蜘蛛池租用【tg:seogoogle987】,z7L
- https://www.tullygroup.us/?ID=hbkq8jFjrQlVRrwzEmvoUJJAY4e1Lfo5&s=谷歌蜘蛛池租用【tg:seogoogle987】,DEL
- https://www.lauben.com/de/?s=谷歌蜘蛛池租用【tg:seogoogle987】,EGv
- https://www.target.com/s?searchTerm=谷歌蜘蛛池租用【tg:seogoogle987】,PYR
- https://search.danawa.com/dsearch.php?query=谷歌蜘蛛池租用【tg:seogoogle987】rc8
- https://5gaa.org/?token=6e2l7hjt2i26gzgctgwdrv7v0j6nxorq&s=谷歌蜘蛛池租用【tg:seogoogle987】Xok
- https://www.mynextmove.org/find/search?s=谷歌蜘蛛池租用【tg:seogoogle987】,q0t
- https://www.parl.ca/legisinfo/fr/projets-de-loi?parlsession=all&view=list&keywords=谷歌蜘蛛池租用【tg:seogoogle987】,GSi
- https://www.tombow.com/search/谷歌蜘蛛池租用【tg:seogoogle987】,5ol
- https://www.youthforum.org/search-results?cx=4f5236218ab5e8ef9&ie=UTF-8&q=谷歌蜘蛛池租用【tg:seogoogle987】,FvC
- https://www.pierreherme.com/catalogsearch/result/?q=谷歌蜘蛛池租用【tg:seogoogle987】,Qqz
- https://blvdseafood.com/?s=谷歌蜘蛛池租用【tg:seogoogle987】7lR
- https://wydden.com/?ID=r8w9WMSKWkOcmiaFWaUv0dzMdqZWfKtF&s=谷歌蜘蛛池租用【tg:seogoogle987】,7c4
- https://www.rea.govt.nz/search?searchterm=谷歌蜘蛛池租用【tg:seogoogle987】,L29
- https://www.livehindustan.com/tags/谷歌蜘蛛池租用【tg:seogoogle987】,Ukn
- https://hsmoa.com/search?query=谷歌蜘蛛池租用【tg:seogoogle987】Tws
- https://www.vocabulary.com/dictionary/谷歌蜘蛛池租用【tg:seogoogle987】,Ye6
- https://www.southmeadows.co.uk/2019/07/?s=谷歌蜘蛛池租用【tg:seogoogle987】,b1p
- https://www.qylaws.com/search/谷歌蜘蛛池租用【tg:seogoogle987】,ryF
- https://www.roberthalf.com/us/en/jobs/all/谷歌蜘蛛池租用【tg:seogoogle987】7zY
- https://www.kawainter.com/catalogsearch/result/?q=谷歌蜘蛛池租用【tg:seogoogle987】,ccL
- https://www.kuaikanmanhua.com/sou/谷歌蜘蛛池租用【tg:seogoogle987】,YE0
- https://www.youtube.com/results?search_query=谷歌蜘蛛池租用【tg:seogoogle987】,yK2
- https://www.temu.com/search_result.html?search_key=谷歌蜘蛛池租用【tg:seogoogle987】WPT
- https://www.kubb-tool.bfs.admin.ch/en/search?action=CHECK&q=谷歌蜘蛛池租用【tg:seogoogle987】,1Wn
- https://www.synonyms.com/antonyms/谷歌蜘蛛池租用【tg:seogoogle987】,MwV
- https://www.selfsufficientish.com/main/?s=谷歌蜘蛛池租用【tg:seogoogle987】,D9J