如需将特定应用调度至特定配置的节点,可以为节点池设置标签(Labels),并为应用配置相应的 nodeSelector
或 nodeAffinity
。
工作原理
将 Pod 调度到指定节点池,本质是利用 Kubernetes 的原生调度机制,通过节点标签将 Pod 匹配到节点池内的节点。流程如下。
标记节点池:节点池可用于纳管一组具有相同配置的节点。为节点池配置节点标签(Labels)后,ACK 可将标签同步到节点池内所有节点(包括未来新扩容的节点)。
在节点池配置中勾选同步更新存量节点的污点(Taints)及节点标签(Labels)后,ACK会自动将节点标签同步至节点池内的已有节点。
定义 Pod 调度规则:在 Pod YAML中通过
nodeSelector
或nodeAffinity
指定目标节点的标签。(可选)配置独占:为节点池配置Taint,确保只有添加了相应Toleration的Pod才会被调度到该节点池。
自动调度:调度器根据上述规则,自动将 Pod 调度到符合条件的节点。
步骤一:为节点池设置标签
支持为节点池添加自定义标签,用于标识业务属性、环境等,便于调度管理。
ACK 会为每个节点池自动创建一个全局唯一的标签 alibabacloud.com/nodepool-id
,可用于精确匹配节点池。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在操作列,单击目标节点池对应的编辑,展开高级选项区域,完成如下配置。
节点标签(Labels):
键:格式为
前缀/名称
。名称
(必选):长度为1~63个字符,必须以字母数字字符[a-z0-9A-Z]
开头和结尾,中间可包含字母、数字、短划线(-)、下划线(_)、英文半角句号(.)。前缀
(可选):必须为DNS子域,即由英文半角句号(.)分隔的DNS标签,不超过253个字符,以正斜线(/)结尾。kubernetes.io/
是为 Kubernetes 核心组件保留的前缀。因此,使用此命名空间时,标签键必须以允许的前缀开头:kubelet.kubernetes.io/
、node.kubernetes.io/
。
值 (可选) :不超过63个字符,必须以字母数字字符
[a-z0-9A-Z]
开头和结尾,可包含字母、数字、短划线(-)、下划线(_)和英文半角句号(.)。
(可选)按需选择是否同步更新存量节点的污点(Taints)及节点标签(Labels)。
在左侧导航栏,选择
,然后单击标签与污点管理,在标签页签下查看节点标签。
步骤二:配置应用调度策略
获取节点池标签后,可在应用 YAML 中配置 nodeAffinity
或nodeSelector
,将应用调度到目标节点池。
nodeSelector
:简单直接的节点绑定方式,通过精确匹配标签来将 Pod 部署到特定节点上。nodeAffinity
:相较于nodeSelector
更为灵活。不仅支持精确匹配,还支持
In
、NotIn
、Exists
等表达式。支持“软亲和性”(
preferredDuringSchedulingIgnoredDuringExecution
),即优先调度到满足条件的节点,若无满足条件的节点,也可以调度到其他节点。
创建
deployment.yaml
。nodeAffinity
nodeAffinity
包含以下调度策略:requiredDuringSchedulingIgnoredDuringExecution
(硬亲和性):Pod 必须调度到满足条件的节点上。若无符合条件的节点,Pod 会调度失败并保持 Pending 状态。preferredDuringSchedulingIgnoredDuringExecution
(软亲和性):调度器优先将 Pod 调度到满足条件的节点上。如果找不到此类节点,调度器会忽略此偏好,将 Pod 调度到其他可用节点。
以确保应用运行在带有标签
pod: nginx
的节点上为例。apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-affinity labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: nodeAffinity: # 硬性要求:Pod 必须调度到满足条件的节点上 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: pod # 节点标签的键 operator: In values: - nginx # 节点标签的值 containers: - name: nginx-with-affinity image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 在生产环境中为容器声明资源需求,以保证服务质量(QoS) resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"
nodeSelector
以确保应用始终运行在带有标签
pod: nginx
的节点上为例。apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: pod: nginx # 指定节点必须包含此标签,以确保 Pod 运行在目标节点上 containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 在生产环境中为容器声明资源需求,以保证服务质量(QoS) resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"
部署应用。
kubectl apply -f deployment.yaml
验证 Pod 的运行状态及调度结果。
添加
-o wide
参数可查看 Pod 被调度到的具体节点。kubectl get pods -l app=nginx -o wide
可在输出中查看Pod是否被调度到了目标节点。
相关文档
除通过节点池统一管理,也可以通过管理节点标签为单个节点设置标签,实现更精细的调度。
Pod出现异常,如长时间处于Pending状态,请参见Pod异常问题排查。
ACK提供更多灵活的调度策略,如指定不同实例资源的顺序扩容及逆序缩容、 基于节点实际资源使用情况的负载感知调度等,请参见ACK提供的调度策略。
若使用硬亲和性调度,当集群中没有满足条件的节点时,如果存在已配置带有相应标签且已启用节点伸缩的节点池,ACK会自动从该节点池扩容新节点。
节点池功能推出前创建的老集群中,可能存在未被节点池纳管的游离Worker节点,请迁移游离节点至节点池。