Skip to content

Latest commit

 

History

History
99 lines (82 loc) · 4.69 KB

亲和性.md

File metadata and controls

99 lines (82 loc) · 4.69 KB

背景

从普通弹性云服务器迁移部署转到K8S,目的是降本增效,即提高资源使用率从而降低浪费率,增加系统稳定性和服务平滑升级。 但如果对K8S的认识薄弱,导致使用过程中过于粗放,不但不能能降低成本,反而会造成系统不稳定。故拟定此文档,建议规定服务器节点标签和污点, 不同服务部署增加节点亲和性,进一步提高集群资源使用率和系统稳定性。


节点标签约定

  • 公共标签: CPU密集型节点:CPU=true GPU密集型节点:GPU=true MEM密集型节点:MEM=true IO密集型节点:IO=true

  • 私有标签:如爬虫项目,需要自定义(Spider=true)然后调度的时候加上自定义标签

  • 污点:原则上能不打就不打,资源尽量公用;如果服务确实需要,请尽量将污点节点的资源最大化利用。

Note:

  1. 多个标签可以同时共存,调度的时候,亲和性可以使用与|或|非来排列;
  2. 为了保证集群调度pod的合理性和有效性,尽量保证每个公共标签不少于5台节点;且对应的资源最好满足CPU>=40c AND MEM >=80G。

亲和性使用规则

  • 常用标签匹配操作符: In:匹配标签的值是否在指定的值列表中。例如,values: ["value1", "value2"] 将匹配具有标签值为 "value1" 或 "value2" 的节点。 NotIn:匹配标签的值是否不在指定的值列表中。例如,values: ["value1", "value2"] 将不匹配具有标签值为 "value1" 或 "value2" 的节点。 Exists:检查标签是否存在,不考虑具体的值。例如,values: [] 将匹配具有该标签的任何节点,而不管该标签的值是什么。 DoesNotExist:检查标签是否不存在。例如,values: [] 将不匹配具有该标签的任何节点。 Gt、Lt、Gte、Lte:用于对数值类型的标签进行比较。Gt 表示大于,Lt 表示小于,Gte 表示大于等于,Lte 表示小于等于。

  • 常用节点亲和性: requiredDuringSchedulingIgnoredDuringExecution: 这是最常用的 Node Affinity 类型,它要求 Pod 在调度时必须满足指定的节点条件。如果没有满足条件的节点可用,Pod 将无法调度。 preferredDuringSchedulingIgnoredDuringExecution: 这种类型的 Node Affinity 是一个偏好设置,指示 Kubernetes 尽量将 Pod 调度到满足指定节点条件的节点上,但不是必须的。如果满足条件的节点不可用,Pod 可以被调度到其他节点上。

  • 常用NodeAffinity条件: nodeSelector: 使用节点标签(Node Labels)作为条件来选择节点。可以通过指定一组键值对来定义节点选择器,Pod 将被调度到具有相应标签的节点上。 nodeSelectorTerms: 使用一组节点选择条件来选择节点。可以通过使用多个 nodeSelectorTerms 来定义更复杂的节点选择器。 preferredDuringSchedulingIgnoredDuringExecution: 使用一个或多个节点选择器来定义偏好的节点选择条件,以及对应的优先级。 requiredDuringSchedulingIgnoredDuringExecution: 使用一个或多个节点选择器来定义必需的节点选择条件。所有条件都必须满足,否则 Pod 将无法调度。

  • 为了降低部署文件复杂度,这里不建议引入反亲和性,可以使用NotIn标签来达到同样效果,详见项目3示例。


项目标签使用示例

  • GPU服务 如:模型需要使用GPU,则可以添加如下亲和性:
affinity: # 添加节点亲和性
 nodeAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
     nodeSelectorTerms:
       - matchExpressions:
           - key: GPU
             operator: In
             values:
               - "true"
  • 计算+MEM密集型服务 例如:爬虫,节点标签为:Spider=true && MEM=true,则添加如下亲和性:
affinity: # 添加节点亲和性
 nodeAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
     nodeSelectorTerms:
       - matchExpressions:
           - key: Spider
             operator: In
             values:
               - "true"
           - key: MEM
             operator: In
             values:
               - "true"
  • 普通服务 例如:后天管理服务,节点标签为:CPU=true,且不调度到GPU节点上,则添加规则如下:
affinity: # 添加节点亲和性
 nodeAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
     nodeSelectorTerms:
       - matchExpressions:
           - key: CPU
             operator: In
             values:
               - "true"
           - key: GPU
             operator: NotIn
             values:
               - "true"