次の方法で共有


Azure Arc クラスターで有効になっている AKS でノード テイントを使用する

適用対象: Azure Local バージョン 23H2

この記事では、AKS クラスターでノード テイントを使用する方法について説明します。

概要

AKS スケジューリング メカニズムは、ポッドをノードに配置する役割を担い、アップストリームの Kubernetes スケジューラ ( kube-schedulerに基づいています。 AKS スケジューラと対話する node taints を使用してポッドのセットを拒否するようにノードに指示することで、ポッドを特定のノードで実行するように制限できます。

ノード テイントは、スケジューラーがマークされたノードに特定のポッドを配置しないように、ノードをマークすることで機能します。 ポッドに容認を配置することで、スケジューラーで一致するテイントを持つノードにそのポッドをスケジュールできるようになります。 テイントと容認は、スケジューラーがポッドをノードに配置する方法を制御するのに役立ちます。 詳細については、テイントおよび容認のユース ケースの例に関するページを参照してください。

テイントは結果を含むキーと値のペアです。 ノード テイントを使用する場合、結果フィールドには、NoExecuteNoSchedulePreferNoSchedule の 3 つの値があります。

  • NoExecute: ノード上で既に実行されているポッドは、容認が一致しない場合、即座に排除されます。 tolerationSeconds が指定された場合、ポッドに一致する容認がある場合、排除される可能性があります。
  • NoSchedule: 容認が一致するポッドのみがこのノードに配置されます。 既存のポッドは排除されません。
  • PreferNoSchedule: スケジューラーは、容認が一致しないポッドを配置しないようにします。

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、 Azure CLI、Azure PowerShell、または Azure ポータルを使用して作成できます。
  • ノード プールを作成するときに、テイントを追加できます。 テイントを追加すると、そのノード プール内のすべてのノードもそのテイントを取得します。

重要

az aksarc nodepoolを使用して、ノード プール全体のノードにテイントまたはラベルを追加する必要があります。 kubectlを使用して、テイントまたはラベルをノード プール内の個々のノードに適用することはお勧めしません。

ノード プールのテイントの設定

az aksarc nodepool add コマンドを使用して、テイントを含むノード プールを 作成します。 taintnp名前を指定し、--node-taints パラメーターを使用してテイントの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"
    ],
    ...
  },
 ...
]

テイントの情報は、ノードのスケジューリング規則を処理するために Kubernetes に表示されます。 Kubernetes スケジューラでは、テイントと容認を使用して、ノードで実行できるワークロードを制限できます。

  • テイントは、ノードに適用されて、特定のポッドのみをそのノードでスケジュールできることを示します。
  • その後、ノードのテイントを "許容" できるようにするポッドに、 の読み取り が適用されます。

ノード プールの許容範囲を設定する

前の手順では、ノード プールの作成時に sku=gpu:NoSchedule テイントを適用しました。 次の YAML マニフェストの例では、容認を使用して、Kubernetes スケジューラがそのノード プール内のノードで NGINX ポッドを実行できるようにします。

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 コマンドを使用してポッドをスケジュールします。

kubectl apply -f nginx-toleration.yaml

ポッドのスケジュールおよび NGINX イメージのプルには、数秒かかります。

kubectl describe pod コマンドを使用して状態を確認します。

kubectl describe pod mypod

次の出力例は、 sku=gpu:NoSchedule 許容が適用されていることを示しています。 Events セクションで、スケジューラによってポッドが 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

この容認が適用されているポッドのみが、 taintnp内のノードでスケジュールできます。 その他のポッドは、nodepool1 ノード プールにスケジュールされます。 追加のノード プールを作成した場合、テイントと容認を使用して、それらのノード リソースにどのようなポッドをスケジュールするか制限できます。

クラスター ノード プールを更新してノード テイントを追加する

az aksarc update コマンドと --node-taints パラメーターを使用してノード テイントを追加するようにクラスターを更新し、テイントのsku=gpu:NoScheduleを指定します。 既存のすべてのテイントは、新しい値に置き換えられます。 古いテイントは削除されます。

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

次のステップ