Share via


ARO(Azure Red Hat OpenShift) 클러스터에 인프라 노드 배포

ARO를 사용하면 인프라 컴퓨터 집합을 사용하여 기본 라우터, 통합 컨테이너 레지스트리 및 클러스터 메트릭 및 모니터링을 위한 구성 요소와 같은 인프라 구성 요소만 호스트하는 컴퓨터를 만들 수 있습니다. 이러한 인프라 머신에는 OpenShift 비용이 발생하지 않습니다. Azure Compute 비용만 발생합니다.

프로덕션 배포에서는 인프라 구성 요소를 포함할 3개의 컴퓨터 집합을 배포하는 것이 좋습니다. 이러한 각 노드를 다른 가용성 영역에 배포하여 가용성을 높일 수 있습니다. 이 유형의 구성에는 각 가용성 영역에 대해 하나씩 3개의 컴퓨터 집합이 필요합니다. 인프라 노드 크기 조정 지침은 권장 인프라 사례를 참조하세요.

정규화된 워크로드

다음 인프라 워크로드에는 Azure Red Hat OpenShift 작업자 구독이 발생하지 않습니다.

  • 마스터에서 실행되는 Kubernetes 및 Azure Red Hat OpenShift 컨트롤 플레인 서비스

  • 기본 라우터

  • 통합 컨테이너 이미지 레지스트리

  • HAProxy 기반 수신 컨트롤러

  • 사용자 정의 프로젝트 모니터링을 위한 구성 요소를 비롯한 클러스터 메트릭 컬렉션 또는 모니터링 서비스

  • 클러스터 집계 로깅

Important

인프라 노드에서 지정된 종류 이외의 워크로드를 실행하면 SLA(서비스 수준 계약) 및 클러스터의 안정성에 영향을 줄 수 있습니다.

시작하기 전에

ARO 클러스터에 추가된 Azure VM이 추가 작업자 노드가 아닌 인프라 노드로 인식되고 OpenShift 요금이 부과되지 않도록 하려면 다음 조건을 충족해야 합니다.

  • 노드는 다음 인스턴스 유형 중 하나여야 합니다.

    • Standard_E4s_v5
    • Standard_E8s_v5
    • Standard_E16s_v5
    • Standard_E4as_v5
    • Standard_E8as_v5
    • Standard_E16as_v5
  • 3개 미만의 노드만 있을 수 있습니다. 추가 노드에는 OpenShift 요금이 청구됩니다.

  • 노드에는 Azure 태그 node_role: infra가 있어야 합니다.

  • 인프라 노드에 지정된 워크로드만 허용됩니다. 다른 모든 워크로드는 이러한 작업자 노드로 간주되므로 요금이 부과됩니다. 이로 인해 SLA가 무효화되고 클러스터의 안정성이 손상될 수 있습니다.

인프라 컴퓨터 집합 만들기

  1. 아래 템플릿을 사용하여 인프라 컴퓨터 집합에 대한 매니페스트 정의를 만듭니다.

  2. "<>" 사이의 모든 필드를 특정 값으로 바꿉니다.

    예를 들어 location: <REGION>location: westus2으로 바꿉니다.

  3. 필요한 값을 채우는 데 도움이 필요한 경우 명령 및 값을 참조하세요.

  4. oc create -f <machine-set-filename.yaml> 명령을 사용하여 컴퓨터 집합을 만듭니다.

  5. 컴퓨터 집합의 생성을 확인하려면 oc get machineset -n openshift-machine-api 명령을 실행합니다.

    확인 명령의 출력은 아래와 유사합니다.

    NAME                            DESIRED     CURRENT  READY   AVAILABLE   AGE
    ok0608-vkxvw-infra-westus21     1           1        1       1           165M
    ok0608-vkxvw-worker-westus21    1           1        1       1           4H24M
    ok0608-vkxvw-worker-westus22    1           1        1       1           4H24M 
    ok0608-vkxvw-worker-westus23    1           1        1       1           4H24M
    

매니페스트 정의 템플릿

위의 절차에서 다음 템플릿을 사용하여 인프라 컴퓨터 집합에 대한 매니페스트 정의를 만듭니다.

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID> 
    machine.openshift.io/cluster-api-machine-role: infra 
    machine.openshift.io/cluster-api-machine-type: infra 
  name: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID>
      machine.openshift.io/cluster-api-machineset: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
  template:
    metadata:
      creationTimestamp: null
      labels:
        machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID>
        machine.openshift.io/cluster-api-machine-role: infra 
        machine.openshift.io/cluster-api-machine-type: infra 
        machine.openshift.io/cluster-api-machineset: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
    spec:
      metadata:
        creationTimestamp: null
        labels:
          machine.openshift.io/cluster-api-machineset: <OPTIONAL: Specify the machine set name to enable the use of availability sets. This setting only applies to new compute machines.> 
          node-role.kubernetes.io/infra: ''
      providerSpec:
        value:
          apiVersion: azureproviderconfig.openshift.io/v1beta1
          credentialsSecret:
            name: azure-cloud-credentials
            namespace: openshift-machine-api
          image: 
            offer: aro4
            publisher: azureopenshift
            sku: <SKU>
            version: <VERSION>
          kind: AzureMachineProviderSpec
          location: <REGION>
          metadata:
            creationTimestamp: null
          natRule: null
          networkResourceGroup: <NETWORK_RESOURCE_GROUP>
          osDisk:
            diskSizeGB: 128
            managedDisk:
              storageAccountType: Premium_LRS
            osType: Linux
          publicIP: false
          resourceGroup: <CLUSTER_RESOURCE_GROUP>
          tags:
            node_role: infra
          subnet: <SUBNET_NAME>   
          userDataSecret:
            name: worker-user-data 
          vmSize: <Standard_E4s_v5, Standard_E8s_v5, Standard_E16s_v5>
          vnet: aro-vnet 
          zone: <ZONE>
      taints: 
      - key: node-role.kubernetes.io/infra
        effect: NoSchedule

명령 및 값

다음은 템플릿을 만들고 실행할 때 사용되는 몇 가지 일반적인 명령/값입니다.

모든 컴퓨터 집합을 나열합니다.

oc get machineset -n openshift-machine-api

특정 컴퓨터 집합에 대한 세부 정보를 가져옵니다.

oc get machineset <machineset_name> -n openshift-machine-api -o yaml

클러스터 리소스 그룹:

oc get infrastructure cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}'

네트워크 리소스 그룹:

oc get infrastructure cluster -o jsonpath='{.status.platformStatus.azure.networkResourceGroupName}'

인프라 ID:

oc get infrastructure cluster -o jsonpath='{.status.infrastructureName}'

지역:

oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.location}'

SKU:

oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.image.sku}'

서브넷:

oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.subnet}'

버전:

oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.image.version}'

Vnet:

oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.vnet}'

워크로드를 새 인프라 노드로 이동

아래 지침을 사용하여 인프라 워크로드를 이전에 만든 인프라 노드로 이동합니다.

수신

클러스터에 있을 수 있는 추가 수신 컨트롤러에 대해 이 절차를 사용합니다.

참고 항목

애플리케이션의 수신 리소스 요구 사항이 매우 높은 경우 작업자 노드 또는 전용 컴퓨터 집합에 분산하는 것이 더 나을 수 있습니다.

  1. ingresscontrollernodePlacementnode-role.kubernetes.io/infra로 설정하고 인프라 노드 수에 맞게 replicas를 늘립니다.

    oc patch -n openshift-ingress-operator ingresscontroller default --type=merge  \
     -p='{"spec":{"replicas":3,"nodePlacement":{"nodeSelector":{"matchLabels":{"node-role.kubernetes.io/infra":""}},"tolerations":[{"effect":"NoSchedule","key":"node-role.kubernetes.io/infra","operator":"Exists"}]}}}'
    
  2. 수신 컨트롤러 운영자가 새 인프라 노드에서 Pod를 시작하고 있는지 확인합니다.

    oc -n openshift-ingress get pods -o wide
    
    NAME                              READY   STATUS        RESTARTS   AGE   IP         NODE                                                    NOMINATED NODE   READINESS GATES
    router-default-69f58645b7-6xkvh   1/1     Running       0          66s   10.129.6.6    cz-cluster-hsmtw-infra-aro-machinesets-eastus-3-l6dqw   <none>           <none>
    router-default-69f58645b7-vttqz   1/1     Running       0          66s   10.131.4.6    cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r   <none>           <none>
    router-default-6cb5ccf9f5-xjgcp   1/1     Terminating   0          23h   10.131.0.11   cz-cluster-hsmtw-worker-eastus2-xj9qx                   <none>           <none>
    

등록

  1. 레지스트리의 nodePlacementnode-role.kubernetes.io/infra로 설정합니다.

    oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge \
    -p='{"spec":{"affinity":{"podAntiAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"podAffinityTerm":{"namespaces":["openshift-image-registry"],"topologyKey":"kubernetes.io/hostname"},"weight":100}]}},"logLevel":"Normal","managementState":"Managed","nodeSelector":{"node-role.kubernetes.io/infra":""},"tolerations":[{"effect":"NoSchedule","key":"node-role.kubernetes.io/infra","operator":"Exists"}]}}'
    
  2. 레지스트리 운영자가 새 인프라 노드에서 Pod를 시작하고 있는지 확인합니다.

    oc -n openshift-image-registry get pods -l "docker-registry" -o wide
    
    NAME                              READY   STATUS    RESTARTS   AGE     IP           NODE                                                    NOMINATED NODE   READINESS GATES
    image-registry-84cbd76d5d-cfsw7   1/1     Running   0          3h46m   10.128.6.7   cz-cluster-hsmtw-infra-aro-machinesets-eastus-2-kljml   <none>           <none>
    image-registry-84cbd76d5d-p2jf9   1/1     Running   0          3h46m   10.129.6.7   cz-cluster-hsmtw-infra-aro-machinesets-eastus-3-l6dqw   <none>           <none>
    

클러스터 모니터링

  1. 인프라 노드를 사용하도록 클러스터 모니터링 스택을 구성합니다.

    참고 항목

    이렇게 하면 클러스터 모니터링 스택에 대한 다른 사용자 지정이 재정의되므로 명령을 실행하기 전에 기존 사용자 지정을 병합할 수 있습니다.

    cat << EOF | oc apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-monitoring-config
      namespace: openshift-monitoring
    data:
      config.yaml: |+
        alertmanagerMain:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        prometheusK8s:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        prometheusOperator: {}
        grafana:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        k8sPrometheusAdapter:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        kubeStateMetrics:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        telemeterClient:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        openshiftStateMetrics:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
        thanosQuerier:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations:
            - effect: "NoSchedule"
              key: "node-role.kubernetes.io/infra"
              operator: "Exists"
    EOF
    
  2. OpenShift 모니터링 운영자가 새 인프라 노드에서 Pod를 시작하고 있는지 확인합니다. 일부 노드(예: prometheus-operator)는 마스터 노드에 유지됩니다.

    oc -n openshift-monitoring get pods -o wide
    
    NAME                                           READY   STATUS    RESTARTS   AGE     IP            NODE                                                    NOMINATED NODE   READINESS GATES
    alertmanager-main-0                            6/6     Running   0          2m14s   10.128.6.11   cz-cluster-hsmtw-infra-aro-machinesets-eastus-2-kljml   <none>           <none>
    alertmanager-main-1                            6/6     Running   0          2m46s   10.131.4.11   cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r   <none>           <none>
    cluster-monitoring-operator-5bbfd998c6-m9w62   2/2     Running   0          28h     10.128.0.23   cz-cluster-hsmtw-master-1                               <none>           <none>
    grafana-599d4b948c-btlp2                       3/3     Running   0          2m48s   10.131.4.10   cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r   <none>           <none>
    kube-state-metrics-574c5bfdd7-f7fjk            3/3     Running   0          2m49s   10.131.4.8    cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r   <none>           <none>
    

DNS

  1. DNS Pod가 인프라 노드에서 실행되도록 허용합니다.

    oc edit dns.operator/default
    
    apiVersion: operator.openshift.io/v1
    kind: DNS
    metadata:
    name: default
    spec:
    nodePlacement:
      tolerations:
      - operator: Exists
    
  2. DNS Pod가 모든 인프라 노드에 예약되어 있는지 확인합니다.

oc get ds/dns-default -n openshift-dns
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
dns-default   7         7         7       7            7           kubernetes.io/os=linux   35d