가용성 영역을 사용하는 AKS(Azure Kubernetes Service) 클러스터 만들기

AKS(Azure Kubernetes Service) 클러스터는 기본 Azure 인프라의 논리적 섹션에 노드 및 스토리지와 같은 리소스를 배포합니다. 가용성 영역을 사용하면 노드가 다른 가용성 영역에 배포된 다른 노드와 물리적으로 분리됩니다. 클러스터에 구성된 여러 가용성 영역을 사용하여 배포된 AKS 클러스터는 하드웨어 오류 또는 계획된 유지 관리 이벤트를 방지할 수 있는 높은 수준의 가용성을 제공합니다.

여러 영역에 분산되도록 클러스터의 노드 풀을 정의하면 단일 영역이 중단된 경우에도 특정 노드 풀의 노드가 계속 작동할 수 있습니다. 노드 하위 집합의 오류를 허용하도록 오케스트레이션된 애플리케이션은 단일 데이터 센터에 물리적 오류가 있는 경우에도 계속 사용할 수 있습니다.

이 문서에서는 AKS 클러스터를 만들고 노드 구성 요소를 가용성 영역에 분산하는 방법을 보여 줍니다.

시작하기 전에

Azure CLI 버전 2.0.76 이상이 설치되고 구성되어 있어야 합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

제한 사항 및 지역 가용성

AKS 클러스터는 가용성 영역이 있는 모든 Azure 지역에서 가용성 영역을 사용할 수 있습니다.

가용성 영역을 사용하여 AKS 클러스터를 만들 때는 다음과 같은 제한 사항이 적용됩니다.

  • 클러스터 또는 노드 풀을 만드는 동안에만 가용성 영역을 정의할 수 있습니다.
  • 클러스터를 만든 후에는 가용성 영역을 사용하도록 기존 비가용성 영역 클러스터를 업데이트할 수 없습니다.
  • 선택한 노드 크기(VM SKU)를 선택한 모든 가용성 영역에서 사용할 수 있어야 합니다.
  • 가용성 영역이 사용하도록 설정된 클러스터를 영역 간에 배포하려면 Azure 표준 Load Balancer를 사용해야 합니다. 클러스터 만들기 시간에만 이 부하 분산 장치 유형을 정의할 수 있습니다. 표준 부하 분산 장치에 대한 자세한 내용과 제한 사항은 Azure 부하 분산 장치 표준 SKU 제한 사항을 참조하세요.

Azure 디스크 가용성 영역 지원

  • Azure 관리형 LRS 디스크를 사용하는 볼륨은 영역 중복 리소스가 아니므로 영역 간에 연결되며 지원되지 않습니다. 대상 Pod를 호스트하는 지정된 노드와 동일한 영역에 볼륨을 공동 배치해야 합니다.
  • Azure 관리형 ZRS 디스크를 사용하는 볼륨은 영역 중복 리소스입니다. 모든 영역 및 비 영역 에이전트 노드에서 해당 볼륨을 예약할 수 있습니다. StandardSSD_ZRS 디스크를 사용하여 스토리지 클래스를 만드는 방법의 예는 다음과 같습니다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-csi-zrs
provisioner: disk.csi.azure.com
parameters:
  skuName: StandardSSD_ZRS  # or Premium_ZRS
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Kubernetes는 버전 1.12부터 Azure 가용성 영역을 인식합니다. Azure Managed Disk를 참조하는 PersistentVolumeClaim 개체를 다중 영역 AKS 클러스터에 배포할 수 있으며, Kubernetes는 올바른 가용성 영역에서 이 PVC를 클레임하는 Pod를 예약하는 과정을 담당합니다.

Azure Resource Manager 템플릿 및 가용성 영역

AKS 클러스터를 만들 때 템플릿에서 가용성 영역을 지정하는 작업에 대한 다음 세부 정보를 이해합니다.

  • 예를 들어 "availabilityZones": null을 지정하여 템플릿에서 null 값을 명시적으로 정의하는 경우 Resource Manager 템플릿은 속성이 없는 것처럼 처리합니다. 즉, 클러스터가 가용성 영역에 배포되지 않습니다.
  • Resource Manager 템플릿에 "availabilityZones": 속성을 포함하지 않으면 클러스터가 가용성 영역에 배포되지 않습니다.
  • 기존 클러스터의 가용성 영역에 대한 설정을 업데이트할 수 없으며, Resource Manager 템플릿으로 AKS 클러스터를 업데이트하는 경우 동작이 다릅니다. 가용성 영역에 대한 템플릿에서 명시적으로 null 값을 설정하고 클러스터를 업데이트하는 경우 가용성 영역에 대한 클러스터가 업데이트되지 않습니다. 그러나 "availabilityZones": []와 같은 구문으로 가용성 영역 속성을 생략하면 배포가 기존 AKS 클러스터에서 가용성 영역을 사용하지 않도록 하고 실패합니다.

AKS 클러스터의 가용성 영역 개요

가용성 영역은 데이터 센터 오류에서 애플리케이션 및 데이터를 보호하는 고가용성 기능입니다. 영역은 Azure 지역 내의 고유한 물리적 위치입니다. 각 영역에는 전력, 냉각 및 네트워킹을 독립적으로 갖춘 하나 이상의 데이터 센터가 포함됩니다. 복원력을 보장하기 위해 모든 영역 사용 지역에는 항상 둘 이상의 영역이 있습니다. 한 지역 내에서 가용성 영역을 물리적으로 구분하면 애플리케이션 및 데이터를 데이터 센터 오류로부터 보호할 수 있습니다.

자세한 내용은 Azure에서 가용성 영역이란?을 참조하세요.

가용성 영역을 사용하여 배포된 AKS 클러스터는 단일 지역 내의 여러 영역에 노드를 배포할 수 있습니다. 예를 들어 미국 동부 2 지역의 클러스터는 미국 동부 2의 모든 3개 가용성 영역에 노드를 만들 수 있습니다. 이 AKS 클러스터 리소스 배포는 특정 영역의 오류에 대한 복원력을 제공하므로 클러스터 가용성이 향상됩니다.

AKS node distribution across availability zones

단일 영역을 사용할 수 없는 경우 애플리케이션은 여러 영역에 분산되도록 구성된 클러스터에서 계속 실행됩니다.

참고 항목

클러스터 자동 크기 조정기를 사용하여 가용성 영역을 구현할 때 각 영역에 단일 노드 풀을 사용하는 것이 좋습니다. --balance-similar-node-groups 매개 변수를 True로 설정하면 스케일 업 작업 중에 워크로드에 대해 영역 전체에 균형 잡힌 노드 배포를 유지할 수 있습니다. 이 방식이 구현되지 않으면 스케일 다운 작업으로 인해 영역 간 노드 균형이 중단될 수 있습니다.

가용성 영역에 AKS 클러스터 만들기

az aks create 명령을 사용하여 클러스터를 만드는 경우 --zones 매개 변수는 에이전트 노드를 배포할 가용성 영역을 지정합니다. 관리형 컨트롤 플레인 구성 요소가 배포되는 가용성 영역은 이 매개 변수에 의해 제어되지 않습니다. 클러스터 배포 중에 해당 지역의 모든 가용성 영역(있는 경우)에 자동으로 분산됩니다.

다음 예제에서는 총 3개 노드가 있는 myResourceGroup이라는 리소스 그룹에 myAKSCluster라는 AKS 클러스터를 만듭니다. 영역 1, 영역 2 및 영역 3에 하나씩 에이전트 노드가 있습니다.

az group create --name myResourceGroup --location eastus2

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --generate-ssh-keys \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --node-count 3 \
    --zones 1 2 3

AKS 클러스터를 만드는 데 몇 분이 걸립니다.

새 노드가 속해야 하는 영역을 결정할 때 지정된 AKS 노드 풀은 기본 Azure Virtual Machine Scale Sets에서 제공하는 가장 적합한 영역 균형을 사용합니다. 각 영역에 동일한 수의 VM이 있거나 확장 집합에 대한 다른 모든 영역에 대략 하나의 VM이 있는 경우 AKS 노드 풀은 “균형” 상태입니다.

영역 간 노드 배포 확인

클러스터가 준비되면 확장 집합의 에이전트 노드가 속한 가용성 영역을 나열합니다.

먼저 az aks get-credentials 명령을 사용하여 AKS 클러스터의 자격 증명을 가져옵니다.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

다음으로 kubectl describe 명령을 사용하여 클러스터의 노드를 나열하고 topology.kubernetes.io/zone 값을 필터링합니다. 다음은 Bash 셸에 대한 예입니다.

kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"

다음 예제 출력은 첫 번째 가용성 영역에 대한 eastus2-1, 두 번째 가용성 영역에 대한 eastus2-2와 같이 지정된 지역 및 가용성 영역에 분산된 세 개의 노드를 보여 줍니다.

Name:       aks-nodepool1-28993262-vmss000000
            topology.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000001
            topology.kubernetes.io/zone=eastus2-2
Name:       aks-nodepool1-28993262-vmss000002
            topology.kubernetes.io/zone=eastus2-3

에이전트 풀에 노드를 더 추가하면 Azure 플랫폼에서 기본 VM을 지정된 가용성 영역에 자동으로 배포합니다.

Kubernetes 버전 1.17.0 이상에서 AKS는 최신 레이블 topology.kubernetes.io/zone 및 사용되지 않는 failure-domain.beta.kubernetes.io/zone을 사용합니다. 다음 스크립트를 실행하면 이전 단계에서 kubelet describe nodes 명령을 실행한 것과 동일한 결과를 얻을 수 있습니다.

kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'

다음 예제는 더 자세한 정보가 포함된 출력과 유사합니다.

NAME                                REGION   ZONE
aks-nodepool1-34917322-vmss000000   eastus   eastus-1
aks-nodepool1-34917322-vmss000001   eastus   eastus-2
aks-nodepool1-34917322-vmss000002   eastus   eastus-3

영역 간 Pod 배포 확인

잘 알려진 레이블, 주석 및 Taint에 설명된 대로, Kubernetes는 topology.kubernetes.io/zone 레이블을 사용하여 사용 가능한 여러 영역에 복제 컨트롤러 또는 서비스에 Pod를 자동으로 배포합니다. 레이블을 테스트하고 클러스터를 3개에서 5개 노드로 스케일링하려면 다음 명령을 실행하여 Pod가 올바르게 분산되는지 확인합니다.

az aks scale \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 5

몇 분 후에 스케일링 작업이 완료되면 Bash 셸에서 kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone" 명령을 실행합니다. 다음 출력은 결과와 유사합니다.

Name:       aks-nodepool1-28993262-vmss000000
            topology.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000001
            topology.kubernetes.io/zone=eastus2-2
Name:       aks-nodepool1-28993262-vmss000002
            topology.kubernetes.io/zone=eastus2-3
Name:       aks-nodepool1-28993262-vmss000003
            topology.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000004
            topology.kubernetes.io/zone=eastus2-2

이제 영역 1과 2에 두 개의 추가 노드가 있습니다. 3개의 복제본으로 구성된 애플리케이션을 배포할 수 있습니다. 다음 예제에서는 NGINX를 사용합니다.

kubectl create deployment nginx --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
kubectl scale deployment nginx --replicas=3

Pod가 실행되는 노드를 보면 3개의 다른 가용성 영역에 해당하는 노드에서 Pod가 실행되고 있는 것을 볼 수 있습니다. 예를 들어 Bash 셸에서 kubectl describe pod | grep -e "^Name:" -e "^Node:" 명령을 사용하면 다음 예제 출력이 표시됩니다.

Name:         nginx-6db489d4b7-ktdwg
Node:         aks-nodepool1-28993262-vmss000000/10.240.0.4
Name:         nginx-6db489d4b7-v7zvj
Node:         aks-nodepool1-28993262-vmss000002/10.240.0.6
Name:         nginx-6db489d4b7-xz6wj
Node:         aks-nodepool1-28993262-vmss000004/10.240.0.8

이전 출력에서 볼 수 있듯이, 첫 번째 Pod는 가용성 영역 eastus2-1에 있는 노드 0에서 실행됩니다. 두 번째 Pod는 eastus2-3에 해당하는 노드 2에서 실행되며, 세 번째 Pod는 eastus2-2의 노드 4에서 실행됩니다. 추가 구성 없이도 Kubernetes는 세 개 가용성 영역 모두에 Pod를 올바르게 분산합니다.

다음 단계

이 문서에서는 가용성 영역을 사용하는 AKS 클러스터를 만드는 방법을 설명했습니다. 고가용성 클러스터의 추가 고려 사항은 AKS의 비즈니스 연속성 및 재해 복구를 위한 모범 사례를 참조하세요.