AKS(Azure Kubernetes Service) 클러스터에 Azure Spot 노드 풀 추가

이 문서에서는 기존 AKS(Azure Kubernetes Service) 클러스터에 보조 스폿 노드 풀을 추가합니다.

스폿 노드 풀은 Azure Spot 가상 머신 확장 집합에서 지원되는 노드 풀입니다. AKS 클러스터의 스폿 VM을 사용하면 상당한 비용 절감과 함께 사용되지 않는 Azure 용량을 활용할 수 있습니다. 사용 가능한 미사용 용량은 노드 크기, 지역 및 시간과 같은 여러 요인에 따라 달라집니다.

스폿 노드 풀을 배포할 때 Azure는 사용 가능한 용량이 있는 경우 스폿 노드를 할당하고 단일 기본 도메인에서 스폿 노드 풀을 지원하는 스폿 확장 집합을 배포합니다. 스폿 노드에 대한 SLA는 없습니다. 고가용성이 보장되지 않습니다. Azure에 용량이 다시 필요한 경우 Azure 인프라는 스폿 노드를 제거합니다.

스폿 노드는 중단, 조기 종료 또는 제거를 처리할 수 있는 워크로드에 적합합니다. 예를 들어, 일괄 처리 작업, 개발 및 테스트 환경과 같은 워크로드와 대규모 컴퓨팅 워크로드는 스폿 노드 풀에서 예약하기에 좋은 후보일 수 있습니다.

시작하기 전에

  • 이 문서에서는 Kubernetes 및 Azure Load Balancer 개념을 기본적으로 이해하고 있다고 가정합니다. 자세한 내용은 AKS(Azure Kubernetes Service)의 Kubernetes 핵심 개념을 참조하세요.
  • Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • 스폿 노드 풀을 사용하기 위해 클러스터를 만들 때 해당 클러스터는 노드 풀 및 표준 SKU 부하 분산 장치에 Virtual Machine Scale Sets를 사용해야 합니다. 또한 클러스터를 만든 후 다른 노드 풀을 추가해야 합니다. 이에 대해서는 이 자습서에서 다룹니다.
  • 이 문서를 진행하려면 Azure CLI 버전 2.14 이상을 실행하고 있어야 합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

제한 사항

스폿 노드 풀을 사용하여 AKS 클러스터를 만들고 관리할 때 다음 제한 사항이 적용됩니다.

  • 스폿 노드 풀은 기본 노드 풀이 될 수 없으며 보조 풀로만 사용할 수 있습니다.
  • 컨트롤 플레인과 노드 풀을 동시에 업그레이드할 수 없습니다. 컨트롤 플레인과 나머지 노드 풀을 동시에 업그레이드하려면 별도로 업그레이드하거나 스폿 노드 풀을 제거해야 합니다.
  • 스폿 노드 풀은 Virtual Machine Scale Sets를 사용해야 합니다.
  • 만든 후에는 ScaleSetPriority 또는 SpotMaxPrice를 변경할 수 없습니다.
  • SpotMaxPrice를 설정할 때 값은 -1 또는 소수점 이하 다섯 자리까지의 양수 값이어야 합니다.
  • 스폿 노드 풀에는 kubernetes.azure.com/scalesetpriority:spot 레이블, kubernetes.azure.com/scalesetpriority=spot:NoSchedule 테인트가 있고 시스템 Pod에는 선호도 방지가 있습니다.
  • 스폿 노드 풀에서 워크로드를 예약하려면 해당 toleration 및 선호도를 추가해야 합니다.

AKS 클러스터에 스폿 노드 풀 추가

기존 클러스터에 스폿 노드 풀을 추가할 때 여러 노드 풀이 사용하도록 설정된 클러스터여야 합니다. 여러 노드 풀이 사용하도록 설정된 AKS 클러스터를 만들 때 기본적으로 priorityRegular인 노드 풀을 만듭니다. 스폿 노드 풀을 추가하려면 Spotpriority의 값으로 지정해야 합니다. 여러 노드 풀이 있는 AKS 클러스터를 만드는 방법에 대한 자세한 내용은 여러 노드 풀 사용을 참조하세요.

  • az aks nodepool add 명령을 사용하여 prioritySpot인 노드 풀을 만듭니다.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name spotnodepool \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3 \
        --no-wait
    

이전 명령에서 Spotpriority는 노드 풀을 스폿 노드 풀로 만듭니다. eviction-policy 매개 변수는 기본값인 Delete로 설정됩니다. 제거 정책Delete로 설정하면 노드 풀의 기본 확장 집합에 있는 노드가 제거될 때 삭제됩니다.

제거 정책을 Deallocate로 설정할 수도 있습니다. 즉, 제거 시 기본 확장 집합의 노드가 중지-할당 취소 상태로 설정됩니다. 중지-할당 취소 상태의 노드는 컴퓨팅 할당량에 포함되며 클러스터 확장 또는 업그레이드에 문제를 일으킬 수 있습니다. 노드 풀을 만드는 동안 priorityeviction-policy 값만 설정할 수 있습니다. 이러한 값은 나중에 업데이트할 수 없습니다.

이전 명령은 클러스터 자동 크기 조절기도 사용하도록 설정하며 스폿 노드 풀과 함께 사용하는 것이 좋습니다. 클러스터에서 실행 중인 워크로드에 따라 클러스터 자동 배율 조정기는 노드 수를 늘리거나 줄입니다. 스폿 노드 풀의 경우 추가 노드가 여전히 필요한 경우 클러스터 자동 크기 조정기가 제거 후 노드 수를 확장합니다. 노드 풀에 포함될 수 있는 최대 노드 수를 변경하는 경우 클러스터 자동 크기 조정기와 관련된 maxCount 값도 조정해야 합니다. 클러스터 자동 크기 조정기를 사용하지 않는 경우 제거 시 스폿 풀은 결국 0으로 감소하고 추가 스폿 노드를 수신하려면 수동 작업이 필요합니다.

Important

일괄 처리 작업 및 테스트 환경과 같이 중단을 처리할 수 있는 스폿 노드 풀에서만 워크로드를 예약합니다. 노드 제거를 처리할 수 있는 워크로드만 스폿 노드 풀에서 예약되도록 스폿 노드 풀에서 오염 및 내결함성을 설정하는 것이 좋습니다. 예를 들어, 위의 명령은 kubernetes.azure.com/scalesetpriority=spot:NoSchedule의 taint를 추가하므로 해당 toleration이 있는 Pod만 이 노드에서 예약됩니다.

스폿 노드 풀 확인

  • az aks nodepool show 명령을 사용하고 scaleSetPrioritySpot인지 확인하여 노드 풀이 추가되었는지 확인합니다.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

스폿 노드에서 실행할 Pod 예약

스폿 노드에서 실행되도록 Pod를 예약하려면 스폿 노드에 적용된 taint와 일치하는 toleration 및 노드 선호도를 추가할 수 있습니다.

다음 예에서는 kubernetes.azure.com/scalesetpriority=spot:NoSchedule 테인트에 해당하는 허용 오차와 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 노드 선호도 규칙을 사용하여 이전 단계에서 사용된 kubernetes.azure.com/scalesetpriority=spot 레이블에 해당하는 노드 선호도를 정의하는 YAML 파일의 일부를 보여 줍니다.

spec:
  containers:
  - name: spot-example
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

이 내결함성 및 노드 선호도를 사용하여 Pod를 배포하면 Kubernetes는 taint 및 레이블이 적용된 노드에서 Pod를 성공적으로 예약합니다. 이 예에서는 다음 규칙이 적용됩니다.

  • 노드에는 반드시 키가 kubernetes.azure.com/scalesetpriority인 레이블이 있어야 하며, 해당 레이블의 값은 반드시spot이어야 합니다.
  • 노드에 키가 another-node-label-key인 레이블이 있는 것이 바람직하며 해당 레이블의 값은 반드시another-node-label-value여야 합니다.

자세한 내용은 노드에 Pod 할당을 참조하세요.

스폿 노드 풀 업그레이드

스폿 노드 풀을 업그레이드할 때 AKS는 내부적으로 차단 및 제거 알림을 발급하지만 드레인은 적용되지 않습니다. 스폿 노드 풀 업그레이드에 사용할 수 있는 서지 노드가 없습니다. 이러한 변경 내용 외에 스폿 노드 풀을 업그레이드할 때의 동작은 다른 노드 풀 형식의 동작과 일치합니다.

업그레이드에 대한 자세한 내용은 AKS 클러스터 업그레이드를 참조하세요.

스폿 풀의 최대 가격

지역 및 SKU에 따라 스폿 인스턴스 가격이 변동됩니다. 자세한 내용은 LinuxWindows의 가격 책정 정보를 참조하세요.

가변 가격 책정을 사용하면 최대 가격을 소수점 이하 다섯 자리까지 USD(미국 달러)로 설정할 수 있습니다. 예를 들어 0.98765 값은 시간당 $0.98765 USD의 최대 가격입니다. 최대 가격을 -1로 설정하면 가격에 따라 인스턴스가 제거되지 않습니다. 사용 가능한 용량과 할당량이 있는 한 인스턴스 가격은 스폿 인스턴스 또는 표준 인스턴스의 현재 가격보다 낮은 가격이 됩니다.

다음 단계

이 문서에서는 AKS 클러스터에 스폿 노드 풀을 추가하는 방법을 알아보았습니다. 노드 풀에서 Pod를 제어하는 ​​방법에 대한 자세한 내용은 AKS의 고급 스케줄러 기능에 대한 모범 사례를 참조하세요.