混合 OS Kubernetes クラスターでの使用のためにアプリケーションを適応させる

適用対象: AKS on Azure Stack HCI 22H2、AKS on Windows Server

Azure Arc で有効になっている AKS を使用すると、Linux ノードと Windows ノードの両方で Kubernetes クラスターを実行できますが、これらの混合 OS クラスターで使用するには、アプリを小さな編集を行う必要があります。 この攻略ガイドでは、ノード セレクターまたはテイントと容認のどちらかを使用して、適切なホスト OS 上でアプリケーションが確実にスケジュールされるようにする方法について説明します。

この記事では、Kubernetes の基本的な概念を理解していることを前提としています。 詳細については、「 AKS ハイブリッドの Kubernetes のコア概念」を参照してください。

ノードのセレクター

ノード セレクターは、ポッド仕様の YAML に含まれる簡単なフィールドであり、オペレーティング システムが一致する正常なノードにのみスケジュールされるように、ポッドが制約されます。 ポッド仕様 YAML で、次の nodeSelector例に示すように、Windows または Linux を指定します。

kubernetes.io/os = Windows

または、

kubernetes.io/os = Linux

nodeSelectors の詳細については、「 ノード セレクター」を参照してください。

テイントと容認

テイント容認は、連携動作して、ポッドが意図せずノードにスケジュールされないようにします。 ノードを "テイント" して、ポッド仕様 YAML の "容認" によってテイントを明示的に許容しないポッドを拒否できます。

AKS Arc の Windows OS ノードは、 New-AksHciNodePool または New-AksHciCluster コマンドを使用して作成するときにテイントできます。 これらのコマンドを使用して、Linux OS ノードをテイントすることもできます。 次の例では、Windows ノードをテイントします。

新しいクラスターにテイントを適用する

新しいクラスターも作成する場合は、次のコマンドを実行して、テイントを使用して Windows ノード プールを作成します。 テイントを使用してノード プールを追加する既存のクラスターがある場合は、コマンドを使用する次の例を New-AksHciNodePool 参照してください。

New-AksHciCluster -name mycluster -nodePoolName taintnp -nodeCount 1 -osType Windows -osSku Windows2022 -taints sku=Windows:NoSchedule

既存のクラスターにテイント ノード プールを追加する

既存のクラスターにテイントされたノード プールを追加するには、次のコマンドを実行します。

New-AksHciNodePool -clusterName <cluster-name> -nodePoolNAme taintnp -count 1 -osType Windows -osSku Windows2022 -taints sku=Windows:NoSchedule

次のコマンドを実行して、テイントでノード プールが正常にデプロイされたことを確認します。

Get-AksHciNodePool -clusterName <cluster-name> -name taintnp

出力例:

Status       : {Phase, Details}
ClusterName  : mycluster
NodePoolName : taintnp
Version      : v1.20.7-kvapkg.1
OsType       : Windows
NodeCount    : 0
VmSize       : Standard_K8S3_v1
Phase        : Deployed
Taints       : {sku=Windows:NoSchedule}

ポッドの容認を指定する

ポッドの容認は、ポッド仕様 YAML で指定できます。 次の容認は、前の例で示したテイント線によって kubectl 作成されたテイントと "一致" します。 その結果、容認を持つポッドは、テイントされたノードにスケジュールできます。

tolerations:
- key: node.kubernetes.io/os
  operator: Equal
  value: Windows
  effect: NoSchedule

このセクションの手順は、デプロイするポッド スペックを制御している場合に適切に機能します。 しかし、状況によっては、たくさんの Linux コンテナー用デプロイがユーザーに事前に設定されていたり、コミュニティ Helm チャートなどの一般的な構成のエコシステムが存在したりすることがあります。 グラフをダウンロードして編集しない限り、ポッド スペックにアクセスすることはできません。

これらの Helm チャートを Linux と Windows の両方のワーカー ノードを含む混合クラスター環境にデプロイした場合、アプリケーション ポッドは "ImagePullBackOff" というエラーで失敗します。 例:

kubectl get pods
NAMESPACE              NAME                                                    READY   STATUS              RESTARTS   AGE
default                nginx-deployment-558fc78868-795dp                       0/1     ImagePullBackOff    0          6m24s
default                nginx-deployment-6b474476c4-gpb77                       0/1     ImagePullBackOff    0          11m

この例では、 テイントを 使用してこれを支援できます。 Windows Server ノードは、キーと値のペア node.kubernetes.io/os=windows:NoScheduleでテイントできます。

テイントと容認の詳細については、「 テイントと容認」を参照してください。

次の手順

この攻略ガイドでは、kubectl を使用して、Kubernetes クラスターにノード セレクターまたはテイントと容認を追加する方法について説明しました。 次に、以下を実行できます。