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 が無効になり、クラスターの安定性が損なわれる可能性もあります。
インフラストラクチャ マシン セットの作成
次のテンプレートを使用して、インフラストラクチャ マシン セットのマニフェスト定義を作成します。
"<>" の間にあるすべてのフィールドを実際の値に置き換えます。
たとえば、
location: <REGION>
をlocation: westus2
に置き換えます。必要な値の入力については、「コマンドと値」を参照してください。
次のコマンドでマシン セットを作成します:
oc create -f <machine-set-filename.yaml>
マシン セットの作成を確認するには、次のコマンドを実行します:
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: <VNET_NAME>
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
アプリケーションのイングレス リソース要件が非常に高い場合は、ワーカー ノードまたは専用のマシン セットに分散する方が適している場合もあります。
ingresscontroller
のnodePlacement
をnode-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"}]}}}'
イングレス コントローラー オペレーターが新しいインフラストラクチャ ノードでポッドを起動していることを確認します。
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>
レジストリ
レジストリ上の
nodePlacement
をnode-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"}]}}'
レジストリ オペレーターが新しいインフラストラクチャ ノードでポッドを起動していることを確認します。
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>
クラスターの監視
インフラストラクチャ ノードを使用するようにクラスター監視スタックを構成します。
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
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
DNS ポッドをインフラストラクチャ ノードで実行できるようにします。
oc edit dns.operator/default
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: nodePlacement: tolerations: - operator: Exists
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