kubernetes调度控制场景与配置方法

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:
  
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值