클러스터 자동 크기 조정기로 AKS 스폿 노드 풀을 사용하여 여러 노드 풀 구성

완료됨

Azure는 비용을 절감하는 동시에 확장성을 제공하며 중단될 수 있는 워크로드에 적합한 Azure 가상 머신 인스턴스를 제공합니다. 하지만 이러한 VM(가상 머신)은 낮은 가격에 사용되지 않는 Azure 컴퓨팅 용량에 액세스하지만 여전히 고성능 컴퓨팅 시나리오를 지원합니다.

여러분 회사의 드론 추적 솔루션은 수많은 컨테이너화된 애플리케이션 및 서비스의 형태로 AKS(Azure Kubernetes Service)에 배포됩니다. 관련 서비스 중 하나는 드론 비행 경로를 예약하는 일괄 처리 서비스입니다. 고객 기반이 급증하면서 일괄 처리 서비스에 대한 요청이 폭주하여 제공의 백로그가 축적됩니다. 이러한 상황으로 인해 지연 및 고객 불만의 원인이 되고 있습니다.

일괄 처리 서비스 복제본(replica) 수를 자동으로 조정하면 적시에 주문 처리할 수 있습니다. 그러나 컴퓨팅 리소스 요구를 충족하기 위해 더 많은 노드를 배포해야 합니다. Azure Monitor에서 사용 추세를 분석해 보면 해당 노드는 비용 효율적인 방법이 아닌 특정 시간에만 사용됩니다. 일괄 처리 서비스는 상태 비저장 서비스이므로 클라이언트 세션 데이터를 저장하지 않습니다. 다음을 수행하여 비용을 절감할 수 있습니다.

  • 저렴한 노드 인스턴스 사용
  • 일괄 처리를 위해 구성된 노드 풀의 노드 수를 자동으로 조정합니다.

AKS에서 이 비용 절감 솔루션의 기반이 되는 인프라를 살펴보겠습니다.

Azure의 스폿 VM(스폿 가상 머신)이란?

스폿 가상 머신은 사용되지 않는 Azure 컴퓨팅 용량을 높은 할인율이 적용된 가격으로 사용할 수 있는 VM입니다. 스폿 VM은 Azure에서 우선 순위가 낮은 기존 VM을 대체합니다. 스폿 VM을 사용하여 다음과 같은 워크로드를 실행할 수 있습니다.

  • 고성능 컴퓨팅 시나리오, 일괄 처리 또는 시각적 렌더링 애플리케이션

  • 대규모 상태 비저장 애플리케이션

  • CI(연속 통합) 및 CD(지속적인 업데이트) 워크로드를 포함한 개발자/테스트 환경

스폿 VM 가용성

스폿 VM 가용성은 용량 크기, 지역 및 시간 등의 요소에 따라 달라집니다. Azure는 용량을 사용할 수 있는 경우에만 VM을 할당합니다. 따라서 이러한 유형의 VM에 대한 SLA(서비스 수준 계약)는 없으며 고가용성 보장을 제공하지 않습니다.

스폿 VM 제거 정책

스폿 VM에 대한 기본 제거 정책은 할당 취소입니다. Azure는 지역의 용량이 제한되면 30초 알림을 통해 스폿 VM을 제거합니다. 할당 취소 정책으로 설정된 VM은 제거될 때 중지-할당 취소된 상태로 전환됩니다. 스폿 용량을 다시 사용할 수 있게 되면 제거된 VM을 다시 배포할 수 있습니다. 할당 취소된 VM은 스폿 vCPU(가상 CPU) 할당량으로 계속 계산되며, 할당된 기본 디스크에 대한 요금은 여전히 적용됩니다.

스폿 가상 머신 확장 집합이란?

스폿 가상 머신 확장 집합은 Azure 스폿 VM을 지원하는 가상 머신 확장 집합입니다. 해당 VM은 일반 스폿 VM과 동일한 방식으로 작동하지만 한 가지 차이점이 있습니다. Azure에서 스폿 VM에 대한 가상 머신 확장 집합을 사용하면 두 개의 제거 정책 중에서 선택합니다.

  • 할당 취소: 할당 취소 정책은 앞에서 설명한 그대로 작동합니다.

  • 삭제: 삭제 정책을 사용하면 디스크 비용 발생을 방지하고 할당량 한도에 도달하지 않도록 할 수 있습니다. 삭제 제거 정책을 사용하면 제거된 VM이 기본 디스크와 함께 삭제됩니다. 이제 확장 집합의 자동 크기 조정 기능을 사용하여 새 VM을 만들어 VM 제거를 자동으로 보정할 수 있습니다. VM 생성은 보장되지 않지만 제거된 VM은 vCPU 할당량으로 계산되지 않으며 기본 디스크 비용이 발생하지 않습니다.

    확장 집합에서 삭제하도록 제거 정책을 설정하는 경우에만 자동 크기 조정 기능을 사용하는 것이 좋습니다.

AKS(Azure Kubernetes Service)의 스폿 노드 풀이란?

스폿 노드 풀은 스폿 가상 머신 확장 집합을 사용하는 사용자 노드 풀입니다. AKS는 다음과 같은 경우 스폿 VM을 지원합니다.

  • 사용자 노드 풀을 만들어야 합니다.
  • Azure 스폿 VM 대한 가상 머신 확장 집합 지원에서 제공하는 비용 혜택을 원합니다.

스폿 노드 풀을 사용하여 다음을 수행합니다.

  • Azure에서 사용되지 않는 용량을 활용합니다.
  • 삭제 제거 정책이 설정된 확장 집합 기능을 사용합니다.
  • 시간당 지불하려는 최대 가격을 정의합니다.
  • 스폿 노드 풀을 사용하는 경우 권장 AKS Kubernetes 클러스터 자동 크기 조정기를 사용합니다.

예를 들어 드론 추적 애플리케이션의 일괄 처리 서비스를 지원하기 위해 스폿 사용자 노드 풀을 만들고 클러스터 자동 크기 조정기를 사용하도록 설정할 수 있습니다. 그런 다음 리소스 요구 사항에 맞게 더 많은 일괄 처리 서비스를 배포하도록 수평 Pod 스케일러를 구성할 수 있습니다.

노드 수요가 증가하면 클러스터 자동 크기 조정기에서 노드 풀의 노드 수를 증감할 수 있습니다. 노드 제거가 발생하면 클러스터 자동 크기 조정기는 추가 노드가 여전히 필요한 경우 노드 수를 계속 스케일 업하려고 합니다.

스폿 노드 풀 제한 사항

AKS 클러스터에 스폿 사용자 노드 풀을 추가하기 전에 다음 제한 사항을 고려합니다.

  • 기본 스폿 확장 집합은 단일 장애 도메인에만 배포되며 고가용성을 보장하지 않습니다.
  • AKS 클러스터에는 여러 노드 풀 지원이 사용하도록 설정되어 있어야 합니다.
  • 스폿 노드 풀은 사용자 노드 풀로만 사용할 수 있습니다.
  • 스폿 노드 풀을 업그레이드할 수 없습니다.
  • 스폿 VM 생성은 보장되지 않습니다. 스폿 노드 생성은 클러스터가 배포된 Azure 지역의 용량 및 할당량 가용성에 따라 달라집니다.

스폿 노드 풀은 중단될 수 있는 워크로드에만 사용해야 한다는 점에 유의하세요.

Important

스폰서쉽 구독과 같은 일부 구독의 경우에는 스폿 VM 및 스폿 노드 풀을 만드는 기능이 제한됩니다. 클러스터에 대한 스폿 노드 풀을 만들지 못할 수 있습니다.

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

스폿 노드 풀은 AKS 클러스터의 시스템 노드 풀일 수 없습니다. 먼저 클러스터를 만든 다음 명령을 사용하여 az aks nodepool add 새 사용자 노드 풀을 추가해야 합니다.

새 노드 풀에 여러 매개 변수를 설정하여 스폿 노드 풀로 구성합니다.

우선 순위

--priority 매개 변수는 새 노드 풀에서 기본적으로 Regular로 설정됩니다. 만들려는 새 풀이 스폿 노드 풀임을 나타내려면 값을 Spot으로 설정합니다. 해당 값은 만든 후에 변경할 수 없습니다.

제거 정책

스폿 노드 풀은 가상 머신 확장 집합을 사용해야 합니다. 이전에 스폿 노드 풀이 스폿 확장 집합을 사용했음을 기억하세요. Delete 확장 집합이 노드와 노드에서 사용하는 기본 할당 디스크를 모두 제거할 수 있도록 설정 --eviction-policy 됩니다. 만든 후에는 이 값을 변경할 수 없습니다.

제거 정책을 Deallocate설정할 수 있지만 이러한 노드가 제거되면 클러스터 크기 조정 또는 업그레이드에 대한 컴퓨팅 할당량에 계속 계산됩니다.

스폿 노드의 최대 가격

스폿 노드 풀은 시간당 스폿 노드당 지불할 최대 금액을 제한하여 비용을 최적화합니다. 안전한 액수를 설정하려면 --spot-max-price 매개 변수를 사용합니다. 해당 값에 도달하면 새로 만든 스폿 노드가 제거됩니다.

이 값을 최대 5개의 소수 자릿수까지 양수로 설정하거나 으로 설정할 -1수 있습니다. --spot-max-price 값을 설정하면 -1 다음과 같은 방법으로 노드 풀에 영향을 줍니다.

  • 노드 가격에 따라 노드가 제거되지 않습니다.
  • 새 노드의 비용은 스폿 노드의 현재 가격이나 표준 노드의 가격 중 더 낮은 가격을 기준으로 합니다.

예를 들어, 값을 0.98765로 설정하면 노드의 최대 가격(USD)은 시간당 0.98765입니다. 노드 소비량이 해당 액수를 초과하면 노드가 제거됩니다.

클러스터 자동 크기 조정기 사용

--enable-cluster-autoscaler 매개 변수를 통해 클러스터 자동 크기 조정기를 사용하는 것이 좋습니다. 클러스터 자동 크기 조정기를 사용하지 않는 경우 Azure 용량 제약 조건으로 인해 노드가 제거되면 노드 풀의 노드 수가 0으로 떨어질 위험이 있습니다.

최소 노드 수

--min-count 매개 변수를 사용하여 최소 노드 수를 1에서 100 사이의 값으로 설정합니다. 클러스터 자동 크기 조정기를 사용하려는 경우 최소 노드 수가 필요합니다.

최대 노드 수

--max-count 매개 변수를 사용하여 최대 노드 수를 1에서 100 사이의 값으로 설정합니다. 클러스터 자동 크기 조정기를 사용하는 경우 최대 노드 수가 필요합니다.

샘플 구성

다음은 최대 수가 3이고 최소 수가 1인 스폿 노드 풀을 추가하는 az aks nodepool add 명령의 예입니다. 별색 노드 기능을 사용하도록 설정하려면 --enable-cluster-autoscaler를 사용하는 것을 확인합니다.

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

스폿 노드 풀에 Pod 배포

Kubernetes에서 워크로드를 배포할 때 워크로드를 실행 혹은 실행 불가능한 노드를 지정하기 위한 정보를 스케줄러에 제공할 수 있습니다. 테인트, 톨러레이션 또는 노드 선호도를 구성하여 워크로드 예약을 제어할 수 있습니다. 스폿 노드는 특정 레이블과 테인트를 사용하여 구성됩니다.

테인트란?

테인트는 노드에 적용되어 특정 Pod만 예약될 수 있음을 나타냅니다. 스폿 노드는 kubernetes.azure.com/scalesetpriority:spot으로 설정된 레이블을 사용하여 구성됩니다.

톨러레이션이란?

톨러레이션은 해당 테인트가 있는 노드에서 Pod를 예약할 수 있도록(필수는 아님) Pod에 적용되는 사양입니다. 스폿 노드는 kubernetes.azure.com/scalesetpriority=spot:NoSchedule로 설정된 노드 테인트 집합을 사용하여 구성됩니다.

참고

테인트 및 톨러레이션은 Pod가 특정 노드에 배치되도록 보장하지 않습니다. 예를 들어 노드에 taint가 없으면 pod에 연결이 붙지 않은 노드에서 예약될 수 있습니다. 테인트 및 톨러레이션을 포함하여 선호도를 지정하면 이 문제를 해결할 수 있습니다.

노드 선호도란?

노드 선호도를 사용하여 노드에 예약할 Pod를 지정할 수 있습니다. 선호도는 노드에 정의된 레이블을 사용하여 지정됩니다. 예를 들어 AKS에서 시스템 Pod는 스폿 노드에 대한 반선호도를 사용하여 구성되어 해당 노드에 예약되지 않도록 합니다.

Pod 매니페스트 파일에서 톨러레이션 정의

워크로드 매니페스트 파일에 사전 항목을 만들어 노드 테인 tolerations 트 관용을 지정합니다. 해당 사전을 통해 이 섹션에서 워크로드가 허용해야 하는 각 노드 테인트에 대해 다음 속성을 설정합니다.

속성 설명
key 노드에 지정된 노드 테인트 키-값 쌍을 식별합니다. 예를 들어 스폿 노드 풀에서 키-값 쌍은 kubernetes.azure.com/scalesetpriority:spot입니다. 이때 키는 kubernetes.azure.com/scalesetpriority입니다.
operator 톨러레이션이 테인트와 일치하도록 허용합니다. 기본 연산자는 Equal입니다. 톨러레이션과 일치하도록 Exists를 지정할 수도 있습니다. 단, Exists를 사용하는 경우에는 다음 속성(value)을 지정하지 않습니다.
value 노드에 지정된 노드 테인트 키-값 쌍의 값 부분을 나타냅니다. 예를 들어 kubernetes.azure.com/scalesetpriority:spot의 키-값 쌍이 포함된 스폿 노드 풀에서 값은 spot입니다.
effect 시스템에서 Pod 예약을 처리하는 방법을 나타냅니다. NoSchedule, PreferNoSchedule, NoExecute와 같은 세 가지 옵션이 있습니다. NoSchedule은 시스템이 Pod를 예약할 수 없도록 합니다. PreferNoSchedule은 시스템에서 Pod를 예약하지 않도록 시도하는 것을 허용합니다. NoExecute는 오염된 노드에서 이미 실행 중인 Pod를 제거하거나 Pod를 전혀 예약하지 않습니다.

Pod 매니페스트 파일에서 노드 선호도 정의

워크로드 매니페스트 파일에 affinity 항목을 만들어 선호도를 지정합니다. 이 항목에서는 각 노드 레이블에 대해 워크로드가 일치해야 하는 다음 속성을 설정합니다.

속성 설명
nodeAffinity Pod에 대한 노드 선호도 예약 규칙을 설명합니다.
requiredDuringSchedulingIgnoredDuringExecution 예약 시간에 이 필드에 지정된 선호도 요구 사항이 충족되지 않으면 Pod가 노드에 예약할 수 없습니다. 이 필드에 지정된 선호도 요구 사항이 Pod 실행 중 어느 시점(예: 업데이트로 인해) 충족되지 않는 경우 시스템은 해당 노드에서 Pod를 제거하려고 시도할 수 있습니다.
nodeSelectorTerms 노드 선택기 용어의 목록입니다. 반환된 용어는 모든 필터가 아닌 모든 필터와 일치합니다.
matchExpressions 노드 레이블별 노드 선택기 요구 사항의 목록입니다.
key 선택기가 적용되는 레이블 키입니다. 이때 키는 kubernetes.azure.com/scalesetpriority입니다.
operator 값 집합에 대한 키의 관계를 나타냅니다. 유효한 연산자는 In, NotIn, Exists, DoesNotExistGtLt입니다.
values 노드에 지정된 노드 레이블 키-값 쌍의 값 부분을 나타냅니다. 키-값 쌍 kubernetes.azure.com/scalesetpriority:spot을 갖는 스폿 노드 풀에서 값은 spot입니다.

다음은 스폿 노드 풀에 대해 톨러레이션 및 선호도가 추가된 워크로드의 예입니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  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"

지식 점검

1.

온라인 주문을 처리하고 AKS(Azure Kubernetes Services) 클러스터에서 실행되는 상태 비저장 서비스가 있다고 가정합니다. AKS 클러스터에서 스폿 노드 풀을 사용하여 클러스터에 대한 컴퓨팅 비용을 최적화하기로 결정했습니다. 어떻게 AKS 클러스터에 스폿 노드 풀을 추가합니까?

2.

이전 질문에서 설명한 서비스의 경우 스폿 노드 풀을 구성하는 데 가장 비용 효율적인 옵션인 제거 정책은 무엇입니까?

3.

이전 질문에서 설명한 서비스의 경우 스폿 사용자 노드 풀의 노드에 워크로드를 예약하려면 어떻게 해야 할까요?