AKS(Azure Kubernetes Service)에서 클러스터에 대한 여러 노드 풀 만들기 및 관리
AKS(Azure Kubernetes Service)에서 동일한 구성의 노드가 노드 풀에 하나로 그룹화됩니다. 이러한 노드 풀에는 애플리케이션을 실행하는 기본 VM이 포함됩니다. 노드의 초기 수와 크기(SKU)는 시스템 노드 풀을 만드는 AKS 클러스터를 만들 때 정의됩니다. 컴퓨팅 또는 스토리지 수요가 다른 애플리케이션을 지원하기 위해 추가 사용자 노드 풀을 만들 수 있습니다. 시스템 노드 풀의 주요 목적은 CoreDNS 및 konnectivity
와 같은 중요 시스템 Pod를 호스트하는 것입니다. 사용자 노드 풀은 애플리케이션 Pod를 호스트하는 기본 목적을 제공합니다. 하지만 AKS 클러스터에 풀을 하나만 포함하려는 경우 시스템 노드 풀에 애플리케이션 Pod를 예약할 수 있습니다. 사용자 노드 풀은 애플리케이션 관련 Pod를 배치하는 위치입니다. 예를 들어 추가 사용자 노드 풀을 사용하여 컴퓨팅 집약적인 애플리케이션을 위한 GPU를 제공하거나 고성능 SSD 스토리지에 액세스할 수 있습니다.
참고
이 기능을 사용하면 여러 노드 풀을 만들고 관리하는 방법을 보다 효과적으로 제어할 수 있습니다. 결과적으로 create/update/delete에 대한 별도의 명령이 필요합니다. 이전에는 az aks create
또는 az aks update
를 통한 클러스터 작업에서 managedCluster API를 사용했으며 컨트롤 플레인과 단일 노드 풀을 변경하는 유일한 옵션이었습니다. 이 기능은 agentPool API를 통해 에이전트 풀에 대한 별도의 작업 세트를 노출하며 개별 노드 풀에서 작업을 실행하려면 az aks nodepool
명령 세트를 사용해야 합니다.
이 문서에서는 AKS 클러스터에서 여러 노드 풀을 만들고 관리하는 방법을 보여줍니다.
시작하기 전에
Azure CLI 2.2.0 이상 버전을 설치하고 구성해야 합니다. az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
제한 사항
여러 노드 풀을 지원하는 AKS 클러스터를 만들고 관리하는 경우 다음과 같은 제한 사항이 적용됩니다.
- AKS(Azure Kubernetes Service)의 할당량, 가상 머신 크기 제한 및 지역 가용성을 참조하세요
- AKS 클러스터에서 수행할 다른 시스템 노드 풀이 있으면 시스템 노드 풀을 삭제합니다.
- 시스템 풀에 하나 이상의 노드가 포함되어야 하고, 사용자 노드 풀에는 0개 이상의 노드가 포함될 수 있습니다.
- AKS 클러스터는 표준 SKU 부하 분산 장치를 사용하여 여러 노드 풀을 사용해야 합니다. 이 기능은 기본 SKU 부하 분산 장치에서는 지원되지 않습니다.
- AKS 클러스터는 노드에 대한 Virtual Machine Scale Sets를 사용해야 합니다.
- 노드 풀을 만든 후에는 노드 풀의 VM 크기를 변경할 수 없습니다.
- 노드 풀의 이름은 영숫자 소문자만 포함할 수 있고 소문자 문자로 시작해야 합니다. Linux 노드 풀의 길이는 1~12자여야 하고, Windows 노드 풀의 길이는 1~6자여야 합니다.
- 모든 노드 풀은 동일한 가상 네트워크에 있어야 합니다.
- 클러스터를 만들 때 여러 노드 풀을 만드는 경우 노드 풀에서 사용하는 모든 Kubernetes 버전은 컨트롤 플레인에 대해 설정된 버전과 일치해야 합니다. 이는 클러스터를 프로비전한 후 노드별 풀 작업을 사용하여 업데이트할 수 있습니다.
AKS 클러스터 만들기
중요
프로덕션 환경에서 AKS 클러스터에 대해 단일 시스템 노드 풀을 실행할 경우 노드 풀에 대해 노드를 3개 이상 사용하는 것이 좋습니다. 하나의 노드가 다운되면 컨트롤 플레인 리소스를 잃고 중복성이 손상됩니다. 더 많은 컨트롤 플레인 노드를 사용하여 이 위험을 완화할 수 있습니다.
시작하려면 노드 풀이 하나인 AKS 클러스터를 만듭니다. 다음 예제에서는 az group create 명령을 사용하여 eastus 지역에 myResourceGroup이라는 리소스 그룹을 만듭니다. 그런 다음, az aks create
명령을 사용하여 myAKSCluster라는 AKS 클러스터를 만듭니다.
참고
여러 노드 풀을 사용하는 경우 기본 부하 분산 장치 SKU가 지원되지 않습니다. 기본적으로 AKS 클러스터는 Azure CLI 및 Azure Portal에서 표준 부하 분산 장치 SKU를 사용하여 생성됩니다.
# Create a resource group in East US
az group create --name myResourceGroup --location eastus
# Create a basic single-node pool AKS cluster
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--vm-set-type VirtualMachineScaleSets \
--node-count 2 \
--generate-ssh-keys \
--load-balancer-sku standard
클러스터를 만드는 데 몇 분이 걸립니다.
참고
클러스터가 안정적으로 작동하려면 기본 노드 풀에서 2개 이상의 노드를 실행해야 합니다. 이 노드 풀에서 필수 시스템 서비스가 실행되고 있기 때문입니다.
클러스터가 준비되면 az aks get-credentials
명령을 사용하여 kubectl
에 사용할 클러스터 자격 증명을 가져옵니다.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
노드 풀 추가
이전 단계에서 만든 클러스터에는 노드 풀이 하나 있습니다. az aks nodepool add
명령을 사용하여 두 번째 노드 풀을 추가해 보겠습니다. 다음 예제에서는 3개 노드를 실행하는 mynodepool이라는 노드 풀을 만듭니다.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name mynodepool \
--node-count 3
참고
노드 풀의 이름은 소문자로 시작해야 하며 영숫자 문자만 포함할 수 있습니다. Linux 노드 풀의 길이는 1~12자여야 하고, Windows 노드 풀의 길이는 1~6자여야 합니다.
노드 풀의 상태를 보려면 az aks node pool list
명령을 사용하여 리소스 그룹 및 클러스터 이름을 지정합니다.
az aks nodepool list --resource-group myResourceGroup --cluster-name myAKSCluster
다음 예제 출력은 노드 풀에 3개의 노드가 있는 mynodepool을 성공적으로 만들었음을 보여줍니다. 이전 단계에서 AKS 클러스터를 만들 때 노드가 2개인 기본 nodepool1이 만들어졌습니다.
[
{
...
"count": 3,
...
"name": "mynodepool",
"orchestratorVersion": "1.15.7",
...
"vmSize": "Standard_DS2_v2",
...
},
{
...
"count": 2,
...
"name": "nodepool1",
"orchestratorVersion": "1.15.7",
...
"vmSize": "Standard_DS2_v2",
...
}
]
팁
노드 풀을 추가할 때 VmSize를 지정하지 않으면 Windows 노드 풀의 기본 크기는 Standard_D2s_v3이고 Linux 노드 풀의 기본 크기는 Standard_DS2_v2입니다. OrchestratorVersion을 지정하지 않으면 컨트롤 플레인과 동일한 버전이 기본값으로 지정됩니다.
ARM64 노드 풀 추가
ARM64 프로세서는 Kubernetes 워크로드에 대해 저전력 컴퓨팅을 제공합니다. ARM64 노드 풀을 만들려면 Dpsv5, Dplsv5 또는 Epsv5 시리즈 가상 머신을 선택해야 합니다.
제한 사항
- ARM64 노드 풀은 Defender 지원 클러스터에서 지원되지 않습니다.
- FIPS 지원 노드 풀은 ARM64 SKU에서 지원되지 않습니다.
az aks nodepool add
명령을 사용하여 ARM64 노드 풀을 추가합니다.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name armpool \
--node-count 3 \
--node-vm-size Standard_D2pds_v5
Azure Linux 노드 풀 추가
AKS용 Azure Linux 컨테이너 호스트는 AKS 컨테이너 호스트로 사용할 수 있는 오픈 소스 Linux 배포판입니다. 높은 안정성, 보안 및 일관성을 제공합니다. 컨테이너 워크로드를 실행하는 데 필요한 최소한의 패키지 집합만 포함되므로 부팅 시간과 전반적인 성능이 향상됩니다.
명령을 사용하고 를 지정하여 기존 클러스터에 Azure Linux 노드 풀을 az aks nodepool add
추가할 수 있습니다 --os-sku AzureLinux
.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name azurelinuxpool \
--os-sku AzureLinux
Ubuntu 노드를 Azure Linux로 마이그레이션
다음 지침을 사용하여 Ubuntu 노드를 Azure Linux 노드로 마이그레이션합니다.
- 명령을 사용하고 를 지정하여 기존 클러스터에
az aks nodepool add
Azure Linux 노드 풀을 추가합니다--os-sku AzureLinux
.
참고
새 Azure Linux 노드 풀을 추가할 때 하나 이상을 로 --mode System
추가해야 합니다. 추가하지 않으면 AKS에서 기존 Ubuntu 노드 풀을 삭제할 수 없습니다.
- 기존 Ubuntu 노드를 차단합니다.
- 기존 Ubuntu 노드를 드레이닝합니다.
az aks delete
명령을 사용하여 기존 Ubuntu 노드를 제거합니다.
az aks nodepool delete \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name myNodePool
고유한 서브넷을 사용하는 노드 풀 추가
논리적 격리를 위해 워크로드에서 클러스터의 노드를 별도의 풀로 분할해야 하는 경우가 있습니다. 이러한 격리를 지원하려면 클러스터의 각 노드 풀 전용으로 사용되는 별도의 서브넷이 필요합니다. 이렇게 하면 불연속 가상 네트워크 주소 공간을 노드 풀 간에 분할해야 하는 등의 요구 사항을 해결할 수 있습니다.
참고
Azure CLI 버전 2.35.0
이상을 사용해야 합니다.
제한 사항
- 노드 풀에 할당된 모든 서브넷은 동일한 가상 네트워크에 속해야 합니다.
- 시스템 Pod는 클러스터의 모든 노드/Pod에 대한 액세스 권한이 있어야만 DNS 확인 및 터널링 kubectl logs/exec/port-forward 프록시와 같은 중요한 기능을 제공할 수 있습니다.
- 클러스터를 만든 후 VNET을 확장하는 경우 원래 CIDR 블록 외부에 서브넷을 추가하기 전에 클러스터를 업데이트해야 합니다(관리형 클러스터 작업을 수행하지만 노드 풀 작업은 카운트하지 않음). 이제 AKS는 처음에 허용했던 에이전트 풀 추가에 대해 오류를 표시합니다.
aks-preview
이제 Azure CLI 확장(버전 0.5.66 이상)이az aks update -g <resourceGroup> -n <clusterName>
선택적 인수 없이 실행을 지원합니다. 이 명령은 변경 사항 없이 업데이트 작업을 수행하므로 실패한 상태에서 중단된 클러스터를 복구할 수 있습니다. - Kubernetes 버전 < 1.23.3이 있는 클러스터에서 kube-proxy는 새 서브넷의 트래픽을 SNAT하므로 Azure 네트워크 정책에서 패킷을 삭제할 수 있습니다.
- Windows 노드는 노드 풀이 이미지로 다시 설치될 때까지 새 서브넷에 대한 트래픽을 SNAT합니다.
- 내부 부하 분산 장치는 기본적으로 노드 풀 서브넷(일반적으로 클러스터를 만들 때 노드 풀의 첫 번째 서브넷) 중 하나로 설정됩니다. 이 동작을 재정의하려면 주석을 사용하여 부하 분산 장치의 서브넷을 명시적으로 지정할 수 있습니다.
전용 서브넷을 사용하여 노드 풀을 만들려면 노드 풀을 만들 때 서브넷 리소스 ID를 추가 매개 변수로 전달합니다.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name mynodepool \
--node-count 3 \
--vnet-subnet-id <YOUR_SUBNET_RESOURCE_ID>
노드 풀 업그레이드
참고
클러스터 또는 노드 풀에서 업그레이드 및 스케일링 작업을 동시에 수행할 수 없으며, 시도하면 오류가 반환됩니다. 대상 리소스에서 각 작업 유형이 완료되어야만 동일한 리소스에 대한 다음 요청이 수행됩니다. 이에 대한 자세한 내용은 문제 해결 가이드를 참조하세요.
이 섹션의 명령은 단일 특정 노드 풀을 업그레이드하는 방법을 설명합니다. Kubernetes 버전의 컨트롤 플레인과 노드 풀 업그레이드 간의 관계는 아래 섹션에 설명되어 있습니다.
참고
노드 풀 OS 이미지 버전은 클러스터의 Kubernetes 버전에 연결됩니다. 클러스터 업그레이드 후에는 OS 이미지 업그레이드만 받게 됩니다.
이 예제에서는 두 개의 노드 풀이 있으므로 az aks nodepool upgrade
를 사용하여 노드 풀을 업그레이드해야 합니다. 사용 가능한 업그레이드를 확인하려면 az aks get-upgrades
를 사용합니다.
az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster
mynodepool을 업그레이드하겠습니다. 다음 예제와 같이 az aks nodepool upgrade
명령을 사용하여 노드 풀을 업그레이드합니다.
az aks nodepool upgrade \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name mynodepool \
--kubernetes-version KUBERNETES_VERSION \
--no-wait
az aks node pool list
명령을 사용하여 노드 풀의 상태를 다시 나열합니다. 다음 예제에서는 mynodepool이 KUBERNETES_VERSION으로 업그레이드 중이라는 것을 보여줍니다.
az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
[
{
...
"count": 3,
...
"name": "mynodepool",
"orchestratorVersion": "KUBERNETES_VERSION",
...
"provisioningState": "Upgrading",
...
"vmSize": "Standard_DS2_v2",
...
},
{
...
"count": 2,
...
"name": "nodepool1",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Succeeded",
...
"vmSize": "Standard_DS2_v2",
...
}
]
노드를 지정된 버전으로 업그레이드하는 데 몇 분 정도 걸립니다.
AKS 클러스터의 모든 노드 풀을 동일한 Kubernetes 버전으로 업그레이드하는 것이 가장 좋습니다. az aks upgrade
의 기본 동작은 모든 노드 풀을 컨트롤 플레인과 함께 업그레이드하여 이렇게 맞추는 것입니다. 개별 노드 풀을 업그레이드하는 기능을 사용하면 롤링 업그레이드를 수행하고 노드 풀 간에 Pod 일정을 예약하여 위에서 언급한 제약 조건 내에서 애플리케이션 작동 시간을 유지할 수 있습니다
클러스터 컨트롤 플레인을 여러 노드 풀로 업그레이드
참고
Kubernetes는 표준 유의적 버전 버전 관리 체계를 사용합니다. 버전 번호는 x.y.z로 표시되며 x는 주 버전, y는 부 버전, z는 패치 버전입니다. 예를 들어 버전 1.12.6에서 1은 주 버전, 12는 부 버전, 6은 패치 버전입니다. Kubernetes 버전의 컨트롤 플레인과 초기 노드 풀은 클러스터를 만드는 동안 설정됩니다. 모든 추가 노드 풀은 클러스터에 추가될 때 Kubernetes 버전이 설정됩니다. Kubernetes 버전은 노드 풀 간에 그리고 노드 풀과 컨트롤 플레인 간에 서로 다를 수 있습니다.
AKS 클러스터에는 Kubernetes 버전이 연결된 두 개의 클러스터 리소스 개체가 있습니다.
- 클러스터 컨트롤 플레인 Kubernetes 버전
- Kubernetes 버전을 사용하는 노드 풀
컨트롤 플레인은 하나 이상의 노드 풀에 매핑됩니다. 업그레이드 작업의 동작은 사용하는 Azure CLI 명령에 따라 달라집니다.
AKS 컨트롤 플레인을 업그레이드하려면 az aks upgrade
를 사용해야 합니다. 이 명령은 컨트롤 플레인과 클러스터의 모든 노드 풀을 업그레이드합니다.
--control-plane-only
플래그를 사용하여 az aks upgrade
명령을 실행하면 클러스터 컨트롤 플레인만 업그레이드됩니다. 클러스터의 연결된 노드 풀은 하나도 변경되지 않았습니다.
개별 노드 풀을 업그레이드하려면 az aks nodepool upgrade
명령을 사용해야 합니다. 이 명령은 지정된 Kubernetes 버전을 사용하여 대상 노드 풀만 업그레이드합니다.
업그레이드 유효성 검사 규칙
클러스터의 컨트롤 플레인과 노드 풀의 유효한 Kubernetes 업그레이드는 다음 규칙 세트를 통해 유효성이 검사됩니다.
노드 풀을 업그레이드하는 데 유효한 버전에 대한 규칙:
- 노드 풀 버전은 컨트롤 플레인과 동일한 주 버전이어야 합니다.
- 노드 풀 부 버전은 컨트롤 플레인 버전의 두 가지 부 버전 내에 있어야 합니다.
- 노드 풀 버전은 컨트롤
major.minor.patch
버전보다 크면 안 됩니다.
업그레이드 작업 제출에 대한 위한 규칙:
- 컨트롤 플레인 또는 노드 풀 Kubernetes 버전을 다운그레이드할 수 없습니다.
- 노드 풀 Kubernetes 버전을 지정하지 않으면 사용하는 클라이언트에 따라 동작이 달라집니다. Resource Manager 템플릿의 선언은 노드 풀에 대해 정의된 기존 버전(사용한 경우)으로 대체됩니다. 설정된 항목이 없으면 컨트롤 플레인 버전을 사용하여 대체됩니다.
- 지정된 시간에 컨트롤 플레인 또는 노드 풀을 업그레이드하거나 스케일링할 수 있으며, 단일 컨트롤 플레인 또는 노드 풀 리소스에서 동시에 여러 작업을 제출할 수 없습니다.
노드 풀 수동 스케일링
애플리케이션 워크로드 수요가 변하면 그에 따라 노드 풀의 노드 수를 스케일링해야 할 수 있습니다. 노드 수를 스케일 업 또는 다운할 수 있습니다.
노드 풀의 노드 수를 스케일링하려면 az aks node pool scale
명령을 사용합니다. 다음 예제에서는 mynodepool의 노드 수를 5로 스케일링합니다.
az aks nodepool scale \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name mynodepool \
--node-count 5 \
--no-wait
az aks node pool list
명령을 사용하여 노드 풀의 상태를 다시 나열합니다. 다음 예제는 mynodepool의 노드 수를 5개로 스케일링 중임을 보여줍니다.
az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
[
{
...
"count": 5,
...
"name": "mynodepool",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Scaling",
...
"vmSize": "Standard_DS2_v2",
...
},
{
...
"count": 2,
...
"name": "nodepool1",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Succeeded",
...
"vmSize": "Standard_DS2_v2",
...
}
]
스케일링 작업이 완료될 때까지 몇 분 정도 걸립니다.
클러스터 자동 스케일링을 사용하여 특정 노드 풀을 자동으로 스케일링
AKS는 클러스터 자동 스케일링이라는 기능을 사용하여 노드 풀을 자동으로 스케일링하는 별도의 기능을 제공합니다. 노드 풀마다 고유한 최소 및 최대 스케일링 수를 지정하여 이 기능을 사용할 수 있습니다. 노드 풀마다 클러스터 자동 스케일링 사용 방법을 알아보세요.
노드 풀 삭제
풀이 더 이상 필요 없으면 풀을 삭제하고 기본 VM 노드를 제거할 수 있습니다. 노드 풀을 삭제하려면 az aks node pool delete
명령을 사용하여 노드 풀 이름을 지정합니다. 다음 예제에서는 이전 단계에서 만든 mynoodepool을 삭제합니다.
주의
노드 풀을 삭제하면 AKS는 차단 및 드레이닝을 수행하지 않으며 노드 풀을 삭제할 때 발생할 수 있는 데이터 손실에 대한 복구 옵션이 없습니다. 다른 노드 풀에서 Pod를 예약할 수 없는 경우 해당 애플리케이션을 사용할 수 없게 됩니다. 사용 중인 애플리케이션에 데이터 백업이 없거나 클러스터의 다른 노드 풀에서 실행할 수 없는 경우 노드 풀을 삭제하면 안 됩니다. 삭제할 노드 풀에서 현재 실행 중인 Pod 일정 변경의 중단을 최소화하려면 삭제하기 전에 노드 풀의 모든 노드에서 차단 및 드레이닝을 수행합니다. 자세한 내용은 차단 및 드레인 노드 풀을 참조하세요.
az aks nodepool delete -g myResourceGroup --cluster-name myAKSCluster --name mynodepool --no-wait
다음 예제의 az aks node pool list
명령 출력은 mynodepool이 삭제 중 상태임을 보여줍니다.
az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
[
{
...
"count": 5,
...
"name": "mynodepool",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Deleting",
...
"vmSize": "Standard_DS2_v2",
...
},
{
...
"count": 2,
...
"name": "nodepool1",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Succeeded",
...
"vmSize": "Standard_DS2_v2",
...
}
]
노드 및 노드 풀을 삭제하는 데 몇 분 정도 걸립니다.
노드 풀에 용량 예약 그룹 연결(미리 보기)
애플리케이션 워크로드에서 요구하는 대로 노드 풀을 이미 만든 용량 예약 그룹에 연결할 수 있습니다. 이렇게 하면 노드 풀에 보장된 용량이 할당됩니다.
용량 예약 그룹에 대한 자세한 내용은 용량 예약 그룹을 참조하세요.
미리 보기 기능 등록
중요
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
aks-preview 확장을 설치하려면 다음 명령을 실행합니다.
az extension add --name aks-preview
다음 명령을 실행하여 릴리스된 확장의 최신 버전으로 업데이트합니다.
az extension update --name aks-preview
CapacityReservationGroupPreview
다음 예제와 같이 az feature register 명령을 사용하여 기능 플래그를 등록 합니다.
az feature register --namespace "Microsoft.ContainerService" --name "CapacityReservationGroupPreview"
상태가 Registered로 표시되는 데 몇 분 정도 걸립니다. [az feature show][az-feature-show] 명령을 사용하여 등록 상태 확인합니다.
az feature show --namespace "Microsoft.ContainerService" --name "CapacityReservationGroupPreview"
상태가 등록됨으로 표시되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.
az provider register --namespace Microsoft.ContainerService
용량 예약 관리
노드 풀을 기존 용량 예약 그룹과 연결하려면 명령을 사용하고 az aks nodepool add
--capacityReservationGroup 플래그를 사용하여 용량 예약 그룹을 지정할 수 있습니다. 용량 예약 그룹이 이미 있어야 합니다. 그렇지 않으면 노드 풀이 경고와 함께 클러스터에 추가되고 용량 예약 그룹이 연결되지 않습니다.
az aks nodepool add -g MyRG --cluster-name MyMC -n myAP --capacityReservationGroup myCRG
az aks create
명령을 사용하여 시스템 노드 풀을 기존 용량 예약 그룹과 연결할 수 있습니다. 지정된 용량 예약 그룹이 없으면 경고가 발생하고 용량 예약 그룹 연결 없이 클러스터가 만들어집니다.
az aks create -g MyRG --cluster-name MyMC --capacityReservationGroup myCRG
노드 풀 명령을 삭제하면 노드 풀이 삭제되기 전에 연결된 용량 예약 그룹에서 노드 풀의 연결이 암시적으로 해제됩니다.
az aks nodepool delete -g MyRG --cluster-name MyMC -n myAP
클러스터 명령을 삭제하면 연결된 용량 예약 그룹에서 클러스터의 모든 노드 풀이 암시적으로 분리됩니다.
az aks delete -g MyRG --cluster-name MyMC
노드 풀의 VM 크기 지정
이전 예제에서 노드 풀을 만들 때 기본 VM 크기를 사용하여 클러스터에 노드를 만들었습니다. 보다 일반적인 시나리오는 VM 크기 및 기능이 서로 다른 노드 풀을 만드는 것입니다. 예를 들어 노드의 CPU 또는 메모리 양이 많은 노드 풀 또는 GPU 지원을 제공하는 노드 풀을 만들 수 있습니다. 다음 단계에서는 taints 및 tolerations를 사용하여 이러한 노드에서 실행할 수 있는 Pod에 대한 액세스를 제한하는 방법을 Kubernetes 스케줄러에 알립니다.
다음 예제에서는 Standard_NC6 VM 크기를 사용하는 GPU 기반 노드 풀을 만듭니다. 이러한 VM은 NVIDIA Tesla K80 카드로 구동됩니다. 사용 가능한 VM 크기에 대한 자세한 내용은 Azure에서 Linux 가상 머신에 대한 크기를 참조하세요.
az aks node pool add
명령을 다시 사용하여 노드 풀을 만듭니다. 이번에는 gpunodepool을 이름으로 지정하고, --node-vm-size
매개 변수를 사용하여 Standard_NC6 크기를 지정합니다.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name gpunodepool \
--node-count 1 \
--node-vm-size Standard_NC6 \
--no-wait
다음 예제의 az aks node pool list
명령 출력은 gpunodepool에서 지정된 VmSize를 사용하여 노드를 만드는 중임을 보여줍니다.
az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
[
{
...
"count": 1,
...
"name": "gpunodepool",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Creating",
...
"vmSize": "Standard_NC6",
...
},
{
...
"count": 2,
...
"name": "nodepool1",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Succeeded",
...
"vmSize": "Standard_DS2_v2",
...
}
]
gpunodepool을 만드는 데 몇 분 정도 걸립니다.
노드 풀의 taint, 레이블 또는 태그 지정
노드 풀을 만들 때 해당 노드 풀에 taint, 레이블 또는 태그를 추가할 수 있습니다. taint, 레이블 또는 태그를 추가하면 해당 노드 풀의 모든 노드에도 해당 taint, 레이블 또는 태그가 지정됩니다.
중요
az aks nodepool
을 사용하여 전체 노드 풀에 대해 taint, 레이블 또는 태그를 노드에 추가해야 합니다. kubectl
을 사용하여 노드 풀의 개별 노드에 taint, 레이블 또는 태그를 적용하지 않는 것이 좋습니다.
노드 풀 taint 설정
taint가 있는 노드 풀을 만들려면 az aks nodepool add
를 사용합니다. 이름으로 taintnp를 지정하고 --node-taints
매개 변수를 사용하여 taint에 대해 sku=gpu:NoSchedule을 지정합니다.
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name taintnp \
--node-count 1 \
--node-taints sku=gpu:NoSchedule \
--no-wait
다음 예제의 az aks nodepool list
명령 출력은 taintnp에서 지정된 nodeTaints를 사용하여 노드를 만드는 중임을 보여줍니다.
az aks nodepool list -g myResourceGroup --cluster-name myAKSCluster
[
{
...
"count": 1,
...
"name": "taintnp",
"orchestratorVersion": "1.15.7",
...
"provisioningState": "Creating",
...
"nodeTaints": [
"sku=gpu:NoSchedule"
],
...
},
...
]
taint 정보는 노드의 예약 규칙을 처리하기 위해 Kubernetes에 표시됩니다. Kubernetes 스케줄러는 taint 및 toleration을 사용하여 노드에서 실행할 수 있는 워크로드를 제한할 수 있습니다.
- Taint는 노드에서 특정 Pod만 예약할 수 있음을 나타내는 노드에 적용됩니다.
- Toleration은 노드의 오류를 ‘허용’할 수 있도록 하는 Pod에 적용됩니다.
고급 Kubernetes 예약 기능을 사용하는 방법에 대한 자세한 내용은 AKS의 고급 스케줄러 기능에 대한 모범 사례를 참조하세요.
이전 단계에서는 노드 풀을 만들 때 sku=gpu:NoSchedule taint를 적용했습니다. 다음 기본 예제 YAML 매니페스트는 toleration을 사용하여 Kubernetes 스케줄러가 해당 노드 풀의 노드에서 NGINX Pod를 실행할 수 있도록 허용합니다.
nginx-toleration.yaml
파일을 만들고 다음 예제 YAML을 복사합니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
name: mypod
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 2G
tolerations:
- key: "sku"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
kubectl apply -f nginx-toleration.yaml
명령을 사용하여 Pod를 예약합니다.
kubectl apply -f nginx-toleration.yaml
Pod를 예약하고 NGINX 이미지를 끌어오는 데 몇 초 정도 걸립니다. kubectl describe pod 명령을 사용하여 Pod 상태를 살펴봅니다. 압축된 다음 예제 출력은 sku=gpu:NoSchedule toleration이 적용된 것을 보여줍니다. 이벤트 섹션에서 스케줄러가 aks-taintnp-28993262-vmss000000 노드에 Pod를 할당했습니다.
kubectl describe pod mypod
[...]
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
sku=gpu:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m48s default-scheduler Successfully assigned default/mypod to aks-taintnp-28993262-vmss000000
Normal Pulling 4m47s kubelet pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
Normal Pulled 4m43s kubelet Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
Normal Created 4m40s kubelet Created container
Normal Started 4m40s kubelet Started container
이 toleration이 적용된 Pod만 taintnp의 노드에서 예약할 수 있습니다. 그 외의 Pod는 nodepool1 노드 풀에 예약됩니다. 추가 노드 풀을 만드는 경우 추가 taint 및 toleration을 사용하여 해당 노드 리소스에서 예약할 수 있는 Pod를 제한할 수 있습니다.
노드 풀 레이블 설정
노드 풀과 함께 레이블을 사용하는 방법에 대한 자세한 내용은 AKS(Azure Kubernetes Service) 클러스터에서 레이블 사용을 참조하세요.
노드 풀 Azure 태그 설정
노드 풀과 함께 Azure 태그를 사용하는 방법에 대한 자세한 내용은 AKS(Azure Kubernetes Service)에서 Azure 태그 사용을 참조하세요.
FIPS 지원 노드 풀 추가
AKS 클러스터에 FIPS(Federal Information Process Standard)를 사용하도록 설정하는 방법에 대한 자세한 내용은 AKS(Azure Kubernetes Service) 노드 풀에 대해 FIPS(Federal Information Process Standard) 사용하도록 설정를 참조하세요.
Resource Manager 템플릿을 사용하여 노드 풀 관리
Azure Resource Manager 템플릿을 사용하여 리소스를 만들고 관리할 때 일반적으로 템플릿에서 설정을 업데이트하고 다시 배포하여 리소스를 업데이트할 수 있습니다. AKS의 노드 풀을 사용하는 경우 AKS 클러스터가 생성된 후에는 초기 노드 풀 프로필을 업데이트할 수 없습니다. 이 동작은 기존 Resource Manager 템플릿을 업데이트하고, 노드 풀을 변경하고, 다시 배포할 수 없음을 의미합니다. 대신 기존 AKS 클러스터의 노드 풀만 업데이트하는 별도의 Resource Manager 템플릿을 만들어야 합니다.
aks-agentpools.json
과 같은 템플릿을 만들고 다음 예제 매니페스트를 붙여넣습니다. 이 예제 템플릿은 다음 설정을 구성합니다.
- 3개의 노드를 실행하도록 myagentpool이라는 Linux 노드 풀을 업데이트합니다.
- Kubernetes 버전1.15.7을 실행하도록 노드 풀의 노드를 설정합니다.
- 노드 크기를 Standard_DS2_v2로 정의합니다.
이러한 값을 필요한 대로 편집하여 노드 풀을 필요에 따라 업데이트, 추가 또는 삭제합니다.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"clusterName": {
"type": "string",
"metadata": {
"description": "The name of your existing AKS cluster."
}
},
"location": {
"type": "string",
"metadata": {
"description": "The location of your existing AKS cluster."
}
},
"agentPoolName": {
"type": "string",
"defaultValue": "myagentpool",
"metadata": {
"description": "The name of the agent pool to create or update."
}
},
"vnetSubnetId": {
"type": "string",
"defaultValue": "",
"metadata": {
"description": "The Vnet subnet resource ID for your existing AKS cluster."
}
}
},
"variables": {
"apiVersion": {
"aks": "2020-01-01"
},
"agentPoolProfiles": {
"maxPods": 30,
"osDiskSizeGB": 0,
"agentCount": 3,
"agentVmSize": "Standard_DS2_v2",
"osType": "Linux",
"vnetSubnetId": "[parameters('vnetSubnetId')]"
}
},
"resources": [
{
"apiVersion": "2020-01-01",
"type": "Microsoft.ContainerService/managedClusters/agentPools",
"name": "[concat(parameters('clusterName'),'/', parameters('agentPoolName'))]",
"location": "[parameters('location')]",
"properties": {
"maxPods": "[variables('agentPoolProfiles').maxPods]",
"osDiskSizeGB": "[variables('agentPoolProfiles').osDiskSizeGB]",
"count": "[variables('agentPoolProfiles').agentCount]",
"vmSize": "[variables('agentPoolProfiles').agentVmSize]",
"osType": "[variables('agentPoolProfiles').osType]",
"storageProfile": "ManagedDisks",
"type": "VirtualMachineScaleSets",
"vnetSubnetID": "[variables('agentPoolProfiles').vnetSubnetId]",
"orchestratorVersion": "1.15.7"
}
}
]
}
다음 예제와 같이 az deployment group create
명령을 사용하여 이 템플릿을 배포합니다. 기존 AKS 클러스터 이름 및 위치를 묻는 메시지가 표시됩니다.
az deployment group create \
--resource-group myResourceGroup \
--template-file aks-agentpools.json
팁
다음 예제와 같이 템플릿에서 tag 속성을 추가하여 노드 풀에 태그를 추가할 수 있습니다.
...
"resources": [
{
...
"properties": {
...
"tags": {
"name1": "val1"
},
...
}
}
...
Resource Manager 템플릿에서 정의하는 노드 풀 설정 및 작업에 따라 AKS 클러스터를 업데이트하는 데 몇 분 정도 걸릴 수 있습니다.
리소스 정리
이 문서에서는 GPU 기반 노드를 포함하는 AKS 클러스터를 만들었습니다. 불필요한 비용을 줄이기 위해 gpunodepool 또는 전체 AKS 클러스터를 삭제할 수 있습니다.
GPU 기반 노드 풀을 삭제하려면 다음 예제와 같이 az aks nodepool delete
명령을 사용합니다.
az aks nodepool delete -g myResourceGroup --cluster-name myAKSCluster --name gpunodepool
클러스터 자체를 삭제하려면 az group delete
명령을 사용하여 AKS 리소스 그룹을 삭제합니다.
az group delete --name myResourceGroup --yes --no-wait
노드 풀의 공용 IP 시나리오에 대해 만든 추가 클러스터도 삭제할 수 있습니다.
az group delete --name myResourceGroup2 --yes --no-wait
다음 단계
시스템 노드 풀에 대해 자세히 알아봅니다.
이 문서에서는 AKS 클러스터에서 여러 노드 풀을 만들고 관리하는 방법을 배웠습니다. 노드 풀에서 Pod를 제어하는 방법에 대한 자세한 내용은 AKS의 고급 스케줄러 기능에 대한 모범 사례를 참조하세요.
Windows Server 컨테이너 노드 풀을 만들고 사용하려면 AKS에서 Windows server 컨테이너 만들기를 참조하세요.
근접 배치 그룹을 사용하여 AKS 애플리케이션의 대기 시간을 줄입니다.
인스턴스 수준 공용 IP 주소를 사용하여 노드가 직접 트래픽을 처리할 수 있도록 합니다.