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가 무효화되고 클러스터의 안정성이 손상될 수 있습니다.
인프라 컴퓨터 집합 만들기
아래 템플릿을 사용하여 인프라 컴퓨터 집합에 대한 매니페스트 정의를 만듭니다.
"<>" 사이의 모든 필드를 특정 값으로 바꿉니다.
예를 들어
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}'
워크로드를 새 인프라 노드로 이동
아래 지침을 사용하여 인프라 워크로드를 이전에 만든 인프라 노드로 이동합니다.
수신
클러스터에 있을 수 있는 추가 수신 컨트롤러에 대해 이 절차를 사용합니다.
참고 항목
애플리케이션의 수신 리소스 요구 사항이 매우 높은 경우 작업자 노드 또는 전용 컴퓨터 집합에 분산하는 것이 더 나을 수 있습니다.
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"}]}}}'
수신 컨트롤러 운영자가 새 인프라 노드에서 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>
등록
레지스트리의
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"}]}}'
레지스트리 운영자가 새 인프라 노드에서 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>
클러스터 모니터링
인프라 노드를 사용하도록 클러스터 모니터링 스택을 구성합니다.
참고 항목
이렇게 하면 클러스터 모니터링 스택에 대한 다른 사용자 지정이 재정의되므로 명령을 실행하기 전에 기존 사용자 지정을 병합할 수 있습니다.
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 모니터링 운영자가 새 인프라 노드에서 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
DNS Pod가 인프라 노드에서 실행되도록 허용합니다.
oc edit dns.operator/default
apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: nodePlacement: tolerations: - operator: Exists
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