[[407477]] 1. 複数のクラスターでTektonを構築する利点Kubernetes の助けにより、Tekton は優れた弾力性を備え、大規模なビルドをサポートできます。同時に、タスク開発では主に Yaml と Shell が使用されるため、Tekton の適応性がさまざまなシナリオに拡張されます。 上記は、複数のクラスター内の Tekton の図です。 Tekton がパイプラインを実行するために複数のクラスターを必要とするのはなぜですか? - いつでも変更できる Kubernetes クラスター。単一の Kubernetes クラスターでは運用と保守の要件を満たすことができず、クラスターをいつでも変更することはできません。マルチクラスター環境では、メンテナンスのために一部のクラスターをオフラインにすることができます。
- より大規模なビルド。 CI は CPU、メモリ、IO リソースを大量に消費し、ノードやクラスターに簡単に負担をかけてしまう可能性があります。複数のクラスターにより負荷圧力を効果的に分散し、可用性を向上させることができます。
- ビジネスの分離。企業によって、コードのセキュリティ レベル、ビルド速度、ビルド環境に対する要件は異なります。マルチクラスターは、分離された環境とカスタマイズされたパイプライン サービスを提供できます。
2. Kubernetes クラスターフェデレーションKubernetes Cluster Federation は KubeFed と略されます。 KubeFed v2 と v1 との最大の違いは、API サーバーの削除と、CRD メカニズムによるフェデレーテッド リソースの拡張です。 KubeFed コントローラーはこれらの CRD を管理し、リソースの同期やクラスター間のオーケストレーションなどの機能を実装して、モジュール性とカスタマイズを実現します。以下はコミュニティ アーキテクチャ図です。 KubeFed は次の 2 種類の情報で構成されます。 - KubeFedが処理するAPIタイプを宣言するタイプ構成
- KubeFed が管理するクラスターを宣言するクラスター構成
タイプ構成には 3 つの基本的な概念があります。 - テンプレート、クラスター内のリソースのテンプレート記述を定義します
- 配置は、リソースをどのクラスターに配布する必要があるかを定義します。
- クラスターで定義されたオーバーライドは、テンプレートのフィールドの内容をオーバーライドする必要があります。
さらに、ステータス、ポリシー、スケジュールを通じて、より高度な機能を実現できます。 - ステータスは各クラスタ内のリソースのステータスを収集して配布します
- ポリシーにより、どのクラスターにリソースが割り当てられるかをポリシーで制御できます。
- スケジューリングにより、リソースはクラスタ間でレプリカを移行できる
さらに、KubeFed は、複数のクラスター間のサービス検出に使用できる MultiClusterDNS も提供します。 3. フェデレーテッド Kubernetes クラスター3.1 クラスターを準備し、コンテキストを構成するここでは 2 つのクラスターがデプロイされています。dev1 はメイン クラスターであり、Tekton のコントロール プレーンとして使用され、パイプライン タスクは実行されません。 dev2 は、Tekton パイプライン タスクを実行するために使用されるサブクラスターです。 2つのクラスターを準備する メインクラスタ dev1 - kubectl ノードを取得する
-
- 名前ステータス 役割 年齢 バージョン
- node1 コントロールプレーン、マスター、ワーカー 151m v1.20.4 が準備完了
- ヘルムバージョン
-
- version.BuildInfo{バージョン: "v3.2.1" 、GitCommit: "fe51cd1e31e6a202cba7dead9552a6d418ded79a" 、GitTreeState: "clean" 、GoVersion: "go1.13.10" }
サブクラスタ dev2 - kubectl ノードを取得する
-
- 名前ステータス 役割 年齢 バージョン
- node1 コントロールプレーン、マスター、ワーカー 42d v1.20.4 が準備完了
メインクラスタ上のすべてのクラスタのコンテキストを構成して(クラスタのApiserverの入り口が同じネットワークにあり、直接接続できる必要があります)、サブクラスタを追加します。 コンテキスト内の名前には @ などの特殊文字を含めることはできません。そうしないと、結合時にエラーが報告されます。名前は Secret の作成に使用されるため、Kubernetes の命名規則に準拠する必要があります。 メイン クラスター dev1 の kubeconfig を ~/.kube/config-1 に配置し、名前とその他の情報を次の形式で変更します。 - APIバージョン: v1
- クラスター:
- - クラスター:
- ...
- 名前: dev1.cluster.local
- コンテキスト:
- - コンテクスト:
- クラスター: dev1.cluster.local
- ユーザー: dev1-kubernetes-admin
- 名前: dev1-コンテキスト
- ユーザー:
- -名前: dev1-kubernetes-admin
- ユーザー:
- ...
サブクラスター dev2 の kubeconfig を ~/.kube/config-2 に配置し、名前とその他の情報を次の形式で変更します。 - APIバージョン: v1
- クラスター:
- - クラスター:
- ...
- 名前: dev2.cluster.local
- コンテキスト:
- - コンテクスト:
- クラスター: dev2.cluster.local
- ユーザー: dev2-kubernetes-admin
- 名前: dev2-context
- ユーザー:
- -名前: dev2-kubernetes-admin
- ユーザー:
- ...
kubeconfigをマージする - $HOME/.kube/ をコピーします。
- KUBECONFIG=config-1:config-2 kubectl 構成ビュー
追加されたクラスターコンテキストを表示する - kubectl config コンテキストを取得する
-
- 現在 名前クラスター AUTHINFO 名前空間
- dev1 コンテキスト dev1.cluster。ローカルdev1-kubernetes-admin
- dev2 コンテキスト dev2.cluster。ローカルdev2-kubernetes-admin
メインクラスタ dev1 に切り替える - kubectl config 使用コンテキスト dev1 コンテキスト
-
- コンテキスト「dev1-context」に切り替えました。
3.2 メインクラスターにKubeFedをインストールするHelmを使用してKubeFedをインストールする - Git クローン https://github.com/kubernetes-sigs/kubefed.git
- cd kubefed/チャート/
- helm で kubefed をインストールします。/kubefed/
表示負荷 - kubectl get deploy、pod -n kube-federation-system を実行します。
-
- 名前準備完了最新利用可能年齢
- デプロイメント.apps/kubefed-admission-webhook 1/1 1 1 95秒
- デプロイメント.apps/kubefed-controller-manager 2/2 2 2 95秒
-
- 名前準備完了 ステータス 再起動 年齢
- pod/kubefed-admission-webhook-598bd776c6-gv4qh 1/1 実行中 0 95秒
- pod/kubefed-controller-manager-6d9bf98d74-n8kjz 1/1 実行中 0 17 秒
- pod/kubefed-controller-manager-6d9bf98d74-nmb2j 1/1 実行中 0 14 秒
3.3 メインクラスタにkubefedctlをインストールするコマンドを実行: - 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/ローカル/bin/
3.4 クラスターの追加プライマリ クラスターでコマンドを実行して、dev1 と dev2 をプライマリ クラスター dev1 に追加します。 - kubefedctl dev1-context に参加
-
- I0625 14:32:42.969373 25920 join .go:861] 次のシークレットを使用します: dev1-context-dev1-context-token-2w8km
- I0625 14:32:42.972316 25920 join .go:934] ホスト クラスターにdev1-context-ln6vx という名前のシークレットを作成しました
- I0625 14:32:42.991399 25920 join .go:299] フェデレーション クラスタ リソースを作成しました
- kubefedctl は、dev2 コンテキスト結合します。
-
- I0625 14:33:11.836472 26424 join .go:861] 次のシークレットを使用します: dev2-context-dev1-context-token-dcl8s
- I0625 14:33:11.840121 26424 join .go:934]ホスト クラスターにdev2-context-264dz という名前のシークレットを作成しました
- I0625 14:33:11.898044 26424 join .go:299] フェデレーション クラスタ リソースを作成しました
クラスター リストを表示します。 - kubectl -n kube-federation-system kubefedclusters を取得する
-
- 名前年齢 準備完了
- dev1-context 45秒真
- dev2-context 16s真
3.5 クラスタが正常にフェデレーションされているかどうかをテストするKubeFed をインストールすると、多くの共通リソースが統合され、CRD で表示できるようになります。 - kubectl 取得 crd |grep フェデレーション
-
- フェデレーションクラスタロール.types.kubefed.io 2021-06-26T06:22:50Z
- federatedconfigmaps.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションデプロイメント.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションイングレス.types.kubefed.io 2021-06-26T06:22:50Z
- federatedjobs.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションネームスペース.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションレプリカセット.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションシークレットタイプ.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションサービスアカウント.types.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションサービスタイプ.kubefed.io 2021-06-26T06:22:50Z
- フェデレーションサービスステータス.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
-
- 名前年齢
- クラスターロール.rbac.authorization.k8s.io 29 分
- 構成マップ 29 分
- デプロイメント.apps 29分
- イングレス.拡張 29 分
- ジョブバッチ 29 分
- 名前空間 29m
- レプリカセット.アプリ 29分
- 秘密 29分
- サービスアカウント 29 分
- サービス 29m
名前空間レベルのリソースは、フェデレーションされた名前空間に配置する必要があります。そうしないと、コントローラーはリソースを配布するときにエラーを報告します。 - APIバージョン: v1
- 種類: 名前空間
- メタデータ:
- 名前: テストフィード
-
- APIバージョン: types.kubefed.io/v1beta1
- 種類: フェデレーテッド名前空間
- メタデータ:
- 名前: テストフィード
- 名前空間: テストフィード
- 仕様:
- 配置:
- クラスター:
- -名前: dev1-コンテキスト
- -名前: dev2-コンテキスト
- プライマリクラスタにフェデレーションデプロイメントを作成する
一般的な展開は次のとおりです。 - APIバージョン: アプリ/v1
- 種類: デプロイメント
- メタデータ:
- 名前: nginx
- 名前空間:デフォルト
- 仕様:
- レプリカ: 1
- セレクタ:
- 一致ラベル:
- アプリ: nginx
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: nginx
- 仕様:
- コンテナ:
- - 画像: nginx
- 名前: nginx
これは連邦政府の配備の場合です。 - APIバージョン: types.kubefed.io/v1beta1
- 種類: フェデレーテッドデプロイメント
- メタデータ:
- 名前: nginx-fed
- 名前空間: テストフィード
- 仕様:
- 上書き:
- - クラスター名: dev1-コンテキスト
- クラスターオーバーライド:
- - パス: /spec/replicas
- 値: 2
- - クラスター名: dev2-context
- クラスターオーバーライド:
- - パス: /spec/replicas
- 値: 3
- 配置:
- クラスター:
- -名前: dev1-コンテキスト
- -名前: dev2-コンテキスト
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: nginx
- 名前空間: テストフィード
- 仕様:
- レプリカ: 1
- セレクタ:
- 一致ラベル:
- アプリ: nginx
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: nginx
- 仕様:
- コンテナ:
- - 画像: nginx
- 名前: nginx
FederatedDeploymentを書くときは、3つのフィールドに注意する必要があります。 - オーバーライド、異なるクラスターに応じてオーバーライドする必要があるフィールド属性。ここで、dev1 のレプリカ数は 2 に変更され、dev2 のレプリカ数は 3 に変更されます。 - 配置、リソースを配置する必要があるクラスターのリスト。ここでは、dev1 と dev2 の 2 つのクラスターに配置されます。 - テンプレート、リソースのテンプレート。以下は、apiVersion と kind を除いたデプロイメントの残りの部分です。 dev1クラスタ上 - kubectl -n テストフィードでポッドを取得する
-
- 名前準備完了 ステータス 再起動 年齢
- nginx-fed-6799fc88d8-7llk9 1/1 実行中 0 8分2秒
- nginx-fed-6799fc88d8-clc5w 1/1 実行中 0 8分2秒
dev2クラスタ上 - kubectl -n テストフィードでポッドを取得する
-
- 名前準備完了 ステータス 再起動 年齢
- nginx-fed-6799fc88d8-2ld4k 1/1 実行中 0 7分49秒
- nginx-fed-6799fc88d8-6dncp 1/1 実行中 0 7分49秒
- nginx-fed-6799fc88d8-x64fb 1/1 実行中 0 7分49秒
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 をインストールすると、共通のデプロイメント、シークレットなどがデフォルトでフェデレーションされますが、ユーザー定義の CRD の場合は手動で有効にする必要があります。 コマンドを実行: - kubefedctl で clustertasks.tekton.dev を有効にします。
- kubefedctl 条件を有効にする.tekton.dev
- kubefedctl パイプラインリソースを有効にする.tekton.dev
- kubefedctl パイプライン実行を有効にする.tekton.dev
- kubefedctl パイプラインを有効にする.tekton.dev
- kubefedctl を有効にすると、runs.tekton.dev が実行されます。
- kubefedctl タスクランを有効にする。
- kubefedctl タスクを有効にする.tekton.dev
taskruns を例にとると、kubefedctl enable taskruns.tekton.dev は次の 2 つのリソースを自動的に作成します。 - customresourcedefinition.apiextensions.k8s.io/federatedtaskruns.types.kubefed.io、federatedtaskruns、フェデレーション CRD リソース
- federatedtypeconfig.core.kubefed.io/taskruns.tekton.dev、kube-federation-system 名前空間で、federatedtypeconfig タイプのリソース taskruns を作成し、リソース配布を有効にします。
4.3 新しく作成したフェデレーションCRDリソースを編集し、フィールドを追加する この手順がない場合、サブクラスターに同期された CR リソース コンテンツは空になります。 kubefedctl enable フェデレーテッド CRD リソースにはテンプレート フィールドがないため。 コマンドを実行: - kubectl 編集 crd federatedtasks.types.kubefed.io
オーバーライドと配置と同じレベルで、次の例に示すテンプレート コンテンツを追加します。 - apiバージョン: apiextensions.k8s.io/v1
- ...
- 仕様:
- バージョン:
- -名前: v1beta1
- スキーマ:
- オープンAPIV3スキーマ:
- プロパティ:
- 仕様:
- プロパティ:
- 上書き:
- ...
- 配置:
- ...
- テンプレート:
- タイプ: オブジェクト
- x-kubernetes-preserve-不明フィールド: true
- タイプ: オブジェクト
十分に明確でない場合は、https://github.com/shaowenchen/scripts/tree/main/image-sync/tektondev/kubefed を参照して変更できます。バージョン 0.24.1 も使用している場合は、これらの CRD リソースを kubectl で直接適用できます。 4.4 複数のクラスターにおけるTektonオブジェクトの分布をテストする大量の YAML を貼り付けることを避けるために、配布に FederatedTask を使用するのではなく、事前にサブクラスター上に Task リソースを直接作成します。 - kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.4/git-clone.yaml -n テストフィード
- メインクラスタ dev1 に FederatedTaskRun リソースを作成し、サブクラスタ dev2 に配布します。
- APIバージョン: types.kubefed.io/v1beta1
- 種類: FederatedTaskRun
- メタデータ:
- 名前: git-clone-test
- 名前空間: テストフィード
- 仕様:
- 配置:
- クラスター:
- -名前: dev2-コンテキスト
- テンプレート:
- メタデータ:
- 名前空間: テストフィード
- 仕様:
- ワークスペース:
- -名前:出力
- 空ディレクトリ: {}
- タスク参照:
- 名前: git-clone
- パラメータ:
- -名前: URL
- 値: https://github.com/kelseyhightower/nocode
- サブクラスタ dev2 上の Tekton の Taskrun タスクを表示します。
- kubectl get taskrun -n テストフィード
-
- 名前成功 理由 開始時間 完了時間
- git-clone-test True成功 15秒 7秒
5. 結論この記事では主に、KubeFed を使用して複数のクラスターを管理し、Tekton CRD リソースを統合する方法について紹介し、実践します。 複数のクラスターの下にある Tekton は、メイン クラスターを使用してリソースを管理し、サブ クラスターを使用してパイプラインを実行します。これにより、負荷を効果的に分散し、パイプラインの同時実行を増やし、CICD システムの保守性を向上させることができます。 ここでの KubeFed は主に Tekton オブジェクト リソースの保存と配布に使用されます。独自のコードを開発する場合は、データ ストレージとループ コントローラーを使用して完成させることができますが、KubeFed コントローラーを使用すると、迅速に実装でき、多くの潜在的な問題を回避できます。 KubeFed はクラスター間のリソース分散に使用され、非常に適しています。 6. 参考文献https://github.com/kubernetes-sigs/kubefed |