调整应用程序以在混合 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

有关节点选择器的详细信息,请参阅 节点选择器

排斥和容许

排斥和容忍协同工作,以确保 Pod 不会无意中安排在节点上。 节点可以“受污染”来拒绝未显式容忍其污点的 Pod 规范 YAML 中的“容忍”。

使用 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

请运行以下命令,检查节点池是否已成功部署了排斥:

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进行污染。

有关污点和容忍的详细信息,请参阅 污点和容忍

后续步骤

本操作指南介绍了如何使用 kubectl 将节点选择器或污点和容忍添加到 Kubernetes 群集。 接下来可以: