연습 - AKS 클러스터에 클러스터 자동 크기 조정기를 사용하여 스폿 노드 풀 구성
스폿 사용자 노드 풀을 사용하면 고성능 컴퓨팅 시나리오 지원을 통해 더 저렴한 가격으로 사용하지 않는 Azure 컴퓨팅 용량에 액세스할 수 있습니다.
이전 연습에서는 표준 사용자 노드 풀을 만들고, 클러스터 자동 크기 조정기를 사용하여 노드 만들기를 관리하고, 노드 수를 수동으로 확장했습니다.
다음 단계는 클러스터의 운영 비용을 줄이기 위해 자동 크기 조정이 가능한 스폿 사용자 노드 풀을 추가하는 것입니다. 클러스터 사용량은 필요한 리소스에 따라 다르며 예측 가능하지 않으므로 급증 및 급락을 캡처하는 규칙을 설정합니다. 워크로드는 노드 선호도가 사용하도록 설정된 상태로 배포되므로 Pod는 스폿 노드 풀의 노드에 예약됩니다.
스폿 노드 풀 만들기
일괄 처리 서비스를 지원하는 별도의 노드 풀을 만들어야 합니다. 해당 노드 풀은 삭제 제거 정책 및 스폿 최대 가격 -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
선택한 위치의 용량 제한으로 인해 해당 요청이 실패할 수 있다는 점에 유의하시기 바랍니다.
- 이름:
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
로 설정되어 있습니다.maxCount
및minCount
값이 모두 설정되어 있습니다.scaleSetEvictionPolicy
속성이Delete
로 설정되어 있습니다.scaleSetPriority
속성이Spot
로 설정되어 있습니다.spotMaxPrice
속성이-1
로 설정되어 있습니다.nodeLabels
및nodeTaints
가 노드 풀에 적용됩니다. 해당 값을 사용하여 노드 풀의 노드에 워크로드를 예약합니다.
네임스페이스 구성
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 매니페스트 파일의 tolerations
및 affinity
섹션에서 다음 키 값 쌍의 정보를 사용합니다. 두 번째 일괄 처리 풀을 스폿 노드 풀로 구성하면 이제 배포 파일을 만들어 해당 파일에서 실행할 워크로드를 예약할 수 있습니다.
통합 편집기를 사용하여
spot-node-deployment.yaml
이라는 Kubernetes 배포에 대한 매니페스트 파일을 만듭니다.code spot-node-deployment.yaml
팁
Cloud Shell에는 통합 파일 편집기가 포함되어 있습니다. Cloud Shell 편집기는 언어 강조 표시, 명령 팔레트, 파일 탐색기와 같은 기능을 지원합니다. 간단한 파일을 만들고 편집하려면 Cloud Shell 터미널에서
code .
를 실행하여 편집기를 시작합니다. 이 작업을 수행하면 터미널에 설정된 활성 작업 디렉터리를 통해 편집기가 열립니다. 빠른 편집을 위해 매니페스트 파일을 직접 열려면code spot-node-deployment.yaml
을 실행합니다. 이 명령은 파일 탐색기 없이 편집기를 엽니다.다음 텍스트를 파일에 붙여넣습니다.
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"
Ctrl+S를 눌러 파일을 저장한 다음 Ctrl+Q를 눌러 편집기를 닫습니다.
kubectl apply
명령을 실행하여 구성을 적용하고costsavings
네임스페이스에서 애플리케이션을 배포합니다.kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
이전 명령의 출력은 다음과 같습니다.
pod/nginx created
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
스폿 노드 풀의 일부입니다.