赞
踩
taints 是键值数据,用在节点上,定义污点;
tolerations 是键值数据,用在pod上,定义容忍度,能容忍哪些污点。
污点是定义在k8s集群的节点上的键值属性数据,可以决定拒绝那些pod。
给了Node选则的主动权,给Node打个污点,不容忍 的Pod就调度不上来。
现象:刚部署好的K8S集群,默认master节点上不会被调度来任何pod。
原因:master节点上有个污点
看 master节点的信息
kubectl describe nodes k8s-master1
Taints: node-role.kubernetes.io/control-plane:NoSchedule(排斥等级)
查看帮助命令,看如何设置Node的污点(taints是spec字段下的子字段)
kubectl explain node.spec.taints
解释说明
taints的 effect 字段(必填) 用来定义对pod对象的排斥等级
上面看到的 master节点的污点是Noschedule
所以默认创建的pod都不会调度到master上,因为创建的pod没有容忍度
查看部署后master节点上Pod的信息
kubectl describe pods kube-apiserver-k8s-master1 -n kube-system
相关信息的片段
可以看到这个pod的容忍度是NoExecute,则可以调度到k8s-master1上。
兼容了等级比NoExecute低的污点。
(注意:在自建pod里污点等级,必须完全匹配才行)
示例1: 使用污点排斥等级是NoSchedule
给k8s-node2打上污点
污点的key为node-type,值为production,排斥等级是NoSchedule
kubectl taint node k8s-node2 node-type=production:NoSchedule
ps. 排斥等级":NoSchedule"必填,否则创建失败
给k8s-node2打污点后,pod如果不能容忍就不会调度过来
创建pod资源文件
vim taint-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: taint-pod
namespace: default
labels:
tomcat: tomcat-pod
spec:
containers:
- name: taint-pod
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
创建pod资源
kubectl apply -f taint-pod.yaml
查看pod
kubectl get pods -o wide
可以看到被调度到k8s-node1上了,因为k8s-node2这个节点打了污点,而在创建pod的时候没有容忍度,所以k8s-node2上不会有pod调度上去的
示例2 :使用污点类型是NoExecute
在示例1的基础上,给刚刚的k8s-node1打污点
kubectl taint node k8s-node1 node-type=dev:NoExecute
查看pod
kubectl get pods -o wide
上面可以看到已经存在的pod节点都被撵走了
只看节点的污点
kubectl describe node k8s-node1|grep Taints
ps. 删除污点的方式
kubectl taint nodes k8s-node2 node-type-
重新给node1打上污点,保证2个工作节点node上都打了污点。通过配置Pod的容忍度完成调度
查看帮助命令,看如何设置Pod的容忍度(tolerations是spec字段下的子字段)
kubectl explain pod.spec.tolerations
重点部分截图:
解释说明
tolerations 中的 effect 字段 用来匹配污点等级
示例1 创建pod时,指定具体可容忍的node的特征
创建pod资源文件
vim vim pod-demo-1.yaml
apiVersion: v1 kind: Pod metadata: name: myapp-deploy namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: # 设置Pod的容忍度 - key: "node-type" # node标签的键 operator: "Equal" # 匹配方式为等值匹配 value: "production" # node标签的值 effect: "NoExecute" # node的污点等级 tolerationSeconds: 3600 # 与NoExecute搭配使用表示驱逐时间
创建pod资源
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
还是显示pending,因使用的是equal(等值匹配),所以 key、value和effect 必须和 node 节点定义的污点完全匹配才可以。
把上面yaml文件调整一下:
1、配置effect: “NoExecute"变成"NoSchedule”
2、去掉tolerationSeconds
apiVersion: v1 kind: Pod metadata: name: myapp-deploy namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: - key: "node-type" operator: "Equal" value: "production" effect: "NoSchedule"
重建pod资源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
上面就可以调度到k8s-node2上了,因为在pod中定义的容忍度能容忍node节点上的污点
示例2:使用非精准容忍度匹配
再调整 pod-demo-1.yaml 的部分配置
apiVersion: v1 kind: Pod metadata: name: myapp-deploy namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: - key: "node-type" operator: "Exists" # 调整了匹配方式 value: "" # 去掉了node的污点值 effect: "NoSchedule" # 匹配的等级
只要对应的键是存在的,exists,其值被自动定义成通配符
重建pod资源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
发现还是调度到k8s-node2上
再次修改
apiVersion: v1 kind: Pod metadata: name: myapp-deploy namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: - key: "node-type" operator: "Exists" # 调整了匹配方式 value: "" # 去掉了值 effect: "" # 去掉node的污点等级
有一个node-type的键,不管值是什么,不管是什么污点等级,都能容忍
重建pod资源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
可以看到k8s-node2和k8s-node1节点上都有可能有pod被调度
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。