一、目标

学习掌握什么是kubernetes(k8s)集群调度的污点Taint和容忍Toleration。
(白话解释:所谓污点就是故意给某个节点服务器上设置个污点参数,那么你就能让生成pod的时候使用相应的参数去避开有污点参数的node服务器。而容忍呢,就是当资源不够用的时候,及时这个node服务器上有污点,那么只要pod的yaml配置文件中写了容忍参数,最终pod还是会容忍的生成在该污点服务器上。默认master节点是NoSchedule)

二、平台

[root@kahn.xiao ~]# uname -r
3.10.0-957.el7.x86_64
[root@kahn.xiao ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@master qinhe]# rpm -qa |grep kube
kubeadm-1.17.3-0.x86_64
kubernetes-cni-0.7.5-0.x86_64
kubelet-1.17.3-0.x86_64
kubectl-1.17.3-0.x86_64

各主机规划:
主机名          IP                       角色                       端口
master  192.168.73.150    master,node        
node1   192.168.73.151    node                      
node2   192.168.73.152    node 
harbor   192.168.73.160   harbor私服

三、概念

1.污点(Taint)的组成
使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。key=value:effect

每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用。当前taint effect支持如下三个选项:
●NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
●PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
●NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去

四、查看master节点的Taint配置情况

1.先查看所有节点kubectl get node,确认master节点的完整名字

2.查看master节点的详情kubectl describe node master.hiibm.com
从下图中可以清晰的看到master节点被默认的打上了污点属性NoSchedule

五、给某个节点服务器打上污点标签

1.先看一下当前pod都分布到哪些节点上(没有pod的话就自己创建几个pod出来)

kubectl get pod -owide

2.给节点2服务器打上污点标签NoExecute

kubectl taint nodes node2.hiibm.com check=xtaint:NoExecute

注释:
check------->键 
value: "xtaint"----------->容忍的键对应的键值
"NoExecute"----------->容忍的键对应的影响效果effect

3.观察当前pod的变化过程
可以从图中看到,xnode1上的那个叫xnode1的pod正在被删除。再过一会,就被彻底删除了。这正是我们想要的效果

4.删除node上的设置的污点

kubectl taint nodes node2.hiibm.com check=xtaint:NoExecute-

没有设置过污点的节点属性中的参数是这样的Taints:             <none>

六、容忍Toleration

1.前言:
刚才已经在node2节点上设置了污点【check=xtaint:NoExecute】,然后在node2上的以前运行的pod都自动的被删除了。那么接下来我们用容忍toleration看看能不能在node2节点上创建pod。

2.创建一个包含有容忍toleration的配置文件

[root@master taint]# vim a1-taint-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    app: pod-3
spec:
  containers:
  - name: pod-3
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  tolerations:
  - key: "check"
    operator: "Equal"
    value: "xtaint"
    effect: "NoExecute"
    tolerationSeconds: 3600

注释:
tolerations:----------->容忍
- key: "check" ----------->容忍的键
operator: "Equal"----------->操作符"等于"
value: "xtaint"----------->容忍的键对应的键值
effect: "NoExecute"----------->容忍的键对应的影响效果
tolerationSeconds: 3600----------->容忍3600秒。纳尼?啥意思?貌似是,好像本pod配置文件中有这个参数了,然后再给本服务器设置污点NoExecute,那么这个pod也不会像普通pod那样立即被驱逐,而是再等上3600秒才被删除。

3.使用包含有容忍的配置文件生成pod

kubectl apply -f a1-taint-pod.yaml

4.查看包含容忍的这个pod生成到哪里了

kubectl get pod -owide

注释:
a. 之前我们只在node2.hiibm.com上设置了污点【check=xtaint:NoExecute】。也就是说,如果没有特殊设定的情况下,普通的pod是永远不会生成在node2服务器上的。
b. 那本次的pod配置文件已经明确写了容忍条件,能够准确匹配容忍node2上的污点,切记啊是准确匹配配置文件中的参数,少一个参数都不行。所以本次的pod运气好的话还能继续生成在node2服务器上。
c. 纳尼?你运气咋这么好?如果运气不好的话你也可以把node1服务器也设置上和node2一样的污点。然后本pod就会像以前一样随意生成到任意一个节点服务器。
 

七、让master节点设置尽可能当成节点服务器使用

kubectl taint nodes master.hiibm.com node-role.kubernetes.io/master=:PreferNoSchedule

注释:上面这条命令是针对服务器master.hiibm.com,当node节点服务器资源不够用的时候,pod也可以生成到这个服务器master.hiibm.com上。这样能充分利用资源。

--------------------------------------------END----------------2020年3月9日16:03:10-------------------------------------

抵制伸手党。随手点赞啊老铁,双击666

Logo

开源、云原生的融合云平台

更多推荐