目录
k8s的污点介绍
基于节点标签分配是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的Node上,其实我们也可以站在 Node的角度上,通过在Node上添加污点属性,来避免Pod被分配到不合适的节点上。
Taints:避免Pod调度到特定Node上
Tolerations:允许Pod调度到持有Taints的Node上
注意:master默认有污点,主要原因是处于安全性考虑,可以让master节点不运行业务容器
Taints案例,给节点添加污点
第一步:给节点添加污点
格式:
kubectl taint node [node] key=value:[effect]
例如:
kubectl taint node k8s-node1 gpu=yes:NoSchedule
查看污点命令:
kubectl describe node |grep Taint
验证:
kubectl describe node k8s-node1 |grep Taint

其中[effect] 可取值:
• NoSchedule :一定不能被调度(新来的不要来,在这的就别动了)
• PreferNoSchedule:尽量不要调度(尽量不要来,除非没办法)
• NoExecute:不仅不会调度,还会驱逐Node上已有的Pod(新的不 要来,在这的赶紧走)
新建一个pod测试
kubectl run pod1 --image=nginx
自动被分配到了没有污点的node2

注意:如果所有节点都有污点,那新建pod状态会为pending,无法被分配
用途:一般作为负载比较多了的节点打上污点不让节点在分配
污点容忍, Tolerations
污点容忍是指在写pod的yaml文件时,写入污点容忍配置来允许pod被分配到已经打了污点的节点上
添加污点容忍(tolrations)字段到Pod配置中
案例
先把所有节点打上污点

写入一个创建pod的yaml,yaml的逻辑是将pod分配到一个污点名为tt,值为vv2的节点上去
apiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod-tolerationsspec:tolerations:- key: "tt"operator: "Equal"value: "vv2"effect: "NoSchedule"containers:- image: nginx # 主容器name: web
其中,作为污点容忍的主要是这一句
tolerations:- key: "tt"operator: "Equal"value: "vv2"effect: "NoSchedule
可以看到,pod被分配到已经打了污点的node2上

删除污点
kubectl taint node [node] key:[effect]-
例如
kubectl taint node k8s-node1 tt:NoSchedule-

nodeName
nodeName:指定节点名称,用于将Pod调度到指定的Node上,不经过调度器。
使用场景:一般做测试用
案例:
apiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod-nodenamespec:nodeName: k8s-node1containers:- image: nginx # 主容器name: web
负责调度的是这一句,因为直接指定节点,所以不经过调度器,污点以及标签适配对他无效,直接被分配到指定的node1
nodeName: k8s-node1
