調整應用程式以在混合 OS Kubernetes 叢集中使用
適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS
Arc 所啟用的 AKS 可讓您同時執行 Linux 和 Windows 節點的 Kubernetes 叢集,但您必須對應用程式進行小型編輯,才能用於這些混合 OS 叢集。 本操作指南說明如何使用節點選取器或污點和容忍,確保應用程式在正確的主機 OS 上排程。
本文章假設您對 Kubernetes 概念有基本瞭解。 如需詳細資訊,請參閱 Arc所啟用 AKS 的 Kubernetes 核心概念。
節點選取器
節點選取器是 Pod 規格 YAML 中的簡單欄位,可限制 Pod 只排程到符合操作系統的健康狀態節點。 在您的 Pod 規格 YAML 中,指定 nodeSelector
Windows 或 Linux 的值,如下列範例所示:
kubernetes.io/os = Windows
或
kubernetes.io/os = Linux
如需節點選取器的詳細資訊,請參閱 節點選取器。
汙點和容許處
Taints 和 Tolerations 會一起運作,以確保 Pod 不會不小心排程在節點上。 節點可以「受污染」來拒絕Pod規格YAML中未明確容許其污點的Pod。
使用 New-AksHciNodePool 或 New-AksHciCluster 命令建立時,AKS Arc 中的 Windows OS 節點可能會受到玷污。 您也可以使用這些命令來污點 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
若要檢查節點集區是否已使用 taint 成功部署,請執行下列命令:
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}
指定 Pod 的容忍
您可以在 Pod 規格 YAML 中指定 Pod 的容忍。 下列容忍會「比對」上一個範例所示的污點線所 kubectl
建立的污點。 結果是具有容忍的 Pod 可以排程到受污染的節點。
tolerations:
- key: node.kubernetes.io/os
operator: Equal
value: Windows
effect: NoSchedule
如果您控制您要部署的 Pod 規格,本節中的步驟會正常運作。 不過,在某些情況下,用戶對於 Linux 容器具有預先存在的大量部署,以及常見設定的生態系統,例如社群 Helm 圖表。 除非您想要下載和編輯圖表,否則您將無法存取 Pod 規格。
如果您將這些 Helm 圖表部署至同時具有 Linux 和 Windows 背景工作節點的混合叢集環境,您的應用程式 Pod 會失敗,並出現「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
來玷污。
如需污點和容忍的詳細資訊,請參閱 Taints 和 Tolerations。
下一步
在本操作指南中,您已瞭解如何使用 kubectl 將節點選取器或污點和容忍新增至 Kubernetes 叢集。 接著,您可以: