연습 - AKS 클러스터에 여러 노드를 구성하고 0으로 크기 조정

완료됨

Azure Kubernetes Service를 사용하면 각 노드 풀에서 실행되는 노드와 특정 워크로드를 일치시키는 다른 노드 풀을 만들 수 있습니다.

드론 추적 예제에서 팀에서 극한의 기상 조건에서 비행 경로 정보를 처리하고 최적의 비행 경로를 만드는 새로운 예측 모델링 서비스를 개발했음을 기억하세요. 이 서비스는 GPU 기반 VM(가상 머신) 지원이 필요하며 주중의 특정 요일에만 실행됩니다. 팀에서 서비스가 실행되지 않을 때 어떤 VM도 사용되지 않도록 하고자 합니다.

여기서는 AKS(Azure Kubernetes Service)에서 관리되는 Kubernetes 클러스터를 만듭니다. 다음으로, 여러 노드 풀을 지원하도록 클러스터를 구성하고 클러스터가 노드 풀의 노드 크기를 조정할 수 있도록 합니다. 그런 다음 동적 노드 수를 사용하여 사용자 워크로드를 지원하는 두 번째 노드 풀을 추가합니다. 마지막으로 노드 수를 0으로 조정하여 AKS 클러스터에서 사용되는 노드의 비용을 줄입니다.

새 리소스 그룹 만들기

  1. Azure 계정을 사용하여 Azure Cloud Shell에 로그인합니다. Cloud Shell의 Bash 버전을 선택합니다.

  2. 이 모듈의 모든 연습에서 여기에서 만든 값을 다시 사용합니다. 나중에 사용할 수 있도록 출력을 저장합니다.

  3. 리소스 그룹을 호스팅할 지역을 선택합니다. 일부 지역에서는 이후 연습의 기능을 사용할 수 없습니다. 이러한 이유로 지역으로 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.

  4. AKS_CLUSTER_NAME을 기록해 두세요. 연습 전체에서 나중에 클러스터에 대한 클린 및 구성 설정에 이 값을 사용합니다.

    echo $AKS_CLUSTER_NAME
    
  5. rg-akscostsaving이라는 새 리소스 그룹을 만듭니다. 이 리소스 그룹의 이러한 연습에서 만든 모든 리소스를 배포합니다. 단일 리소스 그룹을 사용하면 모듈을 마친 후 리소스를 더 쉽게 정리할 수 있습니다.

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

AKS 클러스터 만들기

리소스 그룹이 만들어지면 그룹 내에 AKS 클러스터를 만들 수 있습니다. 첫 번째 단계는 선택한 지역에서 Kubernetes 버전을 가져오는 것입니다. 이 버전은 클러스터를 구성하도록 설정되었습니다.

  1. 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
    
  2. 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 이상의 클러스터를 사용하는 것이 중요합니다. 이 연습에서는 비용을 고려하여 노드 두 개만 사용합니다.

  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 자동으로 할당됩니다.

노드 풀 추가

  1. 클러스터에는 단일 노드 풀이 있습니다. 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
    
  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
      }
    ]
    

    새 노드 풀의 modeUser로 설정되며 namebatchprocpl입니다.

노드 풀의 노드 수를 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 명령을 실행하여 클러스터에서 사용 가능한 노드를 확인할 수 있습니다.

  1. 실행 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
    
  2. 노드 풀의 노드를 나열합니다.

    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으로 스케일링합니다.

노드 크기를 조정해야 하지만 수요를 직접 제어하지 않는 전략을 살펴보겠습니다.