Azure Arc クラスターで有効になっている AKS でノード テイントを使用する
適用対象: Azure Local バージョン 23H2
この記事では、AKS クラスターでノード テイントを使用する方法について説明します。
概要
AKS スケジューリング メカニズムは、ポッドをノードに配置する役割を担い、アップストリームの Kubernetes スケジューラ ( kube-schedulerに基づいています。 AKS スケジューラと対話する node taints を使用してポッドのセットを拒否するようにノードに指示することで、ポッドを特定のノードで実行するように制限できます。
ノード テイントは、スケジューラーがマークされたノードに特定のポッドを配置しないように、ノードをマークすることで機能します。 ポッドに容認を配置することで、スケジューラーで一致するテイントを持つノードにそのポッドをスケジュールできるようになります。 テイントと容認は、スケジューラーがポッドをノードに配置する方法を制御するのに役立ちます。 詳細については、テイントおよび容認のユース ケースの例に関するページを参照してください。
テイントは結果を含むキーと値のペアです。 ノード テイントを使用する場合、結果フィールドには、NoExecute
、NoSchedule
、PreferNoSchedule
の 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"