AKS(Azure Kubernetes Service) 클러스터에서 노드 테인트 사용
이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 노드 테인트를 사용하는 방법을 설명합니다.
개요
AKS 예약 메커니즘은 Pod를 노드에 배치하는 역할을 하며 업스트림 Kubernetes 스케줄러인 kube-scheduler를 기반으로 합니다. 노드 선호도를 사용하여 Pod를 노드 집합에 연결하거나 AKS 스케줄러와 상호 작용하는 노드 테인트을 사용하여 Pod 집합을 밀어내도록 노드에 지시하여 특정 노드에서 실행할 Pod를 제한할 수 있습니다.
노드 테인트는 스케줄러가 표시된 노드에 특정 Pod를 배치하지 않도록 노드를 표시하여 작동합니다. Pod에 톨러레이션을 배치하면 스케줄러가 일치하는 테인트가 있는 노드에 해당 Pod를 예약할 수 있습니다. 테인트 및 톨러레이션은 함께 작동하여 스케줄러가 노드에 Pod를 배치하는 방법을 제어하는 데 도움이 됩니다. 자세한 내용은 테인트 및 톨러레이션 사용 사례 예를 참조하세요.
테인트는 효과가 있는 키-값 쌍입니다. 노드 테인트를 사용할 때 효과 필드에는 NoExecute
, NoSchedule
및 PreferNoSchedule
의 세 가지 값이 있습니다.
NoExecute
: 노드에서 이미 실행 중인 Pod는 일치하는 톨러레이션이 없는 경우 즉시 제거됩니다. Pod에 일치하는 톨러레이션이 있는 경우tolerationSeconds
가 지정되면 제거될 수 있습니다.NoSchedule
: 일치하는 톨러레이션이 있는 Pod만 이 노드에 배치됩니다. 기존 Pod는 제거되지 않습니다.PreferNoSchedule
: 스케줄러는 일치하는 톨러레이션이 없는 Pod 배치를 방지합니다.
노드 테인트 옵션
AKS 노드에 적용할 수 있는 노드 테인트에는 노드 테인트과 노드 초기화 테인트라는 두 가지 형식이 있습니다.
- 노드 테인트는 노드 선호도를 사용하여 Pod를 예약하기 위해 노드에 영구적으로 유지됩니다. 노드 테인트는 AKS API를 통해서만 완전히 추가, 업데이트 또는 제거할 수 있습니다.
- 노드 초기화 테인트는 부팅 시 노드에 배치되며 노드를 설정하는 데 추가 시간이 필요할 수 있는 시나리오와 같이 일시적으로 사용됩니다. Kubernetes API를 사용하여 노드 초기화 테인트를 제거할 수 있으며 노드 수명 주기 동안에는 보장되지 않습니다. 노드가 크기 조정되거나 업그레이드/이미지로 다시 설치된 후에만 나타납니다. 새 노드에는 크기 조정 후에도 여전히 노드 초기화 테인트가 있습니다. 업그레이드 후 모든 노드에 노드 초기화 테인트가 나타납니다. 초기화 테인트를 완전히 제거하려면 Kubernetes API를 사용하여 노드 테인트를 제거한 후 AKS API를 사용하여 제거할 수 있습니다. AKS API를 사용하여 클러스터 사양에서 초기화 테인트를 제거하면 새로 만들어진 노드에 해당 초기화 테인트가 표시되지 않습니다. 초기화 테인트가 기존 노드에 여전히 존재하는 경우 노드 이미지 업그레이드 작업을 수행하여 영구적으로 제거할 수 있습니다.
참고 항목
AKS 노드 풀 API를 사용하여 적용된 노드 테인트 및 레이블은 Kubernetes API에서 수정할 수 없으며 그 반대의 경우도 마찬가지입니다. 시스템 테인트에 대한 수정은 허용되지 않습니다.
이는 노드 초기화 테인트에는 적용되지 않습니다.
노드 테인트 사용
필수 조건
이 문서에서는 기존 AKS 클러스터가 있다고 가정합니다. AKS 클러스터가 필요한 경우 Azure CLI, Azure PowerShell 또는 Azure Portal을 사용하여 만들 수 있습니다.
노드 테인트로 노드 풀 만들기
az aks nodepool add
명령을 사용하여 테인트가 있는 노드 풀을 만들고--node-taints
매개 변수를 사용하여 테인트에 대해sku=gpu:NoSchedule
을 지정합니다.az aks nodepool add \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-count 1 \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
노드 풀을 업데이트하여 노드 테인트 추가
az aks nodepool update
명령을 사용하여 노드 테인트를 추가하도록 노드 풀을 업데이트하고--node-taints
매개 변수를 사용하여 테인트에 대해sku=gpu:NoSchedule
을 지정합니다.az aks nodepool update \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
노드 초기화 테인트 사용(미리 보기)
Important
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
필수 구성 요소 및 제한 사항
- Azure CLI
3.0.0b3
이상 버전을 설치하고 구성해야 합니다.az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요. - AKS API를 사용하는 경우 클러스터 만들기 또는 업그레이드를 통해서만 초기화 테인트를 적용할 수 있습니다. ARM 템플릿을 사용하는 경우 노드 풀 만들기 및 업데이트 중에 노드 초기화 테인트를 지정할 수 있습니다.
- Azure CLI를 사용하여 Windows 노드 풀에 초기화 테인트를 적용할 수 없습니다.
클러스터의 자격 증명 가져오기
az aks get-credentials
명령을 사용하여 AKS 클러스터의 자격 증명을 가져옵니다.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
aks-preview
Azure CLI 확장 설치
az extension add
또는az extension update
명령을 사용하여 aks-preview 확장을 등록하거나 업데이트합니다.# Register the aks-preview extension az extension add --name aks-preview # Update the aks-preview extension az extension update --name aks-preview
NodeInitializationTaintsPreview
기능 플래그 등록
az feature register
명령을 사용하여NodeInitializationTaintsPreview
기능 플래그를 등록합니다.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.
또한
az feature show
명령을 사용하여 등록 상태를 확인합니다.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
상태가 Registered(등록됨)를 반영하면
az provider register
명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.az provider register --namespace Microsoft.ContainerService
노드 초기화 테인트로 클러스터 만들기
az aks create
명령과--node-initialization-taints
매개 변수를 사용하여 노드 초기화 테인트로 클러스터를 만들고 테인트에sku=gpu:NoSchedule
을 지정합니다.Important
지정한 노드 초기화 테인트는 클러스터의 모든 노드 풀에 적용됩니다. 특정 노드에 초기화 테인트를 적용하려면 CLI 대신 ARM 템플릿을 사용할 수 있습니다.
az aks create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-count 1 \ --node-init-taints "sku=gpu:NoSchedule" \ --generate-ssh-keys
클러스터를 업데이트하여 노드 초기화 테인트 추가
az aks update
명령과--node-initialization-taints
매개 변수를 사용하여 테인트에 대해sku=gpu:NoSchedule
을 지정하여 노드 초기화 테인트를 추가하도록 클러스터를 업데이트합니다.Important
노드 초기화 테인트로 클러스터를 업데이트하면 테인트가 클러스터의 모든 노드 풀에 적용됩니다. 이미지로 다시 설치 작업 후 노드에서 노드 초기화 테인트에 대한 업데이트를 볼 수 있습니다.
az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints "sku=gpu:NoSchedule"
노드 풀 상태 확인
노드 테인트 또는 초기화 테인트를 적용한 후
az aks nodepool list
명령을 사용하여 노드 풀 상태를 확인합니다.az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
노드 테인트를 적용한 경우 다음 출력 예는
<node-pool-name>
노드 풀이 지정된nodeTaints
가 있는Creating
노드임을 보여 줍니다.[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
노드 초기화 테인트를 적용한 경우 다음 출력 예는
<node-pool-name>
노드 풀이 지정된nodeInitializationTaints
가 있는Creating
노드임을 보여 줍니다.[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeInitializationTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
노드에 테인트가 설정되어 있는지 확인
kubectl describe node
명령을 사용하여 노드 구성에서 노드 테인트 및 노드 초기화 테인트를 확인합니다.kubectl describe node $NODE_NAME
노드 테인트를 적용한 경우 다음 출력 예는
<node-pool-name>
노드 풀에 지정된Taints
가 있음을 보여 줍니다.[ ... Name: <node-pool-name> ... Taints: sku=gpu:NoSchedule ... ], ... ... ]
노드 테인트 제거
특정 노드 테인트 제거
az aks nodepool update
명령을 사용하여 노드 테인트를 제거합니다. 다음 명령 예는 노드 풀에서"sku=gpu:NoSchedule"
노드 테인트를 제거합니다.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-taints "sku=gpu:NoSchedule"
모든 노드 테인트 제거
az aks nodepool update
명령을 사용하여 노드 풀에서 모든 노드 테인트를 제거합니다. 다음 명령 예는 노드 풀에서 모든 노드 테인트를 제거합니다.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --name $NODE_POOL_NAME \ --node-taints ""
노드 초기화 테인트 제거
노드에서 노드 초기화 테인트를 제거하는 옵션은 다음과 같습니다.
- Kubernetes API를 사용하여 노드 초기화 테인트를 일시적으로 제거합니다. 이 방법으로 제거하면 노드 크기 조정 또는 업그레이드가 발생한 후 테인트가 다시 나타납니다. 새 노드에는 크기 조정 후에도 여전히 노드 초기화 테인트가 있습니다. 업그레이드 후 모든 노드에 노드 초기화 테인트가 나타납니다.
- Kubernetes API를 사용하여 노드 테인트를 제거한 다음 AKS API를 사용하여 테인트를 제거하여 노드 초기화 테인트를 영구적으로 제거합니다. AKS API를 사용하여 클러스터 사양에서 초기화 테인트가 제거되면 이미지로 다시 설치 작업 후 새로 만들어진 노드에는 더 이상 초기화 테인트가 없습니다.
노드 풀 복제본에서 초기화 테인트 발생을 모두 제거하면 새 초기화 테인트로 업그레이드한 후 기존 초기화 테인트가 다시 나타날 수 있습니다.
일시적으로 노드 초기화 테인트 제거
kubectl taint nodes
명령을 사용하여 노드 초기화 테인트를 일시적으로 제거합니다.이 명령은 지정된 노드에서만 테인트를 제거합니다. 노드 풀의 모든 노드에서 테인트를 제거하려면 테인트를 제거하려는 모든 노드에 대해 명령을 실행해야 합니다.
kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
제거되면 노드 크기 조정 또는 업그레이드가 발생한 후 노드 초기화 테인트가 다시 나타납니다.
노드 초기화 테인트를 영구적으로 제거
Kubernetes API를 사용하여 노드 초기화 테인트를 제거하려면 임시로 노드 초기화 테인트 제거의 단계를 따릅니다.
az aks update
명령을 사용하여 AKS API를 사용하여 노드에서 테인트를 제거합니다. 이 명령은 클러스터의 모든 노드에서 노드 초기화 테인트를 제거합니다.az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints ""
노드에서 테인트가 제거되었는지 확인
kubectl describe node
명령을 사용하여 노드 구성에서 노드 테인트 및 노드 초기화 테인트를 확인합니다.kubectl describe node $NODE_NAME
노드 테인트를 제거한 경우 다음 출력 예는
<node-pool-name>
노드 풀의Taints
아래에 제거된 테인트가 없음을 보여 줍니다.[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
다음 단계
- 테인트 및 톨러레이션의 예 사용 사례에 대해 자세히 알아봅니다.
- 고급 AKS 스케줄러 기능 우수 사례에 대해 자세히 알아봅니다.
- Kubernetes 레이블 설명서에서 Kubernetes 레이블에 대해 자세히 알아봅니다.
Azure Kubernetes Service