연습 - AKS 클러스터에 클러스터 자동 크기 조정기를 사용하여 스폿 노드 풀 구성

완료됨

스폿 사용자 노드 풀을 사용하면 고성능 컴퓨팅 시나리오 지원을 통해 더 저렴한 가격으로 사용하지 않는 Azure 컴퓨팅 용량에 액세스할 수 있습니다.

이전 연습에서는 표준 사용자 노드 풀을 만들고, 클러스터 자동 크기 조정기를 사용하여 노드 만들기를 관리하고, 노드 수를 수동으로 확장했습니다.

다음 단계는 클러스터의 운영 비용을 줄이기 위해 자동 크기 조정이 가능한 스폿 사용자 노드 풀을 추가하는 것입니다. 클러스터 사용량은 필요한 리소스에 따라 다르며 예측 가능하지 않으므로 급증 및 급락을 캡처하는 규칙을 설정합니다. 워크로드는 노드 선호도가 사용하도록 설정된 상태로 배포되므로 Pod는 스폿 노드 풀의 노드에 예약됩니다.

스폿 노드 풀 만들기

일괄 처리 서비스를 지원하는 별도의 노드 풀을 만들어야 합니다. 해당 노드 풀은 삭제 제거 정책 및 스폿 최대 가격 -1을 사용하는 스폿 노드 풀입니다.

  1. 이전 연습과 동일한 az aks nodepool add 명령을 실행하여 클러스터에 새 스폿 노드 풀을 추가합니다. 노드 풀 이름을 변경하고 몇 가지 매개 변수를 더 추가하여 해당 노드 풀을 스폿 노드 풀로 식별해야 합니다.

    다음 값을 입력하여 노드 풀의 매개 변수를 설정합니다.

    • 이름: batchprocpl2
    • 우선 순위: Spot
    • 제거 정책: Delete
    • 스폿 최대 가격: -1

    다음 명령을 실행하여 작업 노드 풀을 만듭니다.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2 \
        --enable-cluster-autoscaler \
        --max-count 3 \
        --min-count 1 \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --node-vm-size Standard_DS2_v2 \
        --no-wait
    

    선택한 위치의 용량 제한으로 인해 해당 요청이 실패할 수 있다는 점에 유의하시기 바랍니다.

  2. az aks nodepool show 명령을 실행하여 일괄 처리 서비스에 대한 새 스폿 노드 풀의 세부 정보를 표시합니다.

    az aks nodepool show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2
    

    다음은 명령의 출력 예입니다.

    {
    "agentPoolType": "VirtualMachineScaleSets",
    "availabilityZones": null,
    "count": 3,
    "enableAutoScaling": true,
    "enableNodePublicIp": false,
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2",
    "maxCount": 3,
    "maxPods": 110,
    "minCount": 1,
    "mode": "User",
    "name": "batchprocpl2",
    "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
    "nodeLabels": {
        "kubernetes.azure.com/scalesetpriority": "spot"
    },
    "nodeTaints": [
        "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
    ],
    "orchestratorVersion": "1.17.9",
    "osDiskSizeGb": 128,
    "osType": "Linux",
    "provisioningState": "Creating",
    "proximityPlacementGroupId": null,
    "resourceGroup": "akscostsavinggrp",
    "scaleSetEvictionPolicy": "Delete",
    "scaleSetPriority": "Spot",
    "spotMaxPrice": -1.0,
    "tags": null,
    "type": "Microsoft.ContainerService/managedClusters/agentPools",
    "upgradeSettings": {
        "maxSurge": null
    },
    "vmSize": "Standard_DS2_v2",
    "vnetSubnetId": null
    }
    

    해당 결과의 몇 가지 값은 이전 노드 풀에서 살펴본 것과 확연히 다릅니다. 해당 항목을 검토해 보겠습니다.

    • enableAutoScaling 속성 값이 true로 설정되어 있습니다.

    • maxCountminCount 값이 모두 설정되어 있습니다.

    • scaleSetEvictionPolicy 속성이 Delete로 설정되어 있습니다.

    • scaleSetPriority 속성이 Spot로 설정되어 있습니다.

    • spotMaxPrice 속성이 -1로 설정되어 있습니다.

    • nodeLabelsnodeTaints가 노드 풀에 적용됩니다. 해당 값을 사용하여 노드 풀의 노드에 워크로드를 예약합니다.

네임스페이스 구성

  1. kubectl create namespace 명령을 실행하여 costsavings라는 애플리케이션의 네임스페이스를 만듭니다. 해당 네임스페이스를 사용하여 워크로드를 더 쉽게 선택할 수 있습니다.

    kubectl create namespace costsavings
    

    이전 명령의 출력은 다음과 같습니다.

    namespace/costsavings created
    

스폿 노드 선호도를 사용하여 Pod 예약

Pod의 배포 매니페스트 파일에 톨러레이션 및 선호도를 추가하여 Pod가 스폿 노드에서 실행되도록 예약할 수 있습니다. 톨러레이션 및 노드 선호도가 스폿 노드에 적용되는 테인트 및 레이블과 일치하면 이러한 노드에서 Pod가 예약됩니다.

스폿 노드 풀의 노드에는 kubernetes.azure.com/scalesetpriority=spot:NoSchedule과 동일한 테인트와 kubernetes.azure.com/scalesetpriority=spot과 동일한 레이블이 할당됩니다. 워크로드 YAML 매니페스트 파일의 tolerationsaffinity 섹션에서 다음 키 값 쌍의 정보를 사용합니다. 두 번째 일괄 처리 풀을 스폿 노드 풀로 구성하면 이제 배포 파일을 만들어 해당 파일에서 실행할 워크로드를 예약할 수 있습니다.

  1. 통합 편집기를 사용하여 spot-node-deployment.yaml이라는 Kubernetes 배포에 대한 매니페스트 파일을 만듭니다.

    code spot-node-deployment.yaml
    

    Cloud Shell에는 통합 파일 편집기가 포함되어 있습니다. Cloud Shell 편집기는 언어 강조 표시, 명령 팔레트, 파일 탐색기와 같은 기능을 지원합니다. 간단한 파일을 만들고 편집하려면 Cloud Shell 터미널에서 code .를 실행하여 편집기를 시작합니다. 이 작업을 수행하면 터미널에 설정된 활성 작업 디렉터리를 통해 편집기가 열립니다. 빠른 편집을 위해 매니페스트 파일을 직접 열려면 code spot-node-deployment.yaml을 실행합니다. 이 명령은 파일 탐색기 없이 편집기를 엽니다.

  2. 다음 텍스트를 파일에 붙여넣습니다.

    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"
    
  3. Ctrl+S를 눌러 파일을 저장한 다음 Ctrl+Q를 눌러 편집기를 닫습니다.

  4. kubectl apply 명령을 실행하여 구성을 적용하고 costsavings 네임스페이스에서 애플리케이션을 배포합니다.

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    이전 명령의 출력은 다음과 같습니다.

    pod/nginx created
    
  5. kubectl get pods 명령을 실행하면서 -o wide 플래그를 사용하여 실행 중인 Pod에 대한 자세한 정보를 가져올 수 있습니다. 이 경우 Pod가 예약된 노드를 확인하려고 합니다. costsavings 네임스페이스에서 Pod를 쿼리해야 합니다.

    kubectl get pods --namespace costsavings -o wide
    

    출력은 다음과 유사합니다.

    NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                                   NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          43s   10.244.3.3   aks-batchprocpl2-25254417-vmss000000   <none>           <none>
    

    노드의 이름인 aks-batchprocpl2-25254417-vmss000000을 확인합니다. 해당 노드는 앞에서 만든 batchprocpl2 스폿 노드 풀의 일부입니다.