調整應用程式以在混合 OS Kubernetes 叢集中使用

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

Azure Arc 所啟用的 AKS 可讓您同時執行具有 Linux 和 Windows 節點的 Kubernetes 叢集,但您必須對應用程式進行小型編輯,才能用於這些混合 OS 叢集。 在本操作指南中,您將了解如何使用節點選取器或污點和容許處,以確保您的應用程式會在正確的主機作業系統上排程。

本文章假設您對 Kubernetes 概念有基本瞭解。 如需詳細資訊,請參閱 AKS 混合式的 Kubernetes 核心概念

節點選取器

節點選取器是 pod 規格 YAML 中的簡單欄位,可將 pod 限制為只排程至符合作業系統的狀況良好節點。 在 Pod 規格 YAML 中,指定 nodeSelector:Windows 或 Linux,如下列範例所示:

kubernetes.io/os = Windows

或者,

kubernetes.io/os = Linux

如需 nodeSelectors 的詳細資訊,請參閱 節點選取器

汙點和容許處

污點容許處會一起運作,以確保不會在節點上意外排程 pod。 節點可以「遭拒」,以拒絕未明確容忍 Pod 規格 YAML 中的“toleration” 的 Pod。

使用 New-AksHciNodePoolNew-AksHciCluster 命令建立時,AKS Arc 中的 Windows OS 節點可能會被破壞。 您也可以使用這些命令來污染 Linux OS 節點。 下列範例會擷取 Windows 節點。

將 Taint 套用至新的叢集

如果您也建立新的叢集,請執行下列命令來建立具有 Taint 的 Windows 節點集區。 如果您有想要使用 taint 新增節點集區的現有叢集,請參閱下一個使用 命令的 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}

指定 Pod 的 Toleration

您可以在 Pod 規格 YAML 中指定 Pod 的容忍。 下列 Toleration 會「比對」上一個範例所示的 kubectl taint 行所建立的 Taint。 結果是具有 Toleration 的 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

在此實例中,您可以使用 taints 來協助解決此問題。 Windows Server 節點可以使用索引鍵/值組 node.kubernetes.io/os=windows:NoSchedule來刪除。

如需 Taint 和 tolerations 的詳細資訊,請參閱 Taints 和 Tolerations

後續步驟

在本操作指南中,您已了解如何使用 kubectl 將節點選取器或污點和容許處新增至 Kubernetes 叢集。 接著,您可以: