作者:陈少文 2021-06-26 14:22:34
云计算 借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。
在榕城等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、网站设计 网站设计制作定制设计,公司网站建设,企业网站建设,高端网站设计,营销型网站,外贸网站建设,榕城网站建设费用合理。
借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。
上面是一张 Tekton 在多集群下的示意图。为什么 Tekton 需要多集群执行流水线?
Kubernetes Cluster Federation 简称 KubeFed。KubeFed v2 相较于 v1 最大的改变是将 API Server 移除, 并且通过 CRD 机制完成 Federated Resource 的扩展。KubeFed Controller 管理这些 CRD, 并实现同步 Resources 跨集群编排等功能,实现模块化和定制化。下面是社区的架构图:
KubeFed 配置了两种类型的信息:
Type configuration 有三个基本概念:
此外,通过 Status、Policy 和 Scheduling 可以实现更高级的功能:
除此,KubeFed 还提供了 MultiClusterDNS,可以用于多集群之间的服务发现。
这里部署两个集群: 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
- 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".
使用 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
执行命令:
- 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/
在主集群上执行命令, 将 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
安装 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
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 是这样:
- 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.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
- kubefedctl enable runs.tekton.dev
- kubefedctl enable taskruns.tekton.dev
- kubefedctl enable tasks.tekton.dev
以 taskruns 为例, kubefedctl enable taskruns.tekton.dev 会自动创建两个资源:
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:
- ...
- 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 资源。
这里为了避免粘贴大量 yaml, 直接提前预先在子集群上创建 Task 资源, 而没有使用 FederatedTask 进行分发。
- kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.4/git-clone.yaml -n testing-fed
- 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
- kubectl get taskrun -n testing-fed
- NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
- git-clone-test True Succeeded 15s 7s
本文主要介绍并实践了利用 KubeFed 管理多集群,对 Tekton CRD 资源进行联邦化。
多集群下的 Tekton,使用主集群管理资源,使用子集群执行流水线,能够有效均衡负载,增加流水线的并发执行量,提高 CICD 系统的可维护性。
这里的 KubeFed 主要是用来存储并分发 Tekton 对象资源。如果自研编码,可以通过数据存储加循环控制器完成,但是利用 KubeFed Controller 能快速实现,同时避免了很多潜在的问题。KubeFed 用于做跨集群的资源分发,非常适用。
https://github.com/kubernetes-sigs/kubefed
分享题目:多集群下的Tekton流水线
网站URL:http://www.shufengxianlan.com/qtweb/news36/265786.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联