本文主要是介绍k8s-----23、Taint和Toleration、污点和容忍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、使用场景
生产环境部署规则
1、master节点不允许部署其他类型的pod节点
2、新增node节点需要经过测试才可投入使用,才允许pod部署在该节点
3、维护/升级node节点时,需要将节点上的pod提前进行迁移
4、特殊节点:比如这个节点是SSD/GPU类型的。 不能随便一个pod都部署在这个节点
设置了污点和容忍后,并一定就必须按照这个污点和容忍去走,并不一定非要部署在有污点的节点,类似于回家有5个门,有些门设置了污点,也就是有锁的,但是有些门没有设置,刚好没锁,然后刚好走到了这个门,直接就可以进去了。所以pod并不会一定走到这个节点。
2、概念
Taint能够使节点排斥一类特定的Pod,Taint和Toleration相互配合可以用来避免Pod被分配到不合适的节点,比如Master节点不允许部署系统组件之外的其他Pod。每个节点上都可以应用一个或多个Taint,这表示对于那些不能容忍这些Taint的Pod是不会被该节点接受的。如果将Toleration应用于Pod上,则表示这些Pod可以(但不要求)被调度到具有匹配Taint的节点上。
2.1 taint 污点
污点:针对的是node节点
Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署 在打了污点的服务器上。
2.2 Toleration容忍
容忍:针对的是pod
Toleration是让Pod容忍节点上配置的污点,可以让一些 需要特殊配置的Pod能够调用到具有污点和特殊配置的节点上。
2.3 官网
官网文档
3、配置解析
3.1 Taint配置解析
创建一个污点(一个节点可以有多个污点):kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT #nodes表示节点主机名,key 和 value,冒号后面是调度策略
比如:kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule #示例
调度策略:
NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响
NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)
PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点
3.2 Toleration配置解析
策略:
方式1 完全匹配:key value effect完全和污点的节点相同tolerations:- key: "taintKey"operator: "Equal" value: "taintValue" effect: "NoSchedule"
方式2 不完全匹配:满足key的就可以调度到这个节点上tolerations:- key: "taintKey"operator: "Exists" effect: "NoSchedule"
方式3 大范围匹配(不推荐key为内置Taint)tolerations:- key: "taintKey" operator: "Exists"
方式4 匹配所有(不推荐)tolerations:- operator: "Exists"
停留时间配置:tolerations: - key: "key1"operator: "Equal"value: "value1"effect: "NoExecute" #驱逐tolerationSeconds: 3600 # 可以在node上停留的时间,不会立即驱逐
4、使用案例
有一个节点是纯SSD硬盘的节点,现需要只有一些需要高性能存储的Pod才能调度到该节点上
#给节点打上污点和标签:
1. kubectl taint nodes k8s-node01 ssd=true:NoExecute(此时会驱逐没有容忍该污点的Pod)
2. kubectl taint nodes k8s-node01 ssd=true:NoSchedule
3. kubectl label node k8s-node01 ssd=true
#配置pod
apiVersion: v1
kind: Pod
metadata:name: nginx labels:env: testspec:containers:- name: nginx image: nginximagePullPolicy: IfNotPresent nodeSelector:ssd: "true" tolerations: - key: "ssd"operator: "Exists"
5、内置污点
➢ node.kubernetes.io/not-ready:节点未准备好,相当于节点状态Ready的值为False。
➢ node.kubernetes.io/unreachable:Node Controller访问不到节点,相当于节点状态Ready的值为Unknown。
➢ node.kubernetes.io/out-of-disk:节点磁盘耗尽。
➢ node.kubernetes.io/memory-pressure:节点存在内存压力。
➢ node.kubernetes.io/disk-pressure:节点存在磁盘压力。
➢ node.kubernetes.io/network-unavailable:节点网络不可达。
➢ node.kubernetes.io/unschedulable:节点不可调度。
➢ node.cloudprovider.kubernetes.io/uninitialized:如果Kubelet启动时指定了一个外部的cloudprovider,它将给当前节点添加一个Taint将其标记为不可用。在cloud-controller-manager的一个controller初始化这个 节点后,Kubelet将删除这个Taint。
节点不健康,6000秒后再驱逐(默认是300秒): 这里的时间需要合理配置,有时候由于网络抖动导致的,所以时间设置不可以太短,但是时间设置过长,可能导致业务受损。
tolerations:
- key: "node.kubernetes.io/unreachable"operator: "Exists" effect: "NoExecute" tolerationSeconds: 6000 #只容忍这么长时间
6、taint命令常用示例
创建一个污点(一个节点可以有多个污点):kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
比如:
查看一个节点的污点:kubectl get node k8s-node01 -o go-template --template {{.spec.taints}}kubectl describe node k8s-node01 | grep Taints -A 10
删除污点(和label类似):基于Key删除: kubectl taint nodes k8s-node01 ssd-基于Key+Effect删除: kubectl taint nodes k8s-node01 ssd:PreferNoSchedule-
修改污点(Key和Effect相同):kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite
这篇关于k8s-----23、Taint和Toleration、污点和容忍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!