调度应用至指定节点池

如需将特定应用调度至特定配置的节点,可以为节点池设置标签(Labels),并为应用配置相应的 nodeSelector 或 nodeAffinity

工作原理

将 Pod 调度到指定节点池,本质是利用 Kubernetes 的原生调度机制,通过节点标签将 Pod 匹配到节点池内的节点。流程如下。

  1. 标记节点池:节点池可用于纳管一组具有相同配置的节点。为节点池配置节点标签(Labels)后,ACK 可将标签同步到节点池内所有节点(包括未来新扩容的节点)。

    节点池配置中勾选同步更新存量节点的污点(Taints)及节点标签(Labels)后,ACK会自动将节点标签同步至节点池内的已有节点。
  2. 定义 Pod 调度规则:在 Pod YAML中通过 nodeSelector 或 nodeAffinity 指定目标节点的标签。

  3. (可选)配置独占:为节点池配置Taint,确保只有添加了相应TolerationPod才会被调度到该节点池。

  4. 自动调度:调度器根据上述规则,自动将 Pod 调度到符合条件的节点。

步骤一:为节点池设置标签

支持为节点池添加自定义标签,用于标识业务属性、环境等,便于调度管理。

ACK 会为每个节点池自动创建一个全局唯一的标签 alibabacloud.com/nodepool-id,可用于精确匹配节点池。
  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 操作列,单击目标节点池对应的编辑,展开高级选项区域,完成如下配置。

    • 节点标签(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)

  4. 在左侧导航栏,选择节点管理 > 节点,然后单击标签与污点管理,在标签页签下查看节点标签。

步骤二:配置应用调度策略

获取节点池标签后,可在应用 YAML 中配置 nodeAffinitynodeSelector,将应用调度到目标节点池。

  • nodeSelector:简单直接的节点绑定方式,通过精确匹配标签来将 Pod 部署到特定节点上。

  • nodeAffinity:相较于 nodeSelector 更为灵活。

    • 不仅支持精确匹配,还支持 InNotInExists 等表达式。

    • 支持“软亲和性”(preferredDuringSchedulingIgnoredDuringExecution),即优先调度到满足条件的节点,若无满足条件的节点,也可以调度到其他节点。

  1. 创建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"
  2. 部署应用。

    kubectl apply -f deployment.yaml
  3. 验证 Pod 的运行状态及调度结果。

    添加 -o wide 参数可查看 Pod 被调度到的具体节点。
    kubectl get pods -l app=nginx -o wide

    可在输出中查看Pod是否被调度到了目标节点。

相关文档

  • 除通过节点池统一管理,也可以通过管理节点标签为单个节点设置标签,实现更精细的调度。

  • Pod出现异常,如长时间处于Pending状态,请参见Pod异常问题排查

  • ACK提供更多灵活的调度策略,如指定不同实例资源的顺序扩容及逆序缩容、 基于节点实际资源使用情况的负载感知调度等,请参见ACK提供的调度策略

  • 若使用硬亲和性调度,当集群中没有满足条件的节点时,如果存在已配置带有相应标签且已启用节点伸缩的节点池,ACK会自动从该节点池扩容新节点。

  • 节点池功能推出前创建的老集群中,可能存在未被节点池纳管的游离Worker节点,请迁移游离节点至节点池