共用方式為


調整應用程式以在混合 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-AksHciNodePoolNew-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 叢集。 接著,您可以: