Pod的调度
Pod通过kubelet进程创建出来的
kubectl 像Api server发送一个请求,Api server 吧请求信息存储到ETCD数据库中,scechderl通过实现监听,然后决定Pod调度到那个节点。
有两种情况Pod不可以被调度
- Node 不能正常运行,Pod不可以正常运行,这时可以给Node打上一个污点,污点类型有
NoSchedule
NoExecute
PreferNoSchedule
格式
**:污点类型
kubectl taint nodes node01 ***:NoShedule
- 该Node有特殊用途,例如master节点。这时可以运行特殊的Pod,例如Kubelet,这时牵扯到了容忍,在类型前面添加
***:污点类型
格式
kubectl taint nodes node01 ***(env=prod):NoExecute
#此时这个Node打上污点,除非Pod标签中有env=prod,这时可以容忍运行
如下图
taint(污点),示例
使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。每个污点的组成:key=value:effect,当前taint effect支持如下三个选项:
NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
kubectl taint nodes node01 key1=value1:NoShedule
#为node0设置不可调度污点,此时Pod不可以被调度到此Node。
NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去
kubectl taint nodes node01 key1=value1:NoExecute
#为node0节点设置尽量不可调度污点,有Pod运行也会停止运行
PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
kubectl taint nodes node01 key1=value1:PreferNoSchedule
#为node0设置不可调度污点,此时Pod不可以被调度到此Node。
移除污点
kubectl taint nodes node01 key1=value1:PreferNoSchedule-
#将node0上key值为key1的污点移除
容忍(Tolerations)
设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。