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: test
  spec:
    containers:
    - name: nginx 
      image: nginx
      imagePullPolicy: 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新学习目录,1024程序员节)