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

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

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

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

節點選取器

節點選取器是 Pod 規格 YAML 中的簡單欄位,可限制 Pod 只排程到符合操作系統的健康節點。 在您的 Pod 規格 YAML 中,指定 nodeSelector Windows 或 Linux 的值,如下列範例所示:

kubernetes.io/os = Windows

或者,

kubernetes.io/os = Linux

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

汙點和容許處

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

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

將 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 的容忍

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

在此實例中,您可以使用 taint 來協助進行這項處理。 Windows Server 節點可以使用機碼/值組 node.kubernetes.io/os=windows:NoSchedule來加以處理。

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

後續步驟

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