调整应用程序以在混合 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-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 图表。 除非要下载和编辑图表,否则无法访问 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 群集。 接下来可以: