20、k8s-污点(Taints)--针对node设置和容忍(Toleration)--针对pod设置
污点(Taints):
·前面的调度方式都是站在pod上添加属性、来确定pod是否要调整到指定的Node上、其实我们也可以站在Node的角度上、通过添加污点属性、来决定是否允许pod调度过来
·Node被设置上污点后就和pod之间存在了一种相斥的关系、进而拒绝pod调度进来、甚至可以将已存在的pod驱逐出去
·污点的格式为:key=value:effect、key和value是污点的标签、effect是描述污点的作用的、支持如下三个选项:
·PreferNoSchedule:kubernetes将尽量避免把pod调度到具有该污点的Node上、除非没有其它污点可以调度
·NoSchedule:kubernetes将不会把pod调度到具有该污点的node上、但不会影响当前的node上已存在的pod
·NoExecute:kubernetes将不会把pod调度到具有该污点的node上、同时也会将node上已存在的pod驱离
#设置污点:
kubectl taint nodes node1 key=value:effect
#去除污点
kubectl taint nodes node1 key:effect-
#去除所有的污点
kubectl taint nodes node1 key-
##PreferNoSchedule :表示尽量不要调度到node-1上、如果是在没地方去才能调度过来
1、为node-1节点添加一个污点:chen=taixin:PreferNoSchedule
·添加污点:kubectl taint nodes node-1 chen=taixin:PreferNoSchedule
·查看node的污点:kubectl describe nodes node-1
··找到这一行:Taints: chen=taixin:PreferNoSchedule
·创建一个pod-1(看pod-1会不会被调度到node-1上去)
·创建pod-1:kubectl run pod-1 --image=nginx:1.17.1 -n dev
·查看pod-1是否成功运行在node-1节点上:kubectl get pods -n dev -o wide
##Noschedule :表示不能调度到我这个节点上、原来已经在node-1节点上的没事
2、为node-1节点添加一个污点:chen=taixin:NoSchedule
·先取消node-1上的preferNoScheddule污点:kubectl taint nodes node-1 chen:PreferNoSchedule-
·再添加污点: kubectl taint nodes node-1 chen=taixin:NoSchedule
·添加pod-2(看pod-2是否可以正常调度到node节点):kubectl run pod-2 --image=nginx:1.17.1 -n dev
·查看新建的pod-2是否正常再node-1节点上运行:kubectl get pods -ndev -o wide
··发现pod-2节点的状态是"Pending"、NODE是<none>
#NoExecute:表示不能调度到我这个节点上、原来已经在node-1节点上的所有pod都会被删掉
3、为node-1节点添加一个污点:chen=taixin:NoExecute
·先去掉node-1上的污点:taint nodes node-1 chen:NoSchedule-
·再给node-1添加污点:kubectl taint nodes node-1 chen=taixin:NoExecute
·查看dev上的pod发现都已经停止或者被删除了:kubectl get pods -ndev -o wide
·创建pod-3后(看是否能正常运行):kubectl run pod-3 --image=nginx:1.17.1 -n dev
·查看新建的pod-3是否正常再node-1节点上运行:kubectl get pods -ndev -o wide
··发现pod-3节点的状态是"Pending"、NODE是<none>
扩展:
注意:master节点上是有污点的、所以pod才不会被调度到master上
#查看master的信息:kubectl describe nodes master
#@Taints: node-role.kubernetes.io/master:NoSchedule
====================================容忍---针对pod设置=======================
上面介绍到了污点的作用、我们可以再node上添加污点用于拒绝pod调度上来、相应的如果pod身上设置0容忍模式就可以不介意node身上有污点、这样有容忍的大度的pod就可以调度到有污点的node上去了
#在上面、已经给node-1添加了污点NoExecute、此时的pod是调度不上去的
#给pod添加容忍
1、创建yaml文件:vim pod-toleration.yaml
--------------------------------
apiVersion: v1
kind: Pod
metadata:
name: pod-toleration
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
tolerations: #添加容忍
- key: "chen" #要容忍的污点
operator: "Equal" #操作符 等于 chen=taixin
value: "taixin" #要容忍污点的值
effect: "NoExecute" #添加容忍的规则、这里的规则必须和污点的规则一样
------------------------------------------------------------------------------------
2、创建pod:kubectl create -f pod-toleration.yaml
3、查看pod信息:kubectl get pods pod-toleration -ndev -o wide
4、去掉node-1的污点:kubectl taint nodes node-1 chen:NoExecute-