自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

多集群下的 Tekton 流水線

云計(jì)算
借助于 Kubernetes, Tekton 已經(jīng)具備很好的彈性, 能夠支持大規(guī)模構(gòu)建。同時(shí), 開發(fā) Task 主要使用 Yaml 和 Shell, 這擴(kuò)大了 Tekton 的各種場(chǎng)景適配范圍。

[[407477]]

1. 多集群構(gòu)建 Tekton 的優(yōu)勢(shì)

借助于 Kubernetes, Tekton 已經(jīng)具備很好的彈性, 能夠支持大規(guī)模構(gòu)建。同時(shí), 開發(fā) Task 主要使用 Yaml 和 Shell, 這擴(kuò)大了 Tekton 的各種場(chǎng)景適配范圍。

上面是一張 Tekton 在多集群下的示意圖。為什么 Tekton 需要多集群執(zhí)行流水線?

  • 隨時(shí)可變的 Kubernetes 集群。單一的 Kubernetes 集群, 無法滿足運(yùn)維的要求, 不能隨時(shí)對(duì)集群進(jìn)行變更。多集群下, 可以下架部分集群進(jìn)行維護(hù)。
  • 更大規(guī)模的構(gòu)建。CI 對(duì) CPU、內(nèi)存、IO 資源的消耗很大, 容易壓垮節(jié)點(diǎn)甚至集群。多集群能有效分擔(dān)負(fù)載壓力,提高可用性。
  • 業(yè)務(wù)隔離。業(yè)務(wù)對(duì)代碼安全等級(jí)、構(gòu)建速度、構(gòu)建環(huán)境要求不一樣, 多集群能夠提供隔離的環(huán)境, 定制化的流水線服務(wù)。

2. Kubernetes Cluster Federation

Kubernetes Cluster Federation 簡(jiǎn)稱 KubeFed。KubeFed v2 相較于 v1 最大的改變是將 API Server 移除, 并且通過 CRD 機(jī)制完成 Federated Resource 的擴(kuò)展。KubeFed Controller 管理這些 CRD, 并實(shí)現(xiàn)同步 Resources 跨集群編排等功能,實(shí)現(xiàn)模塊化和定制化。下面是社區(qū)的架構(gòu)圖:

KubeFed 配置了兩種類型的信息:

  • Type configuration, 聲明 KubeFed 處理的 API 類型
  • Cluster configuration, 聲明 KubeFed 管理哪些集群

Type configuration 有三個(gè)基本概念:

  • Templates, 定義資源在集群中的模板描述
  • Placement, 定義資源需要分發(fā)到哪些集群
  • Overrides, 定義在集群中,需要覆蓋 Templates 的字段內(nèi)容

此外,通過 Status、Policy 和 Scheduling 可以實(shí)現(xiàn)更高級(jí)的功能:

  • Status 收集分發(fā)資源在各個(gè)集群中的狀態(tài)
  • Policy 允許將資源分配給哪些集群的策略控制
  • Scheduling 允許資源跨集群遷移副本

除此,KubeFed 還提供了 MultiClusterDNS,可以用于多集群之間的服務(wù)發(fā)現(xiàn)。

3. 聯(lián)邦化 Kubernetes 集群

3.1 準(zhǔn)備集群并配置 Context

這里部署兩個(gè)集群: dev1 作為主集群,用來作為 Tekton 的控制面,不運(yùn)行流水線任務(wù); dev2 作為子集群,用來執(zhí)行 Tekton 流水線任務(wù)。

準(zhǔn)備兩個(gè)集群

主集群 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 入口在一個(gè)網(wǎng)絡(luò),能夠直連),用來添加子集群

這里 contexts 中的 name 不能含義 @ 等特殊字符, 否則 join 時(shí)會(huì)報(bào)錯(cuò)。因?yàn)?name 會(huì)用來創(chuàng)建 Secret, 需要符合 Kubernetes 的命名規(guī)范。

將主集群 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 

查看負(fù)載

  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

執(zhí)行命令:

  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 添加集群

在主集群上執(zhí)行命令, 將 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 測(cè)試集群是否聯(lián)邦成功

  • 查看已經(jīng)聯(lián)邦化的資源

安裝 KubeFed 之后,常見的很多資源都已經(jīng)聯(lián)邦化,可以在 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 中也可以看到已經(jīng)開啟聯(lián)邦的資源。

  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 
  • 創(chuàng)建一個(gè)聯(lián)邦的 Namespace

Namespace 級(jí)別的資源需要放置在聯(lián)邦化的 Namespace 下,否則在進(jìn)行資源分發(fā)時(shí),Controller 會(huì)報(bào)錯(cuò)。

  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 
  • 在主集群創(chuàng)建一個(gè)聯(lián)邦的 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 

而聯(lián)邦的 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 編寫時(shí),需要注意三個(gè)字段

- overrides, 根據(jù)不同集群, 需要覆蓋的字段屬性。這里將 dev1 上的副本數(shù)改為 2,而將 dev2 上的副本數(shù)改為 3。

- placement, 資源需要放置的集群列表。這里放置在 dev1、dev2 兩個(gè)集群。

- template, 資源的模板。這里是 Deployment 去掉 apiVersion 和 kind 的剩余部分。

  • 驗(yàn)證資源是否分發(fā)成功

在 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. 聯(lián)邦化 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 社區(qū)使用的是 gcr.io 的鏡像, 有些主機(jī)環(huán)境上可能無法拉取。我在 Dockerhub 上對(duì)其進(jìn)行了備份, 在這里可以找到相關(guān)的 yaml, https://github.com/shaowenchen/scripts/tree/main/image-sync/tektondev/dockerhub 。

4.2 聯(lián)邦化 Tekton 的 CRD

安裝 KubeFed 時(shí), 會(huì)默認(rèn)將常見的 Deployment、Secret 等聯(lián)邦化, 但如果是用戶自定義的 CRD 就需要手動(dòng)開啟。

執(zhí)行命令:

  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 會(huì)自動(dòng)創(chuàng)建兩個(gè)資源:

  • customresourcedefinition.apiextensions.k8s.io/federatedtaskruns.types.kubefed.io, 聯(lián)邦 CRD 資源 federatedtaskruns
  • federatedtypeconfig.core.kubefed.io/taskruns.tekton.dev, 在 kube-federation-system 命名空間下, 創(chuàng)建 federatedtypeconfig 類型的資源 taskruns 開啟資源分發(fā)使能

4.3 編輯新創(chuàng)建的聯(lián)邦 CRD 資源添加字段

缺少這一步, 會(huì)導(dǎo)致同步到子集群的 CR 資源內(nèi)容為空。因?yàn)?kubefedctl enable 聯(lián)邦化 CRD 資源缺少 template 字段。

執(zhí)行命令:

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

在與 overrides 、placement 平級(jí)的層次,添加下面示例的 template 內(nèi)容即可。

  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 測(cè)試多集群下分發(fā) Tekton 對(duì)象

這里為了避免粘貼大量 yaml, 直接提前預(yù)先在子集群上創(chuàng)建 Task 資源, 而沒有使用 FederatedTask 進(jìn)行分發(fā)。

  • 在子集群上創(chuàng)建 Task
  1. kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.4/git-clone.yaml -n testing-fed 
  • 在主集群 dev1 上創(chuàng)建 FederatedTaskRun 資源分發(fā)到子集群 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 任務(wù)
  1. kubectl get taskrun -n testing-fed 
  2.  
  3. NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME 
  4. git-clone-test   True        Succeeded   15s         7s 

5. 總結(jié)

本文主要介紹并實(shí)踐了利用 KubeFed 管理多集群,對(duì) Tekton CRD 資源進(jìn)行聯(lián)邦化。

多集群下的 Tekton,使用主集群管理資源,使用子集群執(zhí)行流水線,能夠有效均衡負(fù)載,增加流水線的并發(fā)執(zhí)行量,提高 CICD 系統(tǒng)的可維護(hù)性。

這里的 KubeFed 主要是用來存儲(chǔ)并分發(fā) Tekton 對(duì)象資源。如果自研編碼,可以通過數(shù)據(jù)存儲(chǔ)加循環(huán)控制器完成,但是利用 KubeFed Controller 能快速實(shí)現(xiàn),同時(shí)避免了很多潛在的問題。KubeFed 用于做跨集群的資源分發(fā),非常適用。

6. 參考

https://github.com/kubernetes-sigs/kubefed

 

責(zé)任編輯:武曉燕 來源: 問其
相關(guān)推薦

2021-06-18 05:48:02

Tekton DevopsKubernetes

2021-06-28 06:32:46

Tekton Kubernetes Clone

2017-03-02 14:12:13

流水線代碼Clojure

2013-06-06 09:31:52

2017-02-28 15:40:30

Docker流水線Azure

2022-01-26 08:12:42

Jenkins開源流水線

2022-07-18 06:05:28

Gitlab流水線

2017-02-28 16:00:45

DevOpsMarkdownreST

2023-05-10 15:08:00

Pipeline設(shè)計(jì)模式

2021-11-08 07:41:16

Go流水線編程

2024-01-07 12:47:35

Golang流水線設(shè)計(jì)模式

2023-04-02 21:49:10

開源Tekton

2021-12-24 08:02:48

GitLabCI模板庫(kù)流水線優(yōu)化

2023-08-18 10:24:52

GitLabCI 流水線

2023-09-27 08:24:49

2023-12-11 18:35:37

測(cè)試流水線自動(dòng)化

2021-01-05 08:39:51

容器前端流水線

2012-04-19 11:44:52

iPhone

2018-10-23 16:35:19

華為云

2019-11-07 09:00:39

Jenkins流水線開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)