5.10. 高可用性または単一ノードのクラスターの検出およびサポート

OpenShift Container Platform クラスターは、複数のノードを使用する高可用性 (HA) モード、または単一ノードを使用する非 HA モードで設定できます。単一ノード OpenShift とも呼ばれる単一ノードクラスターには、より慎重なリソース制約がある可能性があります。したがって、単一ノードクラスターにインストールされた Operator がそれに応じて調整でき、正常に実行できることが重要です。

OpenShift Container Platform で提供されるクラスター高可用性モード API にアクセスすることにより、Operator の作成者は、Operator SDK を使用して、Operator がクラスターのインフラストラクチャートポロジー (HA モードまたは非 HA モード) を検出できるようにすることができます。カスタム Operator ロジックは、検出されたクラスタートポロジーを使用して、Operator およびそれが管理するオペランドまたはワークロードの両方のリソース要件を、トポロジーに最も適したプロファイルに自動的に切り替えるように開発することができます。

5.10.1. クラスターの高可用性モード API について

OpenShift Container Platform には、クラスターの高可用性モード API が同梱されており、Operator が使用して、インフラストラクチャートポロジーが検出できるようにします。インフラストラクチャー API は、インフラストラクチャーに関するクラスター全体の情報を保持します。Operator Lifecycle Manager(OLM) 管理の Operator は、高可用性モードに基づいてオペランドまたは管理ワークロードを異なる方法で設定する必要がある場合にインフラストラクチャー API を使用できます。

インフラストラクチャー API では、infrastructureTopology ステータスは、コントロールプレーンノードで実行されないインフラストラクチャーサービスの期待値を表します。通常、これは値が master 以外の ロール のノードセレクターでわかります。controlPlaneTopology ステータスは、通常コントロールプレーンノードで実行されるオペランドの期待値を表します。

ステータスがいずれの場合もデフォルト設定は HighlyAvailable で、複数ノードクラスターで Operator が行う動作を表します。SingleReplica 設定は単一ノード OpenShift としても知られる単一ノードクラスターで使用され、Operator はオペランドを高可用性の操作向けに設定すべきでないことを示します。

OpenShift Container Platform インストーラーは、以下のルールに従って、クラスターのレプリカ数に基づいて controlPlaneTopologyinfrastructureTopology ステータスのフィールドを設定します。

  • コントロールプレーンのレプリカ数が 3 未満の場合には、controlPlaneTopology のステータスは SingleReplica に設定されます。それ以外の場合は、HighlyAvailable に設定されます。
  • ワーカーレプリカ数が 0 の場合に、コントロールプレーンノードもワーカーとして設定されます。したがって、infrastructureTopology のステータスは controlPlaneTopology ステータスと同じです。
  • ワーカーレプリカ数が 1 の場合、infrastructureTopologySingleReplica に設定されます。それ以外の場合は、HighlyAvailable に設定されます。

5.10.2. Operator プロジェクトでの API 使用状況の例

Operator の作成者は、以下の例のように、通常の Kubernetes コンストラクトおよび controller-runtime ライブラリーを使用してインフラストラクチャー API にアクセスできるように Operator プロジェクトを更新できます。

controller-runtime ライブラリーの例

// Simple query
 nn := types.NamespacedName{
 Name: "cluster",
 }
 infraConfig := &configv1.Infrastructure{}
 err = crClient.Get(context.Background(), nn, infraConfig)
 if err != nil {
 return err
 }
 fmt.Printf("using crclient: %v\n", infraConfig.Status.ControlPlaneTopology)
 fmt.Printf("using crclient: %v\n", infraConfig.Status.InfrastructureTopology)

Kubernetes のコンストラクトの例

operatorConfigInformer := configinformer.NewSharedInformerFactoryWithOptions(configClient, 2*time.Second)
 infrastructureLister = operatorConfigInformer.Config().V1().Infrastructures().Lister()
 infraConfig, err := configClient.ConfigV1().Infrastructures().Get(context.Background(), "cluster", metav1.GetOptions{})
 if err != nil {
 return err
 }
// fmt.Printf("%v\n", infraConfig)
 fmt.Printf("%v\n", infraConfig.Status.ControlPlaneTopology)
 fmt.Printf("%v\n", infraConfig.Status.InfrastructureTopology)