|
[[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 コンポーネントをそれぞれ子クラスターと親クラスターにデプロイする必要があります。 まず、プロジェクト コードをクラスターにクローンします。 - $ git クローン https://github.com/clusternet/clusternet.git
親クラスターに clusternet-hub コンポーネントをデプロイします。 - $ kubectl apply -f デプロイ/ハブ
次に、clusternet-agent のブートストラップ トークンを作成します。 - 次のコマンドはブートストラップトークンを作成します: 07401b.f395accd246ae52d
- $ 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` フラグを実際に変更することなく、プッシュモードからプルモードに切り替える方法を提供します。また、その逆も可能です。
- サブクラスターのセキュリティリスクなどのセキュリティ上の理由のため。
- 子クラスタでAppPusherが無効になっている場合、親クラスタはプッシュモードまたはデュアルモードに設定されていても、子クラスタにアプリケーションをデプロイしません。この場合、子クラスタはプルモードの場合と同じように機能します。
- デプロイするリソースはDescriptionオブジェクトとして表現されます。独自のコントローラーを実行してこのオブジェクトの変更を監視し、リソースを配布およびデプロイすることもできます。
clusternet-agent をデプロイした後の最初のステップは、クラスター登録に使用されるトークンを含む Secret を作成することです。 - $ #名前空間 clusternet-systemを作成します(作成されていない場合)
- $ kubectl でns クラスタネットシステムを作成します
- $ # ここでは上で作成したトークンを使用します
- $ 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)。 - 展開する前に、ニーズに応じて同期モードを更新します。
- $ kubectl apply -f デプロイ/エージェント
デプロイ後、クラスターの登録ステータスを確認します。 - $ # clsrr は ClusterRegistrationRequest オブジェクトのエイリアスです。
- $ kubectl で clsrr を取得します
- 名前クラスターID ステータス 年齢
- clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 dc91021d-2361-4f6d-a404-7c33b9e01118 承認済み 3d6h
- $ kubectl get clsrr clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 -o yaml
- APIバージョン: clusters.clusternet.io/v1beta1
- 種類: ClusterRegistrationRequest
- メタデータ:
- ラベル:
- clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
- clusters.clusternet.io/cluster-名: clusternet-cluster-dzqkw
- clusters.clusternet.io/registered-作成者: clusternet-agent
- 名前: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118
- 仕様:
- クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
- クラスター名: clusternet-cluster-dzqkw
- クラスタータイプ: EdgeClusterSelfProvisioned
- 状態:
- caCertificate: 編集済み
- 専用名前空間: clusternet-dhxfs
- 管理対象クラスター名: clusternet-cluster-dzqkw
- 結果: 承認
- トークン: 削除済み
ClusterRegistrationRequest が承認されると、ステータスが更新され、必要に応じて適切な資格情報を使用して親クラスターにアクセスできるようになります。これらの資格情報は、指定されたスコープ内の RBAC ルールで設定されています。以下の 2 つのルールを参照してください。 - apiバージョン: rbac. authorization.k8s.io/v1
- 種類: ClusterRole
- メタデータ:
- 注釈:
- clusternet.io/自動更新: "true"
- ラベル:
- clusters.clusternet.io/bootstrapping: rbac-defaults
- clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
- clusternet.io/作成者:clusternet-hub
- 名前: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118
- ルール:
- - apiグループ:
- - クラスター.clusternet.io
- リソース:
- - クラスター登録リクエスト
- 動詞:
- -作成する
- - 得る
- - apiグループ:
- - proxies.clusternet.io
- リソース名:
- - dc91021d-2361-4f6d-a404-7c33b9e01118
- リソース:
- - ソケット
- 動詞:
- - '*'
-
-
-
- apiバージョン: rbac. authorization.k8s.io/v1
- 種類: 役割
- メタデータ:
- 注釈:
- clusternet.io/自動更新: "true"
- ラベル:
- clusters.clusternet.io/bootstrapping: rbac-defaults
- clusternet.io/作成者:clusternet-hub
- 名前: clusternet-managedcluster-role
- 名前空間: clusternet-dhxfs
- ルール:
- - apiグループ:
- - '*'
- リソース:
- - '*'
- 動詞:
- - '*'
次に、管理対象クラスターのステータスを確認します。 - $# mcls は ManagedCluster オブジェクトのエイリアスです。
- $ # kubectl get mcls -A
- $ #または「-o wide」を追加 追加の列を表示する
- $ kubectl get mcls -A -o ワイド
- 名前空間名クラスターID クラスタータイプ 同期モード Kubernetes ReadyZ 年齢
- clusternet-dhxfs clusternet-cluster-dzqkw dc91021d-2361-4f6d-a404-7c33b9e01118 EdgeClusterSelfProvisioned Dual v1.19.10 true 7d23h
- $ kubectl get mcls -n clusternet-dhxfs clusternet-cluster-dzqkw -o yaml
- APIバージョン: clusters.clusternet.io/v1beta1
- 種類: マネージドクラスター
- メタデータ:
- ラベル:
- clusters.clusternet.io/クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
- clusters.clusternet.io/cluster-名: clusternet-cluster-dzqkw
- clusternet.io/作成者: clusternet-agent
- 名前: clusternet-cluster-dzqkw
- 名前空間: clusternet-dhxfs
- 仕様:
- クラスターID: dc91021d-2361-4f6d-a404-7c33b9e01118
- クラスタータイプ: EdgeClusterSelfProvisioned
- 同期モード: デュアル
- 状態:
- apiserverURL: http://10.0.0.10:8080
- アプリプッシャー: true
- 健康:真
- k8sバージョン: v1.19.10
- 最終観測時刻: "2021-06-30T08:55:14Z"
- ライブズ:本当
- プラットフォーム: Linux/amd64
- レディーズ:本当
デフォルトでは、clusternet-agent は ManagedCluster のステータスを 3 分ごとに更新します。これは、フラグ --cluster-status-update-frequency を使用して構成できます。 次に、krew を使用して Clusternet kubectl プラグインをインストールします。 - $ kubectl krew インストール クラスターネット
インストールが完了したら、`kubectl clusternet` コマンドを使用できます。 - $ kubectl クラスターネット -h
- 使用法:
- クラスターネット [フラグ]
- clusternet [コマンド]
-
- 使用可能なコマンド:
- 適用ファイル名または標準入力でリソースに設定を適用します
- 作成する ファイルからリソースを作成するか、 標準入力から。
- 消去 ファイル名、標準入力、リソースと名前でリソースを削除するか、 リソースとラベルセレクターによる
- 編集サーバー上のリソースを編集する
- 1つまたは複数のリソースを表示する
- ヘルプコマンドに関するヘルプ
- スケール新しいサイズを設定する デプロイメント、レプリカセット、またはレプリケーションコントローラ用
- version プラグインのバージョン情報を出力します
4つの例Clusternet をデプロイしたら、アプリケーションを複数のクラスターにデプロイしてみましょう。Clusternet は、マネージド クラスター上の単一の API セットから複数のクラスターにアプリケーションをデプロイすることをサポートしています。 注: Deployer 機能は、clusternet-hub によって有効にする必要があります。 まず、サンプルアプリケーションを見てみましょう。以下の「app-demo」というサブスクリプションは、配布先のサブクラスターと、デプロイするリソースを定義しています。 - # 例/アプリケーション/サブスクリプション.yaml
- APIバージョン: apps.clusternet.io/v1alpha1
- 種類: サブスクリプション
- メタデータ:
- 名前: app-demo
- 名前空間:デフォルト
- 仕様:
- subscribers: #配信先のクラスターを定義します
- - クラスターアフィニティ:
- 一致ラベル:
- clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 #このクラスター IDを自分のものに更新してください。
- フィード: #デプロイするすべてのリソースを定義します
- - apiバージョン: apps.clusternet.io/v1alpha1
- 種類: HelmChart
- 名前: mysql
- 名前空間:デフォルト
- - apiバージョン: v1
- 種類: 名前空間
- 名前: foo
- - apiバージョン: apps/v1
- 種類: サービス
- 名前: my-nginx-svc
- 名前空間: foo
- - apiバージョン: apps/v1
- 種類: デプロイメント
- 名前: my-nginx
- 名前空間: foo
このサブスクリプション オブジェクトを適用する前に、クラスター ID で examples/applications/subscription.yaml を更新します。 kubectl プラグイン kubectl-clusternet をインストールした後、次のコマンドを実行してこのアプリケーションをサブクラスターに配布できます。 - $ kubectl clusternet apply -f examples/applications/
- helmchart.apps.clusternet.io/mysql が作成されました
- 名前空間/foo が作成されました
- deployment.apps/my-nginx が作成されました
- service/my-nginx-svc が作成されました
- subscription.apps.clusternet.io/app-demo が作成されました
次に、次のコマンドを使用して、作成したリソースを表示できます。 - $ # リストサブスクリプション
- $ kubectl clusternet サブディレクトリを取得 -A
- 名前空間名前年齢
- デフォルトアプリデモ 6分4秒
- $ kubectl clusternet チャートを取得
- 名前チャート バージョン リポジトリ ステータス 年齢
- mysql mysql 8.6.2 https://charts.bitnami.com/bitnami 71 個見つかりました
- $ kubectl クラスタネット ns を取得
- 名前の作成場所
- フー 2021-08-07T08:50:55Z
- $ kubectl clusternet get svc -n foo
- 名前の作成場所
- 私のnginxサービス 2021-08-07T08:50:57Z
- $ kubectl clusternet get deploy -n foo
- 名前の作成場所
- マイ・nginx 2021-08-07T08:50:56Z
Clusternet は、複数のクラスターにわたってアプリケーションを展開および調整するのに役立ちます。そのステータスは、次のコマンドを使用して確認できます。 - $ kubectl clusternet で mcls を取得 -A
- 名前空間名クラスターID 同期モード Kubernetes ReadyZ 年齢
- clusternet-5l82l clusternet-cluster-hx455 dc91021d-2361-4f6d-a404-7c33b9e01118 デュアル v1.21.0 true 5d22h
- $ # リストの説明
- $ kubectl clusternet で説明を取得-A
- 名前空間名デプロイヤー ステータス 年齢
- clusternet-5l82l app-demo-generic ジェネリック成功 2分55秒
- clusternet-5l82l app-demo-helm Helm 成功 2分55秒
- $ kubectl describe desc -n clusternet-5l82l app-demo-generic
- ...
- 状態:
- フェーズ: 成功
- イベント:
- タイプ 理由 年齢送信元 メッセージ
-
- 正常 正常にデプロイされました 2分55秒 clusternet-hub 説明 clusternet-5l82l/app-demo-generic が正常にデプロイされました
- $ # Helmリリースをリストする
- $ # hrはHelmReleaseの別名です
- $ kubectl clusternet get hr -n clusternet-5l82l
- 名前チャート バージョン リポジトリ ステータス 年齢
- helm-demo-mysql mysql 8.6.2 https://charts.bitnami.com/bitnami デプロイ時間 2分55秒
もちろん、サブクラスターで Helm コマンドライン ツールを使用してインストール ステータスを確認することもできます。次に例を示します。 - $ ヘルム ls -n abc
- 名前名前空間 リビジョン 更新 ステータスチャート アプリバージョン
- 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)をご覧ください。 |