kubernetes的调度和驱逐
kubernetes的调度
我们在节点上创建Pod的时候,实际上是通过 kube-scheduler 进行了一系列的调度打分等动作才决定了Pod能够运行在哪个节点上。首先kube-scheduler会先进行过滤。Pod本身可能具备一些需求。要求会运行到特定的节点上。此时通过过滤器可以筛选出可调度的节点。在可调度节点的基础上。kube-scheduler 再根据内置的函数对节点进行打分。通过打分以后。选取最合适的节点。将该节点通知给 kube-apiserver。让 kube-apiserver 知道后续创建Pod到哪台节点上。
有关kubernetes默认支持的调度函数,打分函数可以参考链接。
https://kubernetes.io/zh/docs/reference/scheduling/policies/
污点与容忍
什么是污点?
通过给节点添加污点,可以阻止Pod创建在带有污点的节点上。管理员可以通过合理的设置污点。来控制业务Pod的运行。如:管理员不希望业务Pod运行在master节点上。这种需要就可以通过在master节点上添加污点来实现。事实上kubernetes默认也为master添加上了 node-role.kubernetes.io/master:NoSchedule
的污点。避免业务Pod直接运行在master节点上。
通过污点我们可以阻止Pod运行到带污点的节点上,如果希望Pod能运行到这些带污点的节点上则需要给Pod添加容忍配置。通过设置容忍能够让Pod支持调度到带有污点的节点。
污点的应用场景
- 通过污点规划专用节点,避免Pod被直接调度到该类节点上。比方说带有GPU设备的节点。可以打上一个特定污点。只要未设置该类污点容忍配置的Pod都无法被调度到这类GPU节点上。只有需要使用GPU资源的Pod配置了容忍才能被调度到。通过这种方法可以实现Pod调度控制。
- 基于污点来实现驱逐Pod,可以通过给节点打上污点,让不支持该污点的Pod被驱逐到其他节点上。
污点的配置支持下面三种类型
- NoSchedule 表示如果pod没有容忍这些污点,pod则法被调度到包含该污点的节点上。
- PreferNoSchedule 相当于NoSchedule宽松的版本,在调度时会尽量阻止pod调度到具备PreferNoschedule 污点的节点上,但在没有其他节点可以提供调度的场景下。pod则可以被调度PreferNoschedule 污点的节点上。
- NoExecute用于影响正在节点上运行的pod。如果当前节点上运行的pod没有容忍该节点上的NoExecute污点,则会Pod将会从该节点上去除。
上述的三种污点类型中,其中NoSchedule和PreferNoSchedule是用于控制Pod调度过程时的动作。而NoExecute则是影响调度后正在运行Pod的节点。
污点的配置示例
添加污点示例
kubectl taint node 主机名 key=value:污点类型
在添加taint的时候,value字段是可以省略的。
可以支持基于label来进行污点的添加删除,添加-l key=value 选项即可实现
污点支持的详细参数,可通过
kubectl explain node.spec.taints
查询。
移除污点示例
kubectl taint node 主机名 key:污点类型-
在移除污点时,key后面可以省略污点类型。这样做就会删除所有指定的key值污点。
污点作用测试
当我们给节点添加上污点以后,可以怎么样去测试是否生效?这时候我们通过给Pod添加 NodeSelector
的配置,将Pod绑定到带污点的节点上。
添加 NodeSelector
的Pod配置
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
nodeSelector: #通过nodeSelector,将Pod调度到带有设置的key:value标签节点。此处标签为node=master
node: master
查看调度结果,此时会打印出 node(s) had taint
的事件。遇到这类的提示,可以确认一下Pod是否配置容忍,容忍的配置是否匹配环境等。
污点配置案例
1.给k8s-node01节点添加上污点,使得创建Pod时,无法调度到该节点上。
kubectl taint node k8s-node01 node-type=production:NoSchedule
2.给具备 node-type=gray 标签的节点添加污点,使得Pod创建时,不优先调度到这类节点上。
kubectl taint node -l node-type=gray node-type=gray:PreferNoSchedule
3.移除k8s-node01节点上key值为 node-type 的污点
kubectl taint node k8s-node01 node-type
4.为k8s-node01添加污点,直接驱逐未容忍该污点的Pod。
kubectl taint node k8s-node01 node-type=drain:NoExecute
容忍的配置示例
tolerations支持如下配置
选项 | 说明 |
---|---|
effect | effect可以填写污点的类型(NoSchedule,NoExecute等),当effect为空时,代表匹配key名称的所有污点类型。 |
key | 指定容忍的污点key字段,当key值为空的场景(此时operator必须设置为Exists),则代表它匹配所有污点的key。 |
value | 指定容忍的污点value字段,当operator设置为Exists的场景。此字段必须为空。 |
operator | 支持Equal以及Exists两个参数。默认使用Equal,使用Exists时,只需要配置key字段,相当于key:*的匹配形式。使用Equal需要同时指定key和value值 |
tolerationSeconds | 该字段作用于NoExecute ,当节点打上了污点类型为NoExecute 时,会驱逐没有容忍NoExecute 的Pod。如果Pod指定了容忍NoExecute 类型的同时,指定了tolerationSeconds 选项。则Pod会等待tolerationSeconds 设置的时间。再进行Pod驱逐。 |
通过如下命令可以查询tolerations可以支持的选项,以及选项的注释
kubectl explain deployment.spec.template.spec.tolerations
容忍配置案例
1.添加容忍配置,允许Pod调度到节点标签为 node-type=gray ,并且污点类型为 NoSchedule 的机器。
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
tolerations:
- effect: NoSchedule #设置污点类型为NoSchedule
key: "node-type" #key值为node-type
operator: Equal
value: "gray" #value值为Equal
2.添加容忍配置,允许Pod调度到任何打 上NoSchedule 污点类型的节点。
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
tolerations:
- effect: NoSchedule #设置污点类型为NoSchedule
key: "" #当key值为空,operator为Exists时,匹配任意key值
operator: Exists
3.添加容忍配置,允许Pod运行在具备 node-type=gray 且污点类型为任意类型的节点上。
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
tolerations:
- effect: "" #设置污点类型为空,代表它支持任意污点类型
key: "node-type"
operator: Equal
value: "gray"
4.添加容忍配置,允许Pod运行在具有 node-type=drain 且污点类型为 NoExecute 的节点上。
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
tolerations:
- effect: "NoExecute" #设置污点类型为NoExecute,未容忍该污点的Pod直接被驱逐
key: "node-type"
operator: Equal
value: "drain"
5.添加容忍配置,允许Pod运行在具有 node-type=drain 且污点类型为 NoExecute 的节点上,当300秒以后该污点依旧存在时,驱逐该Pod到其他节点。
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: pod-demo
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
tolerations