<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          多集群下的 Tekton 流水線實(shí)踐

          共 11392字,需瀏覽 23分鐘

           ·

          2021-12-25 05:37

          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ù)。

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

          主集群 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
          1. 在主集群上配置全部集群的 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 等信息,格式如下:

          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:
          ????...
          1. 合并 kubeconfig
          cd?$HOME/.kube/
          KUBECONFIG=config-1:config-2?kubectl?config?view?--flatten?>?$HOME/.kube/config
          1. 查看添加的集群 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
          1. 切換到主集群 dev1
          kubectl?config?use-context?dev1-context

          Switched?to?context?"dev1-context".

          3.2 在主集群上安裝 KubeFed

          1. 使用 Helm 安裝 KubeFed
          git?clone?https://github.com/kubernetes-sigs/kubefed.git
          cd?kubefed/charts/
          helm?install?kubefed?./kubefed/?--namespace?kube-federation-system?--create-namespace
          1. 查看負(fù)載
          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

          執(zhí)行命令:

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

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

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

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

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

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

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

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

          - overrides, 根據(jù)不同集群, 需要覆蓋的字段屬性。這里將 dev1 上的副本數(shù)改為 2,而將 dev2 上的副本數(shù)改為 3。
          - placement, 資源需要放置的集群列表。這里放置在 dev1、dev2 兩個(gè)集群。
          - template, 資源的模板。這里是 Deployment 去掉 apiVersion 和 kind 的剩余部分。
          • 驗(yàn)證資源是否分發(fā)成功

          在 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. 聯(lián)邦化 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 社區(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í)行命令:

          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 會(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í)行命令:

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

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

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

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

          • 在子集群上創(chuàng)建 Task
          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
          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 任務(wù)
          kubectl?get?taskrun?-n?testing-fed

          NAME?????????????SUCCEEDED???REASON??????STARTTIME???COMPLETIONTIME
          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


          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中国十大黄色操逼网站 | 波霸巨大乳一区二区三区 | 熟女系列-x88AV | 国产精品一二 | 果冻传媒91cm-084换妻下部董小宛 |