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 クラスター内でローカルにアクセスできます。 ユーザーは、クラスター レジストリの永続ストレージ サイズを選択できます。
注
ユーザーが入力を何も指定しない場合は、永続ボリュームとして既定値の 100 GB が使われます。
クラスター レジストリ コンポーネント
クラスター レジストリ機能は、NFO 拡張機能を支援するために、ターゲット エッジ クラスターにヘルパー ポッドをデプロイします。
コンポーネント調整
- このメイン ポッドは、クラスターで実行されている Microsoft.Kubernetes リソース プロバイダー (RP)、Hybrid Relay、および Arc エージェントの助けを借りて、K8sBridge によって作成されたコンポーネント カスタム リソース オブジェクト (CRO) の調整を行います。
Webhook を変更するポッド
- これらのポッドは、Admission Webhook を変更する Kubernetes を実装し、ミューテーション API のインスタンスにサービスを提供します。 ミューテーション API では、次の 2 つの処理が行われます。
- イメージ レジストリ パスがローカル レジストリ IP に変更され、AOSM アーティファクト ストア Azure Container Registry (ACR) が置き換えられます。
- エッジ クラスターに成果物の CR を作成します。
成果物の調整
- このポッドは、ミューテーション Webhook によって作成された成果物の CRO を調整します。
レジストリ
- このポッドは、CNF のコンテナー イメージを格納および取得します。
クラスター レジストリ ガベージ コレクション
AOSM クラスター拡張機能により、バックグラウンド ガベージ コレクション (GC) ジョブが実行され、コンテナー イメージが定期的にクリーンアップされます。 このジョブはスケジュールに基づいて実行され、クラスター レジストリの使用状況が指定されたしきい値に達したかどうかを確認し、その場合はガベージ コレクション プロセスを開始します。 エンド ユーザーはジョブのスケジュールとしきい値を構成しますが、既定では、ジョブは 0% の使用率しきい値で 1 日に 1 回実行されます。
ガベージ イメージ マニフェストをクリーンアップする
AOSM では、クラスター レジストリにおけるポッド所有者リソースと使用イメージの間の参照が維持されます。 イメージのクリーンアップ プロセスを開始すると、ポッドにリンクされていないイメージが識別され、それらをクラスター レジストリから除去するためにソフト削除が実行されます。 この種類の論理的な削除では、すぐにはクラスター レジストリのストレージ スペースが解放されません。 実際のイメージ ファイルの削除は、実際のレジストリ ガベージ コレクションの設定によって異なります。
注
ポッドの所有者とそのコンテナー イメージ間の参照は、イメージが AOSM によって誤って削除されないようにしています。 たとえば、レプリカセット ポッドがダウンした場合、AOSM はコンテナー イメージを逆参照しません。 AOSM がコンテナー イメージを逆参照するのは、レプリカセットが削除された場合だけです。 Kubernetes ジョブとデーモンセットによって管理されるポッドにも、同じ原則が適用されます。
CNCF ガベージ コレクション ディストリビューション
AOSM では、オープン ソースの CNCF ディストリビューション レジストリを使用して、クラスター レジストリが設定されます。 したがって、AOSM は ガベージ コレクション | パブリック配布 が提供するガベージ コレクション機能に依存しています。 全体としては、標準 2 フェーズ "マークとスイープ" プロセスに従ってイメージ ファイルを削除し、レジストリのストレージ スペースを解放します。
注
このプロセスでは、クラスター レジストリが読み取り専用モードである必要があります。 レジストリが読み取り専用モードでないときにイメージがアップロードされると、イメージ レイヤーが誤って削除されるリスクがあり、これがイメージ破損につながります。 最大 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 つ以上、レプリカは最大 5 個です。
デプロイメント戦略
- rollingUpdate 戦略は、ダウンタイムなしのアップグレードを実現し、アプリケーションの段階的なロールアウトをサポートするために使用されます。 既定の maxUnavailable 構成では、冗長性ポリシーを満たすのに十分なポッドが作成されるまで、一度に 1 つのポッドのみを停止できます。
ポッド中断バジェット
- ポリシーの中断バジェット (PDB) は、自発的な中断からポッドを保護し、Deployment、ReplicaSet、または StatefulSet オブジェクトと共にデプロイされます。 AOSM 演算子ポッドの場合、minAvailable パラメーターが 2 の PDB が使用されます。
ポッドのアンチアフィニティ
- ポッドのアンチアフィニティは、クラスター内の複数のノードにわたるアプリケーション ポッドの分散を制御します。 HA を有効にすると、AOSM は次のアンチアフィニティ ルールを実装します。
- preferredDuringSchedulingIgnoredDuringExecution(Soft) 規則の種類が使用されます。 ソフト スケジューリングでは、基本設定条件を満たすトポロジを使用でき、Kubernetes によってポッドがスケジュールされます。 そのようなトポロジが使用できない場合でも、その設定を満たしていない他のノードでポッドをスケジュールできます。
- トポロジ キーは、kubernetes.io/hostname の値に基づいて使用されます。
- 100 の重みが使用されます。
ノード アフィニティ
ネクサス ノードの配置は、設計によってゾーン間で均等に分散されるため、ゾーン冗長になります。 AOSM は、次の規則を使用して、ノード間でポッドをさらに均等に分散させます。
- "コントロール プレーン" ロールを持たないノードを優先する (重み: 10)
- "システム" モードのノードを優先する (重み: 20)
ストレージ
- AOSM エッジ レジストリには複数のレプリカがあり、ノード間に分散されているため、永続ボリュームは ReadWriteManyX (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