Kubernetes(简称K8s)是一个用于管理容器化应用程序的开源平台。在K8s中,节点亲和度设置是一种调度分配策略,用于定义 Pod(一个或者多个容器的集合) 可以调度到哪些节点上以及基于怎样的规则分配 Pod 到各个节点。
前段时间在我们的 K8s 集群运行一些计算任务,但是发现好多 Pod 都会集中分配到一个节点上,这些计算任务比较依赖网速,同一个节点上执行非常影响任务的执行效率。
集群的默认调度方式是优先分配到到空闲资源比较多的节点上,但是我希望任务尽可能分配到不同的节点上,充分发挥多个节点的优势。
通过简单搜索发现可以配置调度器的调度亲和性来实现我的需求。我在 K8s 的 Config Maps 中设置如下:
affinity:是节点亲和性的声明
podAntiAffinity:表示Pod反亲和性,反亲和性是将 Pod 运行在不同区域、不同机器上
preferredDuringSchedulingIgnoredDuringExecution:软策略,表示尽可能的满足配置的策略,当条件不满足时,它也能够接受编排于其它不符合条件的节点之上
podAffinityTerm:pod软亲和性使用它来挑选 Pod 标签
labelSelector:标签选择器 ️
topologyKey:指定要将当前创建Pod运行在具备什么样的Node标签上,通常指定 Node 标签的Key。
上面的配置描述为,标签为 “app=airflow-worker” 的每个 pod 尽可能均匀分配到不同的节点上,节点标签 key 必须是 kubernetes.io/hostname。
扩展:
软硬策略:
preferredDuringSchedulingIgnoredDuringExecution:软策略
requiredDuringSchedulingIgnoredDuringExecution:硬策略,必须按照策略调度找到合适的节点,如果找不到就会一直等待直到有合适的节点。
亲和性和反亲和性:
NodeAffinity 节点亲和性
PodAffinity Pod亲和性
PodAntAffinity Pod反亲和性
上面策略是根据 pod 的标签来设置调度规则,也可以根据节点 node 的标签,例如我认为 computer06 节点有问题,不希望 pod 调度到 06 节点hi,可以用 nodeAffinity 这样设置:
标签键值运算(operator)关系
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值
Lt:label 的值小于某个值
Exists:某个 label 存在
DoesNotExist:某个 label 不存在
亲和性/反亲和性调度策略比较如下:
调度策略匹配标签 | 匹配标签 | 操作符 | 拓扑域支持 | 调度目标 |
---|---|---|---|---|
nodeAffinity | 节点node | In, NotIn, Exists, DoesNotExist, Gt, Lt | 否 | 指向主机 |
podAffinity | pod | In, NotIn, Exists, DoesNotExist | 是 | POD 指定POD同一拓 扑域 |
podAnitAffinity | pod | In, NotIn, Exists, DoesNotExist | 是 | POD与指定POD不在同一拓扑域 |
本文分享自 pythonista的日常 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!