다음을 통해 공유


Azure Arc 클러스터에서 사용하도록 설정된 AKS에서 노드 taint 사용

적용 대상: Azure Local, 버전 23H2

이 문서에서는 AKS 클러스터에서 노드 taint를 사용하는 방법을 설명합니다.

개요

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

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

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

  • NoExecute: 노드에서 이미 실행 중인 Pod는 일치하는 톨러레이션이 없는 경우 즉시 제거됩니다. Pod에 일치하는 톨러레이션이 있는 경우 tolerationSeconds가 지정되면 제거될 수 있습니다.
  • NoSchedule: 일치하는 톨러레이션이 있는 Pod만 이 노드에 배치됩니다. 기존 Pod는 제거되지 않습니다.
  • PreferNoSchedule: 스케줄러는 일치하는 톨러레이션이 없는 Pod 배치를 방지합니다.

시작하기 전에

  • 이 문서에서는 기존 AKS 클러스터가 있다고 가정합니다. AKS 클러스터가 필요한 경우 Azure CLI, Azure PowerShell 또는 Azure Portal사용하여 만들 수 있습니다.
  • 노드 풀을 만들 때 테인트를 추가할 수 있습니다. taint를 추가하면 해당 노드 풀 내의 모든 노드도 해당 taint를 가져옵니다.

Important

를 사용하여 az aksarc nodepool전체 노드 풀의 노드에 taint 또는 레이블을 추가해야 합니다. 노드 풀의 개별 노드에 taint 또는 레이블을 적용하는 데는 사용하지 kubectl 않는 것이 좋습니다.

노드 풀 taint 설정

az aksarc nodepool add 명령을 사용하여 taint가 있는 노드 풀을 만듭니다. 이름을 taintnp 지정하고 매개 변수를 --node-taints 사용하여 taint를 지정 sku=gpu:NoSchedule 합니다.

az aksarc nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name taintnp \
    --node-count 1 \
    --node-taints sku=gpu:NoSchedule \
    --no-wait

다음 명령을 사용하여 노드 풀의 상태를 확인합니다.az aksarc nodepool list

az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster

다음 예제 출력은 노드 풀이 taintnp 지정된 nodeTaints노드를 만드는 것을 보여 줍니다.

[
  {
    ...
    "count": 1,
    ...
    "name": "taintnp",
    ...
    "provisioningState": "Succeeded",
    ...
    "nodeTaints":  [
      "sku=gpu:NoSchedule"
    ],
    ...
  },
 ...
]

taint 정보는 노드의 예약 규칙을 처리하기 위해 Kubernetes에 표시됩니다. Kubernetes 스케줄러는 taint 및 toleration을 사용하여 노드에서 실행할 수 있는 워크로드를 제한할 수 있습니다.

  • Taint는 노드에서 특정 Pod만 예약할 수 있음을 나타내는 노드에 적용됩니다.
  • 그런 다음, 노드의 taint를 "허용"할 수 있는 Pod에 내정이 적용됩니다.

노드 풀 toleration 설정

이전 단계에서 노드 풀을 sku=gpu:NoSchedule 만들 때 taint를 적용했습니다. 다음 예제 YAML 매니페스트는 허용을 사용하여 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 명령을 사용하여 Pod를 예약합니다.

kubectl apply -f nginx-toleration.yaml

Pod를 예약하고 NGINX 이미지를 끌어오는 데 몇 초 정도 걸립니다.

다음 명령을 사용하여 상태를 확인합니다.kubectl describe pod

kubectl describe pod mypod

다음으로 압축된 예제 출력은 컨슬러레이션이 sku=gpu:NoSchedule 적용되었음을 보여 줍니다. 이벤트 섹션에서 스케줄러는 노드에 Pod를 할당했습니다moc-lbeof1gn6x3.

[...]
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
                 sku=gpu:NoSchedule
Events:
  Type    Reason     Age    From                Message
  ----    ------     ----   ----                -------
  Normal  Scheduled  54s  default-scheduler   Successfully assigned default/mypod to moc-lbeof1gn6x3
  Normal  Pulling    53s  kubelet             Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
  Normal  Pulled     48s  kubelet             Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
  Normal  Created    48s  kubelet             Created container
  Normal  Started    48s  kubelet             Started container

이 관용이 적용된 Pod만 노드에서 taintnp예약할 수 있습니다. 그 외의 Pod는 nodepool1 노드 풀에 예약됩니다. 추가 노드 풀을 만드는 경우 taint 및 toleration을 사용하여 해당 노드 리소스에서 예약할 수 있는 Pod를 제한할 수 있습니다.

클러스터 노드 풀을 업데이트하여 노드 taint 추가

명령 및 --node-taints 매개 변수를 사용하여 taint에 az aksarc update 대해 지정 sku=gpu:NoSchedule 하는 노드 taint를 추가하도록 클러스터를 업데이트합니다. 기존의 모든 taint는 새 값으로 바뀝니다. 이전 taint는 삭제됩니다.

az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"   

다음 단계