クラスター レジストリの概要
Azure Operator Service Manager (AOSM) クラスター レジストリ (CR) を使って、クラウド ネイティブ ネットワーク機能の回復性を向上させます
ドキュメントの履歴
- 作成日および初回公開日 : 2024 年 7 月 26 日
- HA の更新日: 2024 年 10 月 16 日
- GC の更新日: 2024 年 11 月 5 日
機能の依存関係
この機能には、次の環境が最低限必要です。
- AOSM ARM API の最小バージョン: 2023-09-01
- ネットワーク機能 (NF) kubernetes 拡張機能の高可用性 (HA) を使用していない最初のバージョン: 1.0.2711-7
- NF kubernetes 拡張機能の HA を使用した最初のバージョン: 2.0.2810-144
- NF kubernetes 拡張機能の GC を使用した最初のバージョン: 2.0.2860-160
クラスター レジストリの概要
Azure Operator Service Manager (AOSM) クラスター レジストリ (CR) を使うと、Nexus K8s クラスターのコンテナー イメージのローカル コピーを使用できるようになります。 クラスター レジストリを有効にしてコンテナー化されたネットワーク機能 (CNF) をインストールすると、コンテナー イメージがリモート AOSM 成果物ストアからプルされて、このローカル クラスター レジストリに保存されます。 ミューテーション Webhook を使用すると、クラスター レジストリは、パブリッシャーのパッケージ化の変更を回避するために、イメージ要求を自動的にインターセプトし、ローカル レジストリ パスに置き換えます。 クラスター レジスタにより、コンテナー イメージへの CNF のアクセスは、リモート成果物ストアへの接続が失われた場合でも維持されます。
主なユース ケースとメリット
クラウド ネイティブ ネットワーク機能 (CNF) では、AOSM 成果物ストアを使った初期デプロイの間だけでなく、ネットワーク機能を動作させ続けるためにも、コンテナー イメージへのアクセスが必要です。 次のようなシナリオが含まれます。
- ポッドの再起動: ポッドを停止して起動すると、クラスター ノードがレジストリからコンテナー イメージをプルする可能性があります。
- Kubernetes スケジューラの動作: ノードへのポッドの割り当て時に、スケジューラ プロファイル ルールに従い、新しいノードのコンテナー イメージがローカル環境にキャッシュされていない場合、ノードはレジストリからコンテナー イメージをプルします。
AOSM クラスター レジストリを使用するメリット:
- AOSM 成果物ストアへの接続が失われた場合に CNF の中断を防ぐために必要なローカル イメージを提供します。
- 各クラスター ノードがローカル レジストリからのみイメージをプルするようになったため、AOSM 成果物ストアでのイメージ プルの数が減少しました。
- ミューテーション Webhook を使用して適切なローカル レジストリ URL パスに置き換えることで、不正なレジストリ URL の問題を克服しました。
クラスター レジストリのしくみ
AOSM クラスター レジストリは、Network Function Operator (NFO) Arc K8s 拡張機能を使って有効にされます。 CLI を使って Nexus K8s クラスターでクラスター レジストリを有効にする方法を次に示します。
az k8s-extension create --cluster-name
--cluster-type {connectedClusters}
--extension-type {Microsoft.Azure.HybridNetwork}
--name
--resource-group
--scope {cluster}
--release-namespace {azurehybridnetwork}
--release-train {preview, stable}
--config Microsoft.CustomLocation.ServiceAccount=azurehybridnetwork-networkfunction-operator
[--auto-upgrade {false, true}]
[--config global.networkfunctionextension.enableClusterRegistry={false, true}]
[--config global.networkfunctionextension.enableLocalRegistry={false, true}]
[--config global.networkfunctionextension.enableEarlyLoading={false,true}]
[--config global.networkfunctionextension.clusterRegistry.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.webhook.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.webhook.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.storageClassName=]
[--config global.networkfunctionextension.clusterRegistry.storageSize=]
[--config global.networkfunctionextension.webhook.pod.mutation.matchConditionExpression=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold=]
[--version]
Network Function Operator Arc K8s 拡張機能でクラスター レジストリ機能が有効になっていると、AOSM 成果物ストアからデプロイされるすべてのコンテナー イメージに、Nexus K8s クラスター内でローカルにアクセスできます。 ユーザーは、クラスター レジストリの永続ストレージ サイズを選択できます。
Note
ユーザーが入力を何も指定しない場合は、永続ボリュームとして既定値の 100 GB が使われます。
クラスター レジストリ コンポーネント
クラスター レジストリ機能は、NFO 拡張機能を支援するために、ターゲット エッジ クラスターにヘルパー ポッドをデプロイします。
コンポーネント調整
- このメイン ポッドは、クラスターで実行されている Microsoft.Kubernetes リソース プロバイダー (RP)、Hybrid Relay、および Arc エージェントの助けを借りて、K8sBridge によって作成されたコンポーネント カスタム リソース オブジェクト (CRO) の調整を行います。
Webhook を変更するポッド
- これらのポッドは、Admission Webhook を変更する Kubernetes を実装し、ミューテーション API のインスタンスにサービスを提供します。 ミューテーション API では、次の 2 つの処理が行われます。
- イメージ レジストリ パスをローカル レジストリ IP に変更し、AOSM 成果物ストアの Azure コンテナー レジストリ (ACR) を置き換えます。
- エッジ クラスターに成果物の CR を作成します。
成果物の調整
- このポッドは、ミューテーション Webhook によって作成された成果物の CRO を調整します。
レジストリ
- このポッドは、CNF のコンテナー イメージを格納および取得します。
クラスター レジストリ ガベージ コレクション
AOSM クラスター拡張機能により、バックグラウンド ガベージ コレクション (GC) ジョブが実行され、コンテナー イメージが定期的にクリーンアップされます。 このジョブはスケジュールに基づいて実行され、指定されたしきい値にクラスター レジストリの使用量が達したかどうかを確認し、そうである場合は、ガベージ コレクション プロセスを開始します。 ジョブのスケジュールとしきい値はエンド ユーザーによって構成されますが、既定ではジョブは 0% の使用率しきい値で 1 日に 1 回実行されます。
ガベージ イメージ マニフェストをクリーンアップする
AOSM では、クラスター レジストリにおけるポッド所有者リソースと使用イメージの間の参照が維持されます。 イメージのクリーンアップ プロセスが始まると、どのポッドにもリンクされていないイメージが特定され、それをクラスター レジストリから削除する論理的な削除が発行されます。 この種類の論理的な削除では、すぐにはクラスター レジストリのストレージ スペースが解放されません。 実際のイメージ ファイルの削除は、以下に示す CNCF ディストリビューションのレジストリ ガベージ コレクションによって異なります。
Note
ポッドの所有者とそのコンテナー イメージ間の参照は、イメージが AOSM によって誤って削除されないようにしています。 たとえば、レプリカセット ポッドが停止した場合、コンテナー イメージは AOSM によって逆参照されません。 AOSM がコンテナー イメージを逆参照するのは、レプリカセットが削除された場合だけです。 Kubernetes ジョブとデーモンセットによって管理されるポッドにも、同じ原則が適用されます。
CNCF ガベージ コレクション ディストリビューション
AOSM では、オープン ソースの CNCF ディストリビューション レジストリを使用して、クラスター レジストリが設定されます。 したがって、AOSM は、ガベージ コレクション | CNCF ディストリビューションによって提供されるガベージ コレクション機能に依存しています。 全体としては、標準 2 フェーズ "マークとスイープ" プロセスに従ってイメージ ファイルを削除し、レジストリのストレージ スペースを解放します。
Note
このプロセスでは、クラスター レジストリが読み取り専用モードである必要があります。 レジストリが読み取り専用モードでないときにイメージがアップロードされると、イメージ レイヤーが誤って削除されるリスクがあり、これがイメージ破損につながります。 最大 1 分間、レジストリを読み取り専用モードでロックする必要があります。 その結果、クラスター レジストリが読み取り専用モードの場合、AOSM は他の NF デプロイを延期します。
ガベージ コレクション構成パラメーター
次のパラメーターでは、ガベージ コレクション ジョブのスケジュールとしきい値を構成します。
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold
- 構成の詳細については、最新のネットワーク機能拡張機能のインストール手順に関するページを参照してください
高可用性と回復性に関する考慮事項
AOSM NF 拡張機能は主要な機能をサポートするために、ミューテーション Webhook とエッジ レジストリを使用しています。
- イメージ パスのカスタマイズを必要とせずに Helm チャートをオンボードします。
- ポッド操作を高速化し、切断モードのサポートを有効にするローカル クラスター レジストリ。 これらの重要なコンポーネントには、高可用性と回復性が必要です。
HA の変更の概要
HA では、クラスター レジストリと Webhook ポッドが、最小 3 つのレプリカおよび最大 5 つのレプリカのレプリカセットをサポートするようになりました。 レプリカセットのキー構成は次のとおりです。
- 段階的なロールアウトのアップグレード戦略が使用されます。
- 自発的な中断時の可用性には、PodDisruptionBudgets (PDB) が使用されます。
- ポッドのアンチアフィニティは、ノード全体でポッドを均等に分散するために使用されます。
- Readiness probe は、トラフィックを提供する前にポッドの準備ができていることを確認するために使用されます。
- AOSM ワークロード ポッドは、システム ノード プールにのみ割り当てられます。
- ポッドは、CPU とメモリの負荷に応じて水平方向にスケーリングします。
レプリカ
- アプリケーションの複数のコピー、またはレプリカを実行するクラスターは、冗長性の最初のレベルを提供します。 クラスター レジストリと Webhook はどちらも 'kind:deployment' として定義され、最小レプリカ数は 3 つです。
DeploymentStrategy
- rollingUpdate 戦略は、ダウンタイムなしのアップグレードを実現し、アプリケーションの段階的なロールアウトをサポートするために使用されます。 既定の maxUnavailable 構成では、冗長性ポリシーを満たすのに十分なポッドが作成されるまで、一度に 1 つのポッドのみを停止できます。
ポッド中断バジェット
- ポリシーの中断バジェット (PDB) は、自発的な中断からポッドを保護し、Deployment、ReplicaSet、または StatefulSet オブジェクトと共にデプロイされます。 AOSM 演算子ポッドの場合、minAvailable パラメーターが 2 の PDB が使用されます。
ポッドのアンチアフィニティ
- ポッドのアンチアフィニティは、クラスター内の複数のノードにわたるアプリケーション ポッドの分散を制御します。 HA では、AOSM ポッドのアンチアフィニティは次のパラメーターを使用します。
- スケジュール モードは、ルールがどの程度厳密に適用されるかを定義するために使用されます。
- requiredDuringSchedulingIgnoredDuringExecution(Hard): ポッドは、定義されたルールを満たすようにスケジュールされる必要があります。 ルールの要件を満たすトポロジが使用できない場合、ポッドはスケジュールされません。
- preferredDuringSchedulingIgnoredDuringExecution(Soft): このルールの種類は、ポッドのスケジュール設定を表しますが、厳密な要件を強制するものではありません。 設定基準を満たすトポロジを使用できる場合、Kubernetes はポッドをスケジュールします。 そのようなトポロジが使用できない場合でも、その設定を満たしていない他のノードでポッドをスケジュールできます。
- ラベル セレクターは、アフィニティが適用されている特定のポッドをターゲットにするために使用されます。
- トポロジ キーは、ノードのニーズを定義するために使用されます。
- スケジュール モードは、ルールがどの程度厳密に適用されるかを定義するために使用されます。
- Nexus ノードの配置は設計上、ゾーン全体に均等に分散されているため、ポッドをノード全体に分散させることでゾーン冗長性も実現します。
- AOSM 演算子ポッドでは、重み 100 のソフト アンチアフィニティを使用し、ノードのホスト名に基づくトポロジ キーが使用されます。
Storage
- AOSM エッジ レジストリはノード全体に分散された複数のレプリカを持つため、永続ボリュームは ReadWriteMany (RWX) アクセス モードをサポートする必要があります。 PVC の「nexus-shared」ボリュームは、Nexus クラスターで使用でき、RWX アクセス モードをサポートしています。
Readiness Probe による監視
- AOSM では、http Readiness probe を使用して、コンテナーがトラフィックの受け入れを開始する準備ができていることを認識します。 ポッドは、すべてのコンテナーの準備ができたときに準備完了と見なされます。 ポッドが準備未完了の場合、ポッドはサービス ロード バランサーから削除されます。
システム ノード プール
- すべての AOSM 演算子ポッドは、システム ノード プールに割り当てられます。 このプールは、誤って構成されたアプリケーション ポッドまたは不正なアプリケーション ポッドがシステム ポッドに影響を与えるのを防ぎます。
水平方向のスケーリング
- Kubernetes では、HorizontalPodAutoscaler (HPA) がワークロード リソースを自動的に更新し、需要に合わせてワークロードを自動的にスケーリングすることを目的としています。 AOSM 演算子ポッドには、次の HPA ポリシー パラメーターが構成されています。
- 最低 3 つのレプリカ。
- 最大 5 つのレプリカ。
- 80% の CPU とメモリの targetAverageUtilization。
リソース制限
- リソース制限は、AOSM ポッドが実行されているノードでリソースのオーバーロードを防ぐために使用されます。 AOSM では、CPU とメモリの両方の消費を制限するために、2 つのリソース パラメーターを使用します。
- リソース要求 - ポッド用に予約する必要がある最小量。 この値は、アプリケーションの通常の負荷時のリソース配分状況に設定する必要があります。
- リソース制限 - ポッドが使用する最大量で、使用量が上限に達すると終了します。 すべての AOSM 演算子コンテナーは、適切な要求および CPU とメモリの制限で構成されています。
既知の HA の制限事項
- システム エージェント プールに単一のアクティブ ノードがある Nexus AKS (NAKS) クラスターは、高可用性には適していません。 Nexus 運用トポロジでは、システム エージェント プールで少なくとも 3 つのアクティブ ノードを使用する必要があります。
- Nexus 共有ストレージ クラスは、ネットワーク ファイル システム (NFS) ストレージ サービスです。 この NFS ストレージ サービスは、クラウド サービス ネットワーク (CSN) ごとに使用できます。 CSN に接続されている Nexus Kubernetes クラスターは、この共有ストレージ プールから永続ボリュームをプロビジョニングできます。 現在、記憶域プールの最大サイズはネットワーク クラウド (NC) 3.10 時点で 1TiB に制限されています。一方で NC 3.12 では 16 TiB オプションがあります。
- ポッドのアンチアフィニティは、ポッドの初期配置のみを処理し、その後のポッドのスケーリングや修復は、標準の K8s スケジューリング ロジックに従います。
よく寄せられる質問
以前にデプロイされた CNF アプリケーションで AOSM クラスター レジストリを使用できますか?
クラスター レジストリなしで既にデプロイされている CNF アプリケーションがある場合、自動的にコンテナー イメージを使うことはできません。 AOSM を使ってネットワーク機能をデプロイする前に、クラスター レジストリを有効にする必要があります。
デプロイの後でストレージ サイズを変更できますか?
初期デプロイの後でストレージ サイズを変更することはできません。 開始サイズの 3 倍から 4 倍でボリューム サイズを構成することをお勧めします。
現在クラスター リポジトリに格納されているファイルを一覧表示できますか?
次のコマンドを使用して、人間が判読できる形式でファイルを一覧表示できます。
kubectl get artifacts -A -o jsonpath='{range .items[*]}{.spec.sourceArtifact}'
このコマンドで、次のような出力が生成されるはずです。
ppleltestpublisheras2f88b55037.azurecr.io/nginx:1.0.0