# 工作负载调度策略概述
在Kubernetes中，工作负载调度的基本单位是Pod。创建工作负载时，调度器会自动对工作负载中的Pod进行合理分配，例如将Pod分散到资源充足的节点上。
虽然调度器的默认行为已经能够满足许多基本需求，但在一些特定场景下，用户可能需要更精细地控制Pod的部署位置。为了实现这一点，Kubernetes允许用户在工作负载定义中配置调度策略。例如：
- 将前端应用和后端应用部署在一起，有助于减少延迟，因为这两种类型的Pod可以共享相同的物理资源。
- 某类应用部署到某些特定的节点，确保关键应用总是运行在最优的硬件或配置上。
- 不同应用部署到不同的节点，有助于隔离应用，防止一个应用的问题影响到其他应用。
您可以使用以下方式来选择Kubernetes对Pod的调度策略：
表1工作负载调度策略 
| 调度策略      | YAML字段定义                    | 说明                                                                                                                                                                                                                                                                                       | 参考文档                                                                                                           |
|:---|:---|:---|:---|
| 指定节点      | nodeSelector                 | 最简单的调度形式，通过节点所具有的标签选择希望调度的目标节点，Kubernetes只会将Pod调度到拥有指定标签的节点上。                                                                                                                                                                                                                            | [设置指定节点调度（nodeSelector）](https://support.huaweicloud.com/usermanual-cce/cce_10_0891.html)                      |
| 节点亲和        | nodeAffinity               | 节点亲和可以实现nodeSelector的能力，但其表达能力更强，您可以根据节点上的标签，使用[标签选择器]来筛选需要亲和的节点，支持**必须满足** 和**尽量满足** 的[亲和性规则]。 说明： 如果同时指定nodeSelector和nodeAffinity，则两者必须都要满足，才能将Pod调度到候选节点上。                          | [设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)                    |
| 工作负载亲和/反亲和 | podAffinity/podAntiAffinity | 您可以根据工作负载标签，使用[标签选择器]来筛选需要亲和/反亲和的Pod，并将新建的工作负载调度/不调度至目标Pod所在的节点（或相同拓扑域内的节点），同时支持**必须满足** 和**尽量满足** 的[亲和性规则]。 说明： 工作负载亲和性和反亲和性需要一定的计算时间，因此在大规模集群中会显著降低调度的速度。在包含数百个节点的集群中，不建议使用这类设置。 | [设置工作负载亲和/反亲和调度（podAffinity/podAntiAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0893.html) |
   
 #### 亲和性规则
基于节点亲和或工作负载亲和/反亲和的调度策略还可以设置**必须满足** 的硬约束和**尽量满足**的软约束，以满足更复杂的调度情况。
表2亲和性规则 
| 规则类型       | YAML字段定义                                      | 说明                                                                                                                                                  | 参考文档                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| **必须满足** | requiredDuringSchedulingIgnoredDuringExecution | 硬约束，即调度器仅为Pod匹配符合规则的目标对象调度，若无匹配对象，将阻止该Pod调度。                                                                                                       | - [设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)  - [设置工作负载亲和/反亲和调度（podAffinity/podAntiAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0893.html)   |
| **尽量满足**    | preferredDuringSchedulingIgnoredDuringExecution  | 软约束，即调度器会优先为Pod匹配符合规则的目标对象调度，若无匹配对象，调度器仍然会将Pod调度到其中某个节点。 在使用尽量满足的亲和性类型时，您可以为每个实例设置weight字段，其取值范围是1到100。 权重越高，调度的优先级越高。 | - [设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)  - [设置工作负载亲和/反亲和调度（podAffinity/podAntiAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0893.html)   |
   
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
在上述亲和规则中，YAML字段前半段requiredDuringScheduling或preferredDuringScheduling表示在调度时需要强制满足（require）或尽量满足（prefer）定义的标签规则。而后半段IgnoredDuringExecution表示如果节点标签在Kubernetes调度Pod后发生了变更，Pod仍将继续运行不会重新调度。但是如果该节点上的kubelet重启，kubelet会重新对节点亲和性规则进行校验，Pod仍会被调度至其他节点。
 #### 标签选择器
在创建调度策略时，您需要使用标签选择器的逻辑运算符来筛选标签值，最终确定需要亲和/反亲和的对象。
表3标签选择器 
| 参数        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | YAML示例                                                                                                                                                                                  |
|:---|:---|:---|
| key       | 标签键名，满足筛选条件的对象需包含该键名的标签，且标签的取值满足标签值列表（values字段）和逻辑运算符的运算关系。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 以下示例中，满足筛选条件的对象需**包含** 键名为**topology.kubernetes.io/zone** 的标签，并且该标签的取值为**az1** 或**az2**。 ``` matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - az1 - az2 ``` |
| operator | 您可以使用逻辑运算符来确定标签值的筛选规则，所有逻辑运算符如下： - **In** ：亲和/反亲和对象的标签**包含**在标签值列表（values字段）中。  - **NotIn** ：亲和/反亲和对象的标签**不包含**在标签值列表（values字段）中。  - **Exists** ：亲和/反亲和对象**存在**指定标签名，此时无需填写标签值列表（values字段）。  - **DoesNotExist** ：亲和/反亲和对象**不存在**指定标签名，此时无需填写标签值列表（values字段）。  - **Gt** ：仅在节点亲和性中设置，调度节点的标签值**大于**列表值 （数值比较）。  - **Lt** ：仅在节点亲和性中设置，调度节点的标签值**小于**列表值 （数值比较）。   | 以下示例中，满足筛选条件的对象需**包含** 键名为**topology.kubernetes.io/zone** 的标签，并且该标签的取值为**az1** 或**az2**。 ``` matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - az1 - az2 ``` |
| values     | 标签值的列表。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 以下示例中，满足筛选条件的对象需**包含** 键名为**topology.kubernetes.io/zone** 的标签，并且该标签的取值为**az1** 或**az2**。 ``` matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - az1 - az2 ``` |
   
