Azure Red Hat OpenShift (ARO) クラスターにインフラストラクチャ ノードをデプロイする

ARO では、既定のルーター、統合されたコンテナー レジストリ、クラスターのメトリックと監視用のコンポーネントなどのインフラストラクチャ コンポーネントのみをホストするマシンを、インフラストラクチャ マシン セットを使用して作成できます。 これらのインフラストラクチャ マシンでは、OpenShift のコストは発生しません。Azure コンピューティング コストのみが発生します。

運用環境のデプロイでは、インフラストラクチャ コンポーネントを保持するために 3 つのマシン セットをデプロイすることをお勧めします。 これらの各ノードを異なる可用性ゾーンにデプロイして、可用性を高めることができます。 この種の構成には、可用性ゾーンごとに 1 つずつ、3 つの異なるマシン セットが必要です。 インフラストラクチャ ノードのサイズ設定のガイダンスについては、「推奨されるインフラストラクチャのプラクティス」を参照してください。

適格なワークロード

次のインフラストラクチャ ワークロードでは、Azure Red Hat OpenShift worker サブスクリプションは発生しません。

  • マスターで実行される Kubernetes および Azure Red Hat OpenShift コントロール プレーン サービス

  • デフォルトのルーター

  • 統合コンテナー イメージ レジストリ

  • HAProxy ベースのイングレス コントローラー

  • ユーザー定義プロジェクトを監視するためのコンポーネントを含む、クラスター メトリック コレクションまたは監視サービス

  • クラスター集計ログ

重要

インフラストラクチャ ノードで指定された種類以外のワークロードを実行すると、サービス レベル アグリーメント (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 料金が課金されます。

  • ノードには、node_role: infra の Azure タグが必要です

  • インフラストラクチャ ノード用に指定されたワークロードのみが許可されます。 他のワークロードはすべて、これらのワーカー ノードであると見なされるため、料金が発生します。 これにより、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}'

新しいインフラストラクチャ ノードへのワークロードの移動

以前に作成したインフラストラクチャ ノードにインフラストラクチャ ワークロードを移動するには、次の手順に従います。

イングレス

クラスターに追加のイングレス コントローラーがある可能性がある場合は、この手順を使用します。

Note

アプリケーションのイングレス リソース要件が非常に高い場合は、ワーカー ノードまたは専用のマシン セットに分散する方が適している場合もあります。

  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. イングレス コントローラー オペレーターが新しいインフラストラクチャ ノードでポッドを起動していることを確認します。

    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. レジストリ オペレーターが新しいインフラストラクチャ ノードでポッドを起動していることを確認します。

    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. インフラストラクチャ ノードを使用するようにクラスター監視スタックを構成します。

    Note

    これにより、クラスター監視スタックに対するその他のカスタマイズがオーバーライドされるため、コマンドを実行する前に既存のカスタマイズをマージできます。

    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 監視オペレーターが新しいインフラストラクチャ ノードでポッドを起動していることを確認します。 一部のノード (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 ポッドをインフラストラクチャ ノードで実行できるようにします。

    oc edit dns.operator/default
    
    apiVersion: operator.openshift.io/v1
    kind: DNS
    metadata:
    name: default
    spec:
    nodePlacement:
      tolerations:
      - operator: Exists
    
  2. DNS ポッドがすべてのインフラストラクチャ ノードに対してスケジュールされていることを確認します。

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