营销型网站制作服务商,郑州高端网站建设公司,wordpress支付免签约,做电影解析网站污点、容忍度 污点容忍度 taints 是键值数据#xff0c;用在节点上#xff0c;定义污点#xff1b; tolerations 是键值数据#xff0c;用在pod上#xff0c;定义容忍度#xff0c;能容忍哪些污点。
污点
污点是定义在k8s集群的节点上的键值属性数据#xff0c;可以决… 污点、容忍度 污点容忍度 taints 是键值数据用在节点上定义污点 tolerations 是键值数据用在pod上定义容忍度能容忍哪些污点。
污点
污点是定义在k8s集群的节点上的键值属性数据可以决定拒绝那些pod。 给了Node选则的主动权给Node打个污点不容忍 的Pod就调度不上来。
现象刚部署好的K8S集群默认master节点上不会被调度来任何pod。 原因master节点上有个污点
看 master节点的信息
kubectl describe nodes k8s-master1Taints: node-role.kubernetes.io/control-plane:NoSchedule排斥等级
查看帮助命令看如何设置Node的污点taints是spec字段下的子字段
kubectl explain node.spec.taints解释说明
taints的 effect 字段必填 用来定义对pod对象的排斥等级
NoSchedule仅影响pod调度过程仅对未调度的pod有影响。例如这个节点的污点改了使得之前调度的pod不能容忍了对现存的pod对象不产生影响NoExecute既影响调度过程又影响现存的pod对象例如如果现存的pod不能容忍节点后来加的污点这个pod就会被驱逐排斥等级最高PreferNoSchedule最好不也可以是NoSchedule的柔性版本。例如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-typeproduction:NoScheduleps. 排斥等级:NoSchedule必填否则创建失败 给k8s-node2打污点后pod如果不能容忍就不会调度过来 创建pod资源文件
vim taint-pod.yaml apiVersion: v1
kind: Pod
metadata:name: taint-podnamespace: defaultlabels:tomcat: tomcat-pod
spec:containers:- name: taint-podports:- containerPort: 8080image: 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-typedev:NoExecute查看pod
kubectl get pods -o wide上面可以看到已经存在的pod节点都被撵走了
只看节点的污点
kubectl describe node k8s-node1|grep Taintsps. 删除污点的方式
kubectl taint nodes k8s-node2 node-type-容忍度
重新给node1打上污点保证2个工作节点node上都打了污点。通过配置Pod的容忍度完成调度
查看帮助命令看如何设置Pod的容忍度tolerations是spec字段下的子字段
kubectl explain pod.spec.tolerations重点部分截图
解释说明
effect用来匹配node的污点等级keynode标签的键operator匹配表达式valuenode标签的值tolerationSeconds与NoExecute搭配使用表示驱逐时间
tolerations 中的 effect 字段 用来匹配污点等级
NoExecuteNoSchedulePreferNoSchedule
示例1 创建pod时指定具体可容忍的node的特征
创建pod资源文件
vim vim pod-demo-1.yaml apiVersion: v1
kind: Pod
metadata:name: myapp-deploynamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80tolerations: # 设置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-deploynamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80tolerations: - key: node-type operator: Equal value: production effect: NoSchedule 重建pod资源
kubectl delete -f pod-demo-1.yamlkubectl 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-deploynamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80tolerations: - key: node-type operator: Exists # 调整了匹配方式value: # 去掉了node的污点值effect: NoSchedule # 匹配的等级只要对应的键是存在的exists其值被自动定义成通配符 重建pod资源
kubectl delete -f pod-demo-1.yamlkubectl apply -f pod-demo-1.yaml查看pod
kubectl get pods -o wide发现还是调度到k8s-node2上
再次修改
apiVersion: v1
kind: Pod
metadata:name: myapp-deploynamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80tolerations: - key: node-type operator: Exists # 调整了匹配方式value: # 去掉了值effect: # 去掉node的污点等级有一个node-type的键不管值是什么不管是什么污点等级都能容忍 重建pod资源
kubectl delete -f pod-demo-1.yamlkubectl apply -f pod-demo-1.yaml查看pod
kubectl get pods -o wide可以看到k8s-node2和k8s-node1节点上都有可能有pod被调度