kubernetes(k8s)-32之污点Taint和容忍Toleration
一、目标学习掌握什么是kubernetes(k8s)集群调度的污点Taint和容忍Toleration。(白话解释:所谓污点就是故意给某个节点服务器上设置个污点参数,那么你就能让生成pod的时候使用相应的参数去避开有污点参数的node服务器。而容忍呢,就是当资源不够用的时候,及时这个node服务器上有污点,那么只要pod的yaml配置文件中写了容忍参数,最终pod还是会容忍的生成在该污点服务...
一、目标
学习掌握什么是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
更多推荐
所有评论(0)