DUICUO

Clusternet は、Tencent が開発したオープンソースの Kubernetes マルチクラスター管理およびクラスター間オーケストレーション ツールです。

[[420539]]

Clusternet(Cluster Internet)は、Tencent が提供するオープンソースのクラウドネイティブ Kubernetes マルチクラスター管理プロジェクトです。数百万の Kubernetes クラスターを、インターネットにアクセスするのと同じくらい簡単に管理できます。クラスターがパブリック、プライベート、ハイブリッド、エッジクラウドのいずれで実行されている場合でも、Clusternet を使用すると、ローカルで実行されているかのように管理/アクセスできます。これにより、クラスターごとに個別の管理ツールを用意する必要がなくなります。また、Clusternet は、マネージドクラスター内の一連の API から複数のクラスターにアプリケーションをデプロイおよびオーケストレーションするのにも役立ちます。クラスターが VPC ネットワーク、エッジ、またはファイアウォールの背後で実行されている場合、Clusternet ではネットワークトンネリングを構成可能な方法で設定できます。

Clusternet は Kubernetes スタイルの API も提供しており、KubeConfig などの Kubernetes メソッドを引き続き使用して、管理対象の Kubernetes クラスターまたは Kubernetes サービスにアクセスできます。

Clusternet プロジェクトに基づいて、マルチクラウド、マルチクラスターの管理プラットフォームが実装され、クラウド、クラスター、リージョン/ゾーンにまたがる分散コンテナー サービスをユーザーに提供し、さまざまなシナリオのニーズにより適切に対応できるようになります。

1. 建築

以下は Clusternet の簡略化されたアーキテクチャ図です。

Clusternet は主に clusternet-agent と clusternet-hub の 2 つのコンポーネントで構成されており、非常に軽量です。

clusternet-agent コンポーネントは各サブクラスタに導入する必要があり、主に次の機能を果たします。

  • 現在のクラスターは、親クラスターの子クラスター (ManagedCluster とも呼ばれます) として自動的に登録されます。
  • Kubernetes バージョン、オペレーティング プラットフォーム、healthz/readyz/livez のヘルス ステータス、ノード ステータスなど、現在のクラスター メタデータを報告します。
  • 親クラスターとの安全な TCP 全二重 WebSocket トンネル接続を確立します。

clusternet-hub コンポーネントは親クラスターにデプロイされ、実行され、AA (Aggregated API Server) を介して動作し、主に次の機能を担当します。

  • 各サブクラスターの登録リクエストを承認し、名前空間、ServiceAccounts、RBAC ルールなどの各サブクラスター専用のリソースを作成します。
  • 集約 API サーバー (AA) として、サブクラスターからの複数の WebSocket 接続を維持する WebSocket サーバーとして機能します。
  • 各サブクラスターへのリクエストをリダイレクト/プロキシ/アップグレードするための Kubernetes スタイルの REST API を提供します (一連の API からアプリケーションを調整し、複数のクラスターにデプロイします)。

注: clusternet-hub は AA として実行されるため、親 apiserver が clusternet-hub サービスにアクセスできることを確認する必要があります。

2. 概念

管理対象となる各Kubernetesクラスターは子クラスターと呼ばれ、子クラスターが登録されているクラスターは親クラスターと呼ばれます。clusternet-agentコンポーネントは子クラスターで実行され、clusternet-hubコンポーネントは親クラスターで実行されます。Clusternetは、様々なネイティブKubernetesリソース(Deployment/StatefulSet/ConfigMap/Secretなど)、様々なCRDリソース、HelmChartアプリケーションなど、様々なアプリケーションリソースを異なるクラスターに分散・管理することをサポートします。

下の図は、Clusternet のマルチクラスタアプリケーション分散モデルを示しています。緑色のモジュールはユーザーが作成する必要があるモジュールで、紫色のモジュールは Clusternet 内で内部循環に使用されるリソースオブジェクトです。さらに、Clusternet は kubectl プラグインを提供しており、これを使用すると kubectl clusternet apply コマンドを使用してリソースを作成できます。

  • ClusterRegistrationRequest は、子クラスターを登録するために親クラスター内の clusternet-agent によって作成されるオブジェクトです。
  • ManagedCluster は、ClusterRegistrationRequest が承認された後に、親クラスター内の clusternet-hub によって作成されるオブジェクトです。
  • HelmChart は Helm チャート構成オブジェクトです。
  • サブスクリプションは、サブスクライバーがクラスターにインストールするリソースを定義します。一致するクラスターごとに、対応するベースオブジェクトが専用の名前空間に作成されます。
  • ローカリゼーションとグローバリゼーションは、オーバーライドの優先度によって定義され、数値が小さいほど優先度が低くなります。ローカリゼーションは名前空間全体のリソースであり、グローバリゼーションはクラスター全体のリソースです。
  • Baseオブジェクトは、グローバリゼーションとローカリゼーションが適用された状態でレンダリングされます。Descriptionオブジェクトは、最終的にターゲットサブグループに展開されるリソースです。

3 展開

上記のアーキテクチャからわかるように、clusternet-agent コンポーネントと clusternet-hub コンポーネントをそれぞれ子クラスターと親クラスターにデプロイする必要があります。

まず、プロジェクト コードをクラスターにクローンします。

  1. $ git クローン https://github.com/clusternet/clusternet.git

親クラスターに clusternet-hub コンポーネントをデプロイします。

  1. $ kubectl apply -f デプロイ/ハブ

次に、clusternet-agent のブートストラップ トークンを作成します。

  1. 次のコマンドはブートストラップトークンを作成します: 07401b.f395accd246ae52d
  2. $ kubectl apply -f マニフェスト/サンプル/cluster_bootstrap_token.yaml

次に、サブクラスターに clusternet-agent をデプロイして、サブクラスターが親クラスターに登録できるようにします。clusternet-agent は、次の 3 つの同期モード (フラグ --cluster-sync-mode で設定) で設定できます。

  • プッシュ モードとは、親クラスター内のすべてのリソースの変更が、clusternet-hub によって自動的に同期され、プッシュされ、子クラスターに適用されることを意味します。
  • プル モードとは、clusternet-agent が親クラスターから子クラスターへのすべてのリソースの変更を自動的に監視、同期、適用することを意味します。
  • デュアル プッシュ プル コンビネーション モード。このモードは強く推奨されており、通常は AppPusher 機能と組み合わせて使用​​されます。

AppPusher 機能は、主に次の 2 つの理由によりエージェント側で動作します。

  • 登録後に同期モードを変更することは推奨されません。設定や動作に不整合が生じる可能性があるためです。そのため、デュアルモードを強く推奨します。デュアルモードを設定すると、AppPusher は `--cluster-sync-mode` フラグを実際に変更することなく、プッシュモードからプルモードに切り替える方法を提供します。また、その逆も可能です。
  • サブクラスターのセキュリティリスクなどのセキュリティ上の理由のため。
  1. 子クラスタでAppPusherが無効になっている場合、親クラスタはプッシュモードまたはデュアルモードに設定されていても、子クラスタにアプリケーションをデプロイしません。この場合、子クラスタはプルモードの場合と同じように機能します。
  2. デプロイするリソースはDescriptionオブジェクトとして表現されます。独自のコントローラーを実行してこのオブジェクトの変更を監視し、リソースを配布およびデプロイすることもできます。

clusternet-agent をデプロイした後の最初のステップは、クラスター登録に使用されるトークンを含む Secret を作成することです。

  1. $ #名前空間 clusternet-systemを作成します(作成されていない場合)
  2. $ kubectl でns クラスタネットシステムを作成します
  3. $ # ここでは上で作成したトークンを使用します
  4. $ PARENTURL=https://192.168.10.10 REGTOKEN=07401b.f395accd246ae52d envsubst < ./deploy/templates/clusternet_agent_secret.yaml | kubectl apply -f -

上記のPARENTURLは、登録先の親クラスタのAPIサーバーのアドレスです。現在サポートされている唯一の方法はHTTPSであるため、必ずHTTPSを指定してください。APIサーバーが標準のHTTPSポート(:443)をリッスンしていない場合は、プロキシが正しいエンドポイントに接続できるように、URLにポート番号を指定してください(例:https://192.168.10.10:6443)。

  1. 展開する前に、ニーズに応じて同期モードを更新します。
  2. $ kubectl apply -f デプロイ/エージェント

デプロイ後、クラスターの登録ステータスを確認します。

  1. $ # clsrr は ClusterRegistrationRequest オブジェクトのエイリアスです。
  2. $ kubectl で clsrr を取得します
  3. 名前クラスターID ステータス 年齢
  4. clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 dc91021d-2361-4f6d-a404-7c33b9e01118 承認済み 3d6h
  5. $ kubectl get clsrr clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 -o yaml
  6. APIバージョン: clusters.clusternet.io/v1beta1
  7. 種類: ClusterRegistrationRequest
  8. メタデータ:
  9. ラベル:
  10. clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
  11. clusters.clusternet.io/cluster-: clusternet-cluster-dzqkw
  12. clusters.clusternet.io/registered-作成者: clusternet-agent
  13. 名前: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118
  14. 仕様:
  15. クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
  16. クラスター名: clusternet-cluster-dzqkw
  17. クラスタータイプ: EdgeClusterSelfProvisioned
  18. 状態:
  19. caCertificate: 編集済み
  20. 専用名前空間: clusternet-dhxfs
  21. 管理対象クラスター名: clusternet-cluster-dzqkw
  22. 結果: 承認
  23. トークン: 削除済み

ClusterRegistrationRequest が承認されると、ステータスが更新され、必要に応じて適切な資格情報を使用して親クラスターにアクセスできるようになります。これらの資格情報は、指定されたスコープ内の RBAC ルールで設定されています。以下の 2 つのルールを参照してください。

  1. apiバージョン: rbac. authorization.k8s.io/v1
  2. 種類: ClusterRole
  3. メタデータ:
  4. 注釈:
  5. clusternet.io/自動更新: "true"  
  6. ラベル:
  7. clusters.clusternet.io/bootstrapping: rbac-defaults
  8. clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
  9. clusternet.io/作成者:clusternet-hub
  10. 名前: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118
  11. ルール:
  12. - apiグループ:
  13. - クラスター.clusternet.io
  14. リソース:
  15. - クラスター登録リクエスト
  16. 動詞:
  17. -作成する 
  18. - 得る
  19. - apiグループ:
  20. - proxies.clusternet.io
  21. リソース名:
  22. - dc91021d-2361-4f6d-a404-7c33b9e01118
  23. リソース:
  24. - ソケット
  25. 動詞:
  26. - '*'  
  27.  
  28. ---  
  29.  
  30. apiバージョン: rbac. authorization.k8s.io/v1
  31. 種類: 役割
  32. メタデータ:
  33. 注釈:
  34. clusternet.io/自動更新: "true"  
  35. ラベル:
  36. clusters.clusternet.io/bootstrapping: rbac-defaults
  37. clusternet.io/作成者:clusternet-hub
  38. 名前: clusternet-managedcluster-role
  39. 名前空間: clusternet-dhxfs
  40. ルール:
  41. - apiグループ:
  42. - '*'  
  43. リソース:
  44. - '*'  
  45. 動詞:
  46. - '*'  

次に、管理対象クラスターのステータスを確認します。

  1. $# mcls は ManagedCluster オブジェクトのエイリアスです。
  2. $ # kubectl get mcls -A
  3. $ #または「-o wide」を追加 追加の列を表示する
  4. $ kubectl get mcls -A -o ワイド
  5. 名前空間クラスターID クラスタータイプ 同期モード Kubernetes ReadyZ 年齢
  6. clusternet-dhxfs clusternet-cluster-dzqkw dc91021d-2361-4f6d-a404-7c33b9e01118 EdgeClusterSelfProvisioned Dual v1.19.10 true 7d23h
  7. $ kubectl get mcls -n clusternet-dhxfs clusternet-cluster-dzqkw -o yaml
  8. APIバージョン: clusters.clusternet.io/v1beta1
  9. 種類: マネージドクラスター
  10. メタデータ:
  11. ラベル:
  12. clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
  13. clusters.clusternet.io/cluster-: clusternet-cluster-dzqkw
  14. clusternet.io/作成者: clusternet-agent
  15. 名前: clusternet-cluster-dzqkw
  16. 名前空間: clusternet-dhxfs
  17. 仕様:
  18. クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
  19. クラスタータイプ: EdgeClusterSelfProvisioned
  20. 同期モード: デュアル
  21. 状態:
  22. apiserverURL: http://10.0.0.10:8080
  23. アプリプッシャー: true  
  24. 健康: 
  25. k8sバージョン: v1.19.10
  26. 最終観測時刻: "2021-06-30T08:55:14Z"  
  27. ライブズ:本当 
  28. プラットフォーム: Linux/amd64
  29. レディーズ:本当 

デフォルトでは、clusternet-agent は ManagedCluster のステータスを 3 分ごとに更新します。これは、フラグ --cluster-status-update-frequency を使用して構成できます。

次に、krew を使用して Clusternet kubectl プラグインをインストールします。

  1. $ kubectl krew インストール クラスターネット

インストールが完了したら、`kubectl clusternet` コマンドを使用できます。

  1. $ kubectl クラスターネット -h
  2. 使用法:
  3. クラスターネット [フラグ]
  4. clusternet [コマンド]
  5.  
  6. 使用可能なコマンド:
  7. 適用ファイル名または標準入力リソース設定を適用します
  8. 作成する      ファイルからリソースを作成するか、  標準入力から
  9. 消去      ファイル名、標準入力、リソース名前リソースを削除する リソースラベルセレクターによる
  10. 編集サーバー上のリソースを編集する
  11. 1つまたは複数のリソースを表示する
  12. ヘルプコマンドに関するヘルプ
  13. スケール新しいサイズを設定する デプロイメント、レプリカセット、またはレプリケーションコントローラ
  14. version プラグインのバージョン情報を出力します

4つの例

Clusternet をデプロイしたら、アプリケーションを複数のクラスターにデプロイしてみましょう。Clusternet は、マネージド クラスター上の単一の API セットから複数のクラスターにアプリケーションをデプロイすることをサポートしています。

注: Deployer 機能は、clusternet-hub によって有効にする必要があります。

まず、サンプルアプリケーションを見てみましょう。以下の「app-demo」というサブスクリプションは、配布先のサブクラスターと、デプロイするリソースを定義しています。

  1. # 例/アプリケーション/サブスクリプション.yaml
  2. APIバージョン: apps.clusternet.io/v1alpha1
  3. 種類: サブスクリプション
  4. メタデータ:
  5. 名前: app-demo
  6. 名前空間:デフォルト 
  7. 仕様:
  8. subscribers: #配信クラスターを定義します 
  9. - クラスターアフィニティ:
  10. 一致ラベル:
  11. clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 #このクラスター IDを自分のもの更新してください
  12. フィード: #デプロイするすべてリソースを定義します 
  13. - apiバージョン: apps.clusternet.io/v1alpha1
  14. 種類: HelmChart
  15. 名前: mysql
  16. 名前空間:デフォルト 
  17. - apiバージョン: v1
  18. 種類: 名前空間
  19. 名前: foo
  20. - apiバージョン: apps/v1
  21. 種類: サービス
  22. 名前: my-nginx-svc
  23. 名前空間: foo
  24. - apiバージョン: apps/v1
  25. 種類: デプロイメント
  26. 名前: my-nginx
  27. 名前空間: foo

このサブスクリプション オブジェクトを適用する前に、クラスター ID で examples/applications/subscription.yaml を更新します。

kubectl プラグイン kubectl-clusternet をインストールした後、次のコマンドを実行してこのアプリケーションをサブクラスターに配布できます。

  1. $ kubectl clusternet apply -f examples/applications/
  2. helmchart.apps.clusternet.io/mysql が作成されました
  3. 名前空間/foo が作成されました
  4. deployment.apps/my-nginx が作成されました
  5. service/my-nginx-svc が作成されました
  6. subscription.apps.clusternet.io/app-demo が作成されました

次に、次のコマンドを使用して、作成したリソースを表示できます。

  1. $ # リストサブスクリプション
  2. $ kubectl clusternet サブディレクトリを取得 -A
  3. 名前空間名前年齢
  4. デフォルトアプリデモ 6分4秒
  5. $ kubectl clusternet チャートを取得
  6. 名前チャート バージョン リポジトリ ステータス 年齢
  7. mysql mysql 8.6.2 https://charts.bitnami.com/bitnami 71 個見つかりました
  8. $ kubectl クラスタネット ns を取得
  9. 名前の作成場所 
  10. フー 2021-08-07T08:50:55Z
  11. $ kubectl clusternet get svc -n foo
  12. 名前の作成場所 
  13. 私のnginxサービス 2021-08-07T08:50:57Z
  14. $ kubectl clusternet get deploy -n foo
  15. 名前の作成場所 
  16. マイ・nginx 2021-08-07T08:50:56Z

Clusternet は、複数のクラスターにわたってアプリケーションを展開および調整するのに役立ちます。そのステータスは、次のコマンドを使用して確認できます。

  1. $ kubectl clusternet で mcls を取得 -A
  2. 名前空間クラスターID 同期モード Kubernetes ReadyZ 年齢
  3. clusternet-5l82l clusternet-cluster-hx455 dc91021d-2361-4f6d-a404-7c33b9e01118 デュアル v1.21.0 true 5d22h
  4. $ # リストの説明
  5. $ kubectl clusternet で説明を取得-A
  6. 名前空間デプロイヤー ステータス 年齢
  7. clusternet-5l82l app-demo-generic ジェネリック成功 2分55秒
  8. clusternet-5l82l app-demo-helm Helm 成功 2分55秒
  9. $ kubectl describe desc -n clusternet-5l82l app-demo-generic
  10. ...
  11. 状態:
  12. フェーズ: 成功
  13. イベント:
  14. タイプ 理由 年齢送信元 メッセージ
  15. ---- ------ ---- ---- -------  
  16. 正常 正常にデプロイされました 2分55秒 clusternet-hub 説明 clusternet-5l82l/app-demo-generic が正常にデプロイされまし
  17. $ # Helmリリースをリストする
  18. $ # hrはHelmRelease別名です
  19. $ kubectl clusternet get hr -n clusternet-5l82l
  20. 名前チャート バージョン リポジトリ ステータス 年齢
  21. helm-demo-mysql mysql 8.6.2 https://charts.bitnami.com/bitnami デプロイ時間 2分55秒

もちろん、サブクラスターで Helm コマンドライン ツールを使用してインストール ステータスを確認することもできます。次に例を示します。

  1. $ ヘルム ls -n abc
  2. 名前名前空間 リビジョン 更新 ステータスチャート アプリバージョン
  3. helm-demo-mysql abc 1 2021-07-06 14:34:44.188938 +0800 CST デプロイ済み mysql-8.6.2 8.0.25

これにより、アプリケーションを複数のクラスターに簡単に分散できます。Clusternet の詳細と使用方法については、公式リポジトリ(https://github.com/clusternet/clusternet)をご覧ください。