调整应用程序以在混合 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 中的“容许”显式容忍其污点的 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

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

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 chart。 除非要下载并编辑图表,否则你无权访问 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 群集。 接下来可以: