K8s Scheduler(4)
scheduler故名思维负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
调度流程
给pod做调度主要分为两步:1. 过滤。2. 打分。
过滤阶段会将所有满足的Pod调度需求的Node选择出来,过滤之后会得到一个符合的Node列表,如何列表为空,则表明这是一个不可调度的Pod。
NodeSelector和LabelSelector不赘述。
亲和和反亲和 Affinity and anti-affinity
是为了增强调度的灵活性。增强一下几点:
匹配有更多的逻辑组合,不只是字符的完全相等。
调度分成软策略(soft)和硬策略(hard),在软策略的情况下,如果没有满足调度条件的节点,pod 会忽略这条规则,继续完成调度过程。
软策略
和硬策略
的区分是有用处的,硬策略适用于 pod 必须运行在某种节点,否则会出现问题的情况,比如集群中节点的架构不同,而运行的服务必须依赖某种架构提供的功能;软策略不同,它适用于满不满足条件都能工作,但是满足条件更好的情况,比如服务最好运行在某个区域,减少网络传输等。这种区分是用户的具体需求决定的,并没有绝对的技术依赖。
节点Node 亲和性
类似于nodeSelector,允许我们指定一些Pod在Node间调度的约束。
支持两种形式:
requiredDuringSchedulingIgnoredDuringExecution 必须满足,如果不满足则不进行调度
preferredDuringSchedulingIgnoredDuringExecution 倾向满足,不满足的情况下会调度的不符合条件的Node。
pod 亲和性和反亲和性
podAffinity 主要解决POD可以和哪些POD部署在同一个拓扑域中的问题(拓扑域用主机标签实现,可以是单个主机,也可以是多个主机组成的cluster、zone等。),podAntiAffinity主要解决POD不能和哪些POD部署在同一个拓扑域中的问题。它们处理的是Kubernetes集群内部POD和POD之间的关系。
作用域: pod 于pod之间。
提到NodeAffinity,不得不说污点Taints,亲和度是能够将pod调度到该node上面,而taints则是拒绝,甚至驱逐Pod。
aints(污点)是Node的一个属性,设置了Taints(污点)后,因为有了污点,所以Kubernetes是不会将Pod调度到这个Node上的,于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。
待续……