次の方法で共有


Azure Kubernetes Service (AKS) クラスターでノード テイントを使用する

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

概要

AKS のスケジュール メカニズムは、ポッドをノードに配置する役割を担い、上流の Kubernetes スケジューラー (kube-scheduler) に基づいています。 ノード アフィニティを使用してポッドを一連のノードにアタッチするか、ノード テイントを使用して一連のポッドを排除するようにノードに指示することで、ポッドを特定のノードで実行するように制約できます。これは、AKS スケジューラで操作できます。

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

テイントは結果を含むキーと値のペアです。 ノード テイントを使用する場合、結果フィールドには、NoExecuteNoSchedulePreferNoSchedule の 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 CLIAzure 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. テイントがノードに設定されたことを確認します

ノード初期化テイントを使用する (プレビュー)

重要

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"
    

    状態が [登録済み] と表示されるまでに数分かかります。

  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 を指定します。

    重要

    指定したノード初期化テイントは、クラスター内のすべてのノード プールに適用されます。 特定のノードに初期化テイントを適用するには、CLI の代わりに ARM テンプレートを使用します。

    az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. ノード プールの状態を確認します

  3. テイントがノードに設定されていることを確認します

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

  1. クラスターを更新して 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"
    
  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 \
    --node-taints "sku=gpu:NoSchedule"
    

すべてのノード テイントを削除する

  • az aks nodepool update コマンドを使用して、ノード プールからすべてのノード テイントを削除します。 次のコマンド例では、ノード プールからすべてのノード テイントを削除します。

    az aks nodepool update \
    --cluster-name $CLUSTER_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 "sku=gpu:NoSchedule"
    

テイントがノードから削除されたことを確認する

  • kubectl describe node コマンドを使用して、ノード構成のノード テイントとノード初期化テイントを確認します。

    kubectl describe node $NODE_NAME
    

    ノード テイントを削除した場合、次の出力例では、<node-pool-name> ノード プールには Taints の下に削除されたテイントがないことを示します。

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

次のステップ