k8s | 深入理解组件scheduler
kube-scheduler 负责分配调度 Pod 到集群内的节点上,它监听 kube-apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点
指定 Node 节点调度
有三种方式指定 Pod 只运行在指定的 Node 节点上
-
nodeSelector:只调度到匹配指定 label 的 Node 上
-
nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
nodeAffinity是Kubernetes中更为灵活和强大的节点选择器机制。它允许你使用更复杂的匹配规则来选择节点,可以通过使用nodeAffinity来实现更复杂的调度策略。nodeAffinity可以使用nodeSelector的等值匹配,也可以使用更复杂的表达式,例如使用in、notIn、exists、notExists等来匹配节点的标签
-
podAffinity:调度到满足条件的 Pod 所在的 Node 上
PodAntiAffinity是Kubernetes中的一个调度策略,用于控制Pod在调度到节点时的亲和性。具体来说,PodAntiAffinity用于确保在同一节点上不会运行具有相同Label Selector的Pod。这意味着如果已经有一个满足Label Selector的Pod在节点上运行,新的Pod将不会被调度到同一节点上。
affinity 和 anti-affinity 节点亲和性和反亲和性
节点亲和性和反亲和性是 Kubernetes 中的调度策略,用于控制将 Pod 调度到特定节点或避免特定节点的过程。
假设你有一个 Kubernetes 集群,其中有三个节点:Node-A、Node-B 和 Node-C。现在你有两个不同的应用程序,一个是 Web 服务,一个是数据库服务。你希望将 Web 服务调度到具有高网络带宽的节点上,而将数据库服务调度到具有高性能存储的节点上。
-
节点亲和性示例(Web 服务): 对于 Web 服务,你可以定义一个标签
app=web
,用于标识属于 Web 服务的 Pod。而你的节点 Node-A 具有标签network=high
,表示拥有高网络带宽。现在,你希望将 Web 服务的 Pod 调度到具有高网络带宽的节点上。在这种情况下,你可以设置节点亲和性策略,将 Pod 的选择器设置为
app=web
,节点选择器设置为network=high
。这样,Kubernetes 的调度器将根据亲和性策略,将属于 Web 服务的 Pod 调度到具有高网络带宽的节点 Node-A 上。这样,Web 服务将获得较高的网络性能,提供更好的服务质量。 -
节点反亲和性示例(数据库服务): 对于数据库服务,你可以定义一个标签
app=db
,用于标识属于数据库服务的 Pod。而你的节点 Node-B 具有标签storage=high
,表示拥有高性能存储。现在,你希望将数据库服务的 Pod 避免调度到具有高性能存储的节点上,以防止存储资源竞争。在这种情况下,你可以设置节点反亲和性策略,将 Pod 的选择器设置为
app=db
,节点选择器设置为storage!=high
。这样,Kubernetes 的调度器将根据反亲和性策略,避免将属于数据库服务的 Pod 调度到具有高性能存储的节点 Node-B 上。相反,它们会被调度到其他节点,如 Node-A 或 Node-C 上。这样可以避免存储资源的竞争和潜在的性能问题。
通过节点亲和性和反亲和性策略,你可以根据特定的标签和选择器来定义 Pod 与节点之间的关系,类比为在团队项目中的学生分组。亲和性策略类似于将某些学生分在一起合作,而反亲和性策略类似于避免某些学生合作。这样可以根据不同的需求和资源要求,有效地控制 Pod 的调度位置,以满足特定的业务需求和服务质量要求。
评论区