首页 » 翻译 » Kubernetes » 正文

CKA 认证系列课程笔记13 Scheduling

schedule1

 

 

Scheduling其实就是给新创建的POD 分配到哪个Node的过程,其实原理就是,当scheduler 决定了哪个Node以后,它会修改Pod 一个隐藏字段 NodeName,设置成具体的Node 的name,这样这个pod就被分配到具体的Node 了, 不过注意,这个NodeName只允许在创建pod的时候修改,例如我们在创建的时候可以手动指定Node name ,但是一旦pod 创建完成了,我们是不允许去修改这个字段了

 

例子:

我们再来说一下kubernetes中另外一个选择机制:

Taints and Tolerations

 

Taint 是可以打在Node上的,和标签类似

toleration是打在pod上的,和selector类似

如果,一个Node上有Taint,不需要管这个Taint具体是什么,所有的pod都无法schedule到这个Node上,除非,我们某个pod我定义tolerate这个 taint

这样,我们就可以保证,我们这个node上,只有我们允许的pod(注意,有taint的pod 不一定会schedule到有taint的node,其他的Node也可能)

taint

 

我们可以通过如下命令来打taint

除了app=blue 这个taint外,我们还指定了 taint的机制: NoSchedule, taint的机制一共有三种:

  • NoSchedule
  • PreferNoSchedule
  • NoExecute

我们一般只用第一种,第二个perfer是尽量,不保证,第三个noExecute就是你打上以后立马把机器上不满足的pod 迁移走

然后如果我们想让我们的Pod tolerate这个taint

加入新的字段toleration就可以了,要和node 的taint对应

如何删除一个node上的taint呢?

这样就可以删除了

 

Node Selectors

node selector 是一种基于Node上的label来为pod选择Node机制

nodesel

想使用这个,必须先给node打上标签

然后通过如下文件进行创建

这个时候,我们就能保证我们的pod一定会schedule到node1 了

但是nodeselector 还是有一定的局限性,他不能说我允许pod 在所有的的非Node1的node上,所以我们有另外一个解决方案Node Affinity and Anti Affinity

 

Node Affinity

node affinity 给我了更负责的选择机制,允许我们可以一次选择多个条件的Node

例如:

这个时候,我们的pod 就可以 schedule到 标签是Large 或者Medium的Node上,两个条件满足一个就可以

当然也有Not 的选择:

需要注意的有点,

  • requiredDuringSchedulingIgnoredDuringExecution
  • preferredDuringSchedulingIgnoredDuringExecution

 

这句话的意思是,在创建的pod的时候,如果你选择第一个,那么,如果,没有符合条件的Node, pod会一直pendding

如果选择第二个:就会在没有符合条件的Node的时候,随便选一个,然后schedule

后边的IgnoredDuringExecurtion 意思是说,如果我们的Pod已经在运行了,然后我们如果把large的标签从Node上删除,那么pod 还会继续运行,因为我们选的是ignore

 

deployment 例子:

 

 

 

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)