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

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

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

この記事では、Kubernetes の基本的な概念を理解していることを前提としています。 詳細については、「 Arc で有効になっている AKS のKubernetes の主要概念を参照してください。

ノードのセレクター

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

kubernetes.io/os = Windows

または、

kubernetes.io/os = Linux

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

テイントと容認

Taintsが連携して ポッドが誤ってノードにスケジュールされないようにします。 ノードを "テイント" して、ポッド仕様 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

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

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

次のステップ

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