混合 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 クラスターにノード セレクターまたはテイントと容認を追加する方法について説明しました。 次に、以下を実行できます。