5.11. 고가용성 또는 단일 노드 클러스터 감지 및 지원
Operator가 OpenShift Container Platform 클러스터의 HA(고가용성) 및 비HA 모드에서 원활하게 실행되도록 Operator SDK를 사용하여 클러스터의 인프라 토폴로지를 감지하고 클러스터의 토폴로지에 맞게 리소스 요구 사항을 설정할 수 있습니다.
OpenShift Container Platform 클러스터는 여러 노드를 사용하는 HA(고가용성) 모드로 구성하거나 단일 노드를 사용하는 비-HA 모드로 구성할 수 있습니다. 단일 노드 OpenShift라고도 하는 단일 노드 클러스터에는 보다 보수적인 리소스 제약 조건이 있을 수 있습니다. 따라서 단일 노드 클러스터에 설치된 Operator가 적절하게 조정되고 제대로 실행되는 것이 중요합니다.
Operator 작성자는 AWS의 Red Hat OpenShift Service에 제공된 클러스터 고가용성 모드 API에 액세스하여 Operator SDK를 사용하여 Operator가 HA 또는 비HA 모드 중 하나의 클러스터 인프라 토폴로지를 감지할 수 있습니다. 감지된 클러스터 토폴로지를 사용하여 Operator 및 관리하는 Operand 또는 워크로드 모두에 대해 리소스 요구 사항을 토폴로지에 가장 적합한 프로필로 자동 전환하는 사용자 정의 Operator 논리를 개발할 수 있습니다.
5.11.1. 클러스터 고가용성 모드 API 정보
AWS의 Red Hat OpenShift Service는 Operator가 인프라 토폴로지를 감지하는 데 사용할 수 있는 클러스터 고가용성 모드 API를 제공합니다. 인프라 API는 인프라와 관련된 클러스터 전체 정보를 보유합니다. OLM(Operator Lifecycle Manager)에서 관리하는 Operator는 고가용성 모드를 기반으로 Operand 또는 관리되는 워크로드를 다르게 구성해야 하는 경우 인프라 API를 사용할 수 있습니다.
인프라 API에서 infrastructureTopology
상태는 컨트롤 플레인 노드에서 실행되지 않는 인프라 서비스의 기대치를 표현하며, 일반적으로 master
이외의 role
값에 대한 노드 선택기로 표시됩니다. controlPlaneTopology
상태는 일반적으로 컨트롤 플레인 노드에서 실행되는 Operand에 대한 기대치를 나타냅니다.
두 상태의 기본 설정은 HighlyAvailable
로, Operator가 여러 노드 클러스터에 있는 동작을 나타냅니다. SingleReplica
설정은 단일 노드 OpenShift라고도 하는 단일 노드 클러스터에서 사용되며 Operator는 고가용성 작업을 위해 Operand를 구성하지 않아야 함을 나타냅니다.
AWS 설치 프로그램의 Red Hat OpenShift Service는 다음 규칙에 따라 클러스터의 복제본 수를 기반으로 controlPlaneTopology
및 infrastructureTopology
상태 필드를 설정합니다.
-
컨트롤 플레인 복제본 수가 3 미만이면
controlPlaneTopology
상태가SingleReplica
로 설정됩니다. 그렇지 않으면HighlyAvailable
로 설정됩니다. -
작업자 복제본 수가 0이면 컨트롤 플레인 노드도 작업자로 구성됩니다. 따라서
infrastructureTopology
상태는controlPlaneTopology
상태와 동일합니다. -
작업자 복제본 수가 1이면
infrastructureTopology
가SingleReplica
로 설정됩니다. 그렇지 않으면HighlyAvailable
로 설정됩니다.
5.11.2. Operator 프로젝트의 API 사용 예
Operator 작성자는 다음 예와 같이 일반적인 Kubernetes 구문 및 controller-runtime
라이브러리를 사용하여 Operator 프로젝트를 업데이트하여 Infrastructure API에 액세스할 수 있습니다.
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)