다음을 통해 공유


AKS(Azure Kubernetes Service) 클러스터에서 노드 테인트 사용

이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 노드 테인트를 사용하는 방법을 설명합니다.

개요

AKS 예약 메커니즘은 Pod를 노드에 배치하는 역할을 하며 업스트림 Kubernetes 스케줄러인 kube-scheduler를 기반으로 합니다. 노드 선호도를 사용하여 Pod를 노드 집합에 연결하거나 AKS 스케줄러와 상호 작용하는 노드 테인트을 사용하여 Pod 집합을 밀어내도록 노드에 지시하여 특정 노드에서 실행할 Pod를 제한할 수 있습니다.

노드 테인트는 스케줄러가 표시된 노드에 특정 Pod를 배치하지 않도록 노드를 표시하여 작동합니다. Pod에 톨러레이션을 배치하면 스케줄러가 일치하는 테인트가 있는 노드에 해당 Pod를 예약할 수 있습니다. 테인트 및 톨러레이션은 함께 작동하여 스케줄러가 노드에 Pod를 배치하는 방법을 제어하는 데 도움이 됩니다. 자세한 내용은 테인트 및 톨러레이션 사용 사례 예를 참조하세요.

테인트는 효과가 있는 키-값 쌍입니다. 노드 테인트를 사용할 때 효과 필드에는 NoExecute, NoSchedulePreferNoSchedule의 세 가지 값이 있습니다.

  • 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을 사용하여 만들 수 있습니다.

노드 테인트로 노드 풀 만들기

  1. 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
    
  2. 노드 풀의 상태를 확인합니다.

  3. 노드에 테인트가 설정되어 있는지 확인합니다.

노드 풀을 업데이트하여 노드 테인트 추가

  1. 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
    
  2. 노드 풀의 상태를 확인합니다.

  3. 노드에 테인트가 설정되어 있는지 확인합니다.

노드 초기화 테인트 사용(미리 보기)

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 기능 플래그 등록

  1. az feature register 명령을 사용하여 NodeInitializationTaintsPreview 기능 플래그를 등록합니다.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.

  2. 또한 az feature show 명령을 사용하여 등록 상태를 확인합니다.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. 상태가 Registered(등록됨)를 반영하면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.

    az provider register --namespace Microsoft.ContainerService
    

노드 초기화 테인트로 클러스터 만들기

  1. 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
    
  2. 노드 풀의 상태를 확인합니다.

  3. 노드에 테인트가 설정되어 있는지 확인합니다.

클러스터를 업데이트하여 노드 초기화 테인트 추가

  1. 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"
    
  2. 노드 풀의 상태를 확인합니다.

  3. 노드에 테인트가 설정되어 있는지 확인합니다.

노드 풀 상태 확인

  • 노드 테인트 또는 초기화 테인트를 적용한 후 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-
    

    제거되면 노드 크기 조정 또는 업그레이드가 발생한 후 노드 초기화 테인트가 다시 나타납니다.

노드 초기화 테인트를 영구적으로 제거

  1. Kubernetes API를 사용하여 노드 초기화 테인트를 제거하려면 임시로 노드 초기화 테인트 제거의 단계를 따릅니다.

  2. 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: 
        ...
        ],
        ...
     ...
    ]
    

다음 단계