Azure Kubernetes Service (AKS) クラスターでノード テイントを使用する
この記事では、Azure Kubernetes Service (AKS) クラスターでノード テイントを使用する方法について説明します。
概要
AKS のスケジュール メカニズムは、ポッドをノードに配置する役割を担い、上流の Kubernetes スケジューラー (kube-scheduler) に基づいています。 ノード アフィニティを使用してポッドを一連のノードにアタッチするか、ノード テイントを使用して一連のポッドを排除するようにノードに指示することで、ポッドを特定のノードで実行するように制約できます。これは、AKS スケジューラで操作できます。
ノード テイントは、スケジューラーがマークされたノードに特定のポッドを配置しないように、ノードをマークすることで機能します。 ポッドに容認を配置することで、スケジューラーで一致するテイントを持つノードにそのポッドをスケジュールできるようになります。 テイントと容認は、スケジューラーがポッドをノードに配置する方法を制御するのに役立ちます。 詳細については、テイントおよび容認のユース ケースの例に関するページを参照してください。
テイントは結果を含むキーと値のペアです。 ノード テイントを使用する場合、結果フィールドには、NoExecute
、NoSchedule
、PreferNoSchedule
の 3 つの値があります。
NoExecute
: ノード上で既に実行されているポッドは、容認が一致しない場合、即座に排除されます。tolerationSeconds
が指定された場合、ポッドに一致する容認がある場合、排除される可能性があります。NoSchedule
: 容認が一致するポッドのみがこのノードに配置されます。 既存のポッドは排除されません。PreferNoSchedule
: スケジューラーは、容認が一致しないポッドを配置しないようにします。
ノード テイント オプション
AKS ノードに適用できるノード テイントには、ノード テイントとノード初期化テイントの 2 種類があります。
- ノード テイントは、ノード アフィニティを使用してポッドをスケジュールするために、ノード上に永続的に残ることを意味します。 ノード テイントは、AKS API を使用してのみ追加、更新、または完全に削除できます。
- ノード初期化テイントは起動時にノードに配置され、ノードの設定に余分な時間が必要なシナリオなどで一時的に使用されます。 Kubernetes API を使用してノード初期化テイントを削除できますが、ノードの有効期間中は保証されません。 ノードのスケールアップやアップグレード/再イメージ化の後にのみ表示されます。 新しいノードはスケーリング後もノード初期化テイントを保持します。 アップグレード後、すべてのノードにノード初期化テイントが表示されます。 初期化テイントを完全に削除する場合は、Kubernetes API を使用してノード テイントを解除した後、AKS API を使用して削除できます。 AKS API を使用してクラスター仕様から初期化テイントを削除すると、新しく作成されたノードには初期化テイントが付随しません。 既存のノードにまだ初期化テイントが残っている場合は、ノード イメージのアップグレード操作を実行することで完全に削除できます。
Note
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
ノード初期化テイントを使用する (プレビュー)
重要
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"
状態が [登録済み] と表示されるまでに数分かかります。
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
を指定します。重要
指定したノード初期化テイントは、クラスター内のすべてのノード プールに適用されます。 特定のノードに初期化テイントを適用するには、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
を指定します。重要
ノード初期化テイントを使用してクラスターを更新する場合、テイントはクラスター内のすべてのノード プールに適用されます。 再イメージ化操作後のノード初期化テイントの更新情報を表示できます。
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