연습 - AKS 클러스터에 여러 노드를 구성하고 0으로 크기 조정
Azure Kubernetes Service를 사용하면 각 노드 풀에서 실행되는 노드와 특정 워크로드를 일치시키는 다른 노드 풀을 만들 수 있습니다.
드론 추적 예제에서 팀에서 극한의 기상 조건에서 비행 경로 정보를 처리하고 최적의 비행 경로를 만드는 새로운 예측 모델링 서비스를 개발했음을 기억하세요. 이 서비스는 GPU 기반 VM(가상 머신) 지원이 필요하며 주중의 특정 요일에만 실행됩니다. 팀에서 서비스가 실행되지 않을 때 어떤 VM도 사용되지 않도록 하고자 합니다.
여기서는 AKS(Azure Kubernetes Service)에서 관리되는 Kubernetes 클러스터를 만듭니다. 다음으로, 여러 노드 풀을 지원하도록 클러스터를 구성하고 클러스터가 노드 풀의 노드 크기를 조정할 수 있도록 합니다. 그런 다음 동적 노드 수를 사용하여 사용자 워크로드를 지원하는 두 번째 노드 풀을 추가합니다. 마지막으로 노드 수를 0으로 조정하여 AKS 클러스터에서 사용되는 노드의 비용을 줄입니다.
새 리소스 그룹 만들기
Azure 계정을 사용하여 Azure Cloud Shell에 로그인합니다. Cloud Shell의 Bash 버전을 선택합니다.
이 모듈의 모든 연습에서 여기에서 만든 값을 다시 사용합니다. 나중에 사용할 수 있도록 출력을 저장합니다.
리소스 그룹을 호스팅할 지역을 선택합니다. 일부 지역에서는 이후 연습의 기능을 사용할 수 없습니다. 이러한 이유로 지역으로 eastus를 사용하는 것이 좋습니다. 다른 값을 사용하려는 경우
REGION_NAME
값을 변경합니다.다음 명령을 실행하여 변수를 등록합니다.
REGION_NAME=eastus RESOURCE_GROUP=rg-akscostsaving AKS_CLUSTER_NAME=akscostsaving-$RANDOM
팁
복사 단추를 사용하여 클립보드에 명령을 복사할 수 있습니다. 붙여넣으려면 Cloud Shell 터미널에서 새 줄을 마우스 오른쪽 단추로 클릭하고 붙여넣기를 선택하거나 Shift+Insert 바로 가기 키(macOS의 경우 ⌘+V)를 사용합니다.
명령을 실행
echo
하여 각 값을 검사 수 있습니다. 예를 들면 다음과 같습니다echo $REGION_NAME
.AKS_CLUSTER_NAME
을 기록해 두세요. 연습 전체에서 나중에 클러스터에 대한 클린 및 구성 설정에 이 값을 사용합니다.echo $AKS_CLUSTER_NAME
rg-akscostsaving이라는 새 리소스 그룹을 만듭니다. 이 리소스 그룹의 이러한 연습에서 만든 모든 리소스를 배포합니다. 단일 리소스 그룹을 사용하면 모듈을 마친 후 리소스를 더 쉽게 정리할 수 있습니다.
az group create \ --name $RESOURCE_GROUP \ --location $REGION_NAME
AKS 클러스터 만들기
리소스 그룹이 만들어지면 그룹 내에 AKS 클러스터를 만들 수 있습니다. 첫 번째 단계는 선택한 지역에서 Kubernetes 버전을 가져오는 것입니다. 이 버전은 클러스터를 구성하도록 설정되었습니다.
Kubernetes 버전을 확인하려면
az aks get-versions
명령을 실행합니다. 다음 쿼리는 미리 보기가 아닌 Kubernetes 버전을 반환합니다. 해당 값을VERSION
이라는 Bash 변수에 저장합니다. 버전 번호를 검색하고 저장하려면 다음 명령을 실행합니다.VERSION=$(az aks get-versions \ --location $REGION_NAME \ --query "values[?isPreview==null].version | [-1]" \ --output tsv) echo $VERSION
az aks create
명령을 실행하여 AKS 클러스터를 만듭니다. 클러스터는 시스템 노드 풀의 두 노드로 실행됩니다. 이 명령을 완료하는 데 몇 분 정도 걸릴 수 있습니다.az aks create \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --location $REGION_NAME \ --kubernetes-version $VERSION \ --node-count 2 \ --load-balancer-sku standard \ --vm-set-type VirtualMachineScaleSets \ --generate-ssh-keys
az aks create
명령에는 Kubernetes 클러스터를 정확하게 구성할 수 있는 몇 가지 매개 변수가 있습니다. 크기 조정 및 다중 노드 풀에 대해 클러스터에서 올바른 지원을 구성하는 데 두 가지 중요한 매개 변수:매개 변수 및 값 설명 --load-balancer-sku standard
AKS의 기본 부하 분산 장치 지원은 basic
입니다. 여러 노드 풀을 사용하는 경우basic
부하 분산 장치가 지원되지 않습니다. 값을standard
로 설정합니다.--vm-set-type VirtualMachineScaleSets
AKS에서 크기 조정 기능을 사용하려면 가상 머신 확장 집합이 필요합니다. 이 매개 변수를 사용하면 확장 집합을 지원할 수 있습니다. --node-count 2
매개 변수를 사용하여 기본 노드 풀에 두 노드가 구성되어 있는지 확인합니다. 이전에 설명한 대로 이 시스템 노드 풀에서 필수적인 시스템 서비스를 실행합니다. 프로덕션 클러스터에서 클러스터 작업 안정성을 위해--node-count 3
이상의 클러스터를 사용하는 것이 중요합니다. 이 연습에서는 비용을 고려하여 노드 두 개만 사용합니다.az aks nodepool list
명령을 실행하여 새 클러스터의 노드 풀을 나열합니다.az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
다음은 명령의 출력 예입니다.
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
노드 풀
mode
이 설정System
되고name
자동으로 할당됩니다.
노드 풀 추가
클러스터에는 단일 노드 풀이 있습니다.
az aks nodepool add
명령을 실행하여 두 번째 노드 풀을 추가합니다. 이 단계의 명령을 실행하여 세 개의 노드가 있고 이름이batchprocpl
인 사용자 노드 풀을 만듭니다. 노드 풀 이름은 소문자로 시작해야 하며 영숫자만 포함해야 합니다. 노드 풀 이름은 Linux 노드 풀의 경우 12자로 제한되고 Windows 노드 풀의 경우 6자로 제한됩니다.다음 명령을 실행합니다.
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl \ --node-count 2
az aks nodepool list
명령을 실행하여 새 클러스터의 새 노드 풀을 나열합니다.az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
다음은 명령의 출력 예입니다.
[ { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl", "mode": "User", "name": "batchprocpl", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }, { "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 2, "enableAutoScaling": null, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1", "mode": "System", "name": "nodepool1", ... "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": null, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null } ]
새 노드 풀의
mode
가User
로 설정되며name
은batchprocpl
입니다.
노드 풀의 노드 수를 0으로 조정
az aks nodepool scale
명령을 실행하여 노드 풀의 노드 크기를 수동으로 조정합니다.
az aks nodepool scale
명령을 실행하고 --node-count
매개 변수를 사용하여 노드 수 값을 0으로 설정합니다.
다음은 명령의 예입니다.
az aks nodepool scale \
--resource-group $RESOURCE_GROUP \
--cluster-name $AKS_CLUSTER_NAME \
--name batchprocpl \
--node-count 0
다음은 명령의 출력 예입니다.
{
"agentPoolType": "VirtualMachineScaleSets",
"availabilityZones": null,
"count": 0,
"enableAutoScaling": null,
"enableNodePublicIp": false,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
"maxCount": null,
"maxPods": 110,
"minCount": null,
"mode": "User",
"name": "batchprocpl",
"nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
"nodeLabels": null,
"nodeTaints": null,
"orchestratorVersion": "1.17.9",
"osDiskSizeGb": 128,
"osType": "Linux",
"provisioningState": "Succeeded",
"proximityPlacementGroupId": null,
"resourceGroup": "rg-akscostsaving",
"scaleSetEvictionPolicy": null,
"scaleSetPriority": null,
"spotMaxPrice": null,
"tags": null,
"type": "Microsoft.ContainerService/managedClusters/agentPools",
"upgradeSettings": {
"maxSurge": null
},
"vmSize": "Standard_DS2_v2",
"vnetSubnetId": null
}
노드 풀 count
매개 변수 값은 0으로 설정되고, enableAutoScaling
값은 null
로 설정됩니다. 워크로드를 예약하려면 기본적으로 노드 만들기가 자동으로 수행되지 않으므로 이 노드 풀의 노드 수를 수동으로 늘려야 합니다.
Kubernetes 컨텍스트 구성
이전 명령의 출력 결과에서 노드 풀 수는 0으로 설정됩니다. kubectl get nodes
명령을 실행하여 클러스터에서 사용 가능한 노드를 확인할 수 있습니다.
실행
kubectl
하여 클러스터의 API 서버와 상호 작용합니다.kubectl
을 연결할 수 있도록 Kubernetes 클러스터 컨텍스트를 구성해야 합니다. 컨텍스트에는 클러스터의 주소, 사용자 및 네임스페이스가 포함됩니다.az aks get-credentials
명령을 실행하여 Cloud Shell에서 Kubernetes 컨텍스트를 구성합니다.다음 명령을 실행하여 클러스터 자격 증명을 검색합니다.
az aks get-credentials \ --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME
다음은 명령의 출력 예입니다.
Merged "akscostsaving-17835" as current context in /home/user/.kube/config
노드 풀의 노드를 나열합니다.
kubectl get nodes
다음은 명령의 출력 예입니다.
NAME STATUS ROLES AGE VERSION aks-nodepool1-37990379-vmss000000 Ready agent 32m v1.17.9 aks-nodepool1-37990379-vmss000001 Ready agent 32m v1.17.9
az aks nodepool list
명령이 두 개의 노드 풀을 나열하는 경우에도 클러스터에서 두 개의 노드만 사용할 수 있으며, 둘 다nodepool1
에 있습니다.
워크로드 요청을 직접 관리하는 경우 AKS에 대한 비용을 최적화할 수 있는 좋은 전략은 다음과 같습니다.
- 노드 풀에서 노드 수를 수동으로 조정합니다.
- 비용이 높은 NV 기반 사용자 노드 풀을 0으로 스케일링합니다.
노드 크기를 조정해야 하지만 수요를 직접 제어하지 않는 전략을 살펴보겠습니다.