kubernetes的taint(污点)和toleration(容忍)

3、node节点的taint(污点)和toleration(容忍)

使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载。这是因为当前的master节点被打上了node-role.kubernetes.io/master:NoSchedule的污点:

[root@master] ~$ kubectl describe nodes master.hanli.com |grep -E '(Roles|Taints)'
Roles:              master
Taints:             node-role.kubernetes.io/master:NoSchedule

因为这里搭建的是测试环境,内存资源不太足,可以选择去掉这个污点使master来承担一些工作负载:

先看一下taint命令的语法格式

kubectl taint node [node] key=value[effect]  

其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]

  • NoSchedule: 一定不能被调度
  • PreferNoSchedule: 尽量不要调度,实在没有地方调度的情况下,才考虑可以调度过来
  • NoExecute: 不仅不会调度, 还会立即驱逐Node上已有的Pod

现在去掉污点:key的值node-role.kubernetes.io,value为空

[root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master-
node/master.hanli.com untainted

修改后查看Taints字段状态:

[root@master] ~$ kubectl describe nodes master.hanli.com |grep -E '(Roles|Taints)'
Roles:              
Taints:             

如果要重新使master打上污点,即恢复Master 的不可调度状态,执行如下命令:

[root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master=:NoSchedule
node/master.hanli.com tainted

这里要注意的是如果你丢掉了“=”,会报 error: at least one taint update is required错误

[root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master:NoSchedule
error: at least one taint update is required

除了直接去除污点,我们还可以在pod的yaml 配置文件中添加tolerations 字段来容忍 节点的污点

例如,如果你想让你的pod可以被调度到master节点上,在 pod 的 spec 中添加如下设置即可:

tolerations:
- key: "node-role.kubernetes.io/master"
  operator: "Equal"
  value: ""
  effect: "NoSchedule"

你可能感兴趣的:(kubernetes)