从普通弹性云服务器迁移部署转到K8S,目的是降本增效,即提高资源使用率从而降低浪费率,增加系统稳定性和服务平滑升级。 但如果对K8S的认识薄弱,导致使用过程中过于粗放,不但不能能降低成本,反而会造成系统不稳定。故拟定此文档,建议规定服务器节点标签和污点, 不同服务部署增加节点亲和性,进一步提高集群资源使用率和系统稳定性。
-
公共标签: CPU密集型节点:CPU=true GPU密集型节点:GPU=true MEM密集型节点:MEM=true IO密集型节点:IO=true
-
私有标签:如爬虫项目,需要自定义(Spider=true)然后调度的时候加上自定义标签
-
污点:原则上能不打就不打,资源尽量公用;如果服务确实需要,请尽量将污点节点的资源最大化利用。
Note:
- 多个标签可以同时共存,调度的时候,亲和性可以使用
与|或|非
来排列; - 为了保证集群调度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"