一、前言¶
本文主要以下几方面介绍k8s中的污点(Taint):
- 什么是污点
- 污点出现背景
- 污点种类
- 污点使用场景
- 污点配置解析
- 污点如何使用
本文主要以下几方面介绍k8s中的容忍(Toleration):
- 什么是容忍
- 容忍出现背景
- 容忍配置解析
- 容忍如何使用
本文主要以下几方面介绍k8s中的污点(Taint)和容忍(Toleration)配合使用案例:
- 专用节点
- 特殊硬件的节点
- 基于Taint的驱逐
二、什么是污点¶
Taint作用在节点上,能够使节点排斥一类特定的Pod,也就是不能“兼容”该节点的污点的Pod。
注意:一个节点可以部署多个污点!!!
三、污点出现背景¶
之所以出现污点,是因为要避免Pod被分配到不合适的节点,比如有一批GPU服务器只能部署要使用GPU的Pod。每个节点上都可以应用一个或多个Taint,这表示对于那些不能容忍这些Taint的Pod是不能部署在该服务器上的。如果Pod配置了Toleration,则表示这些Pod可以被调度到设置了Taint的节点上,当然没有设置Taint的节点也是可以部署的。
四、污点种类¶
污点分为外置污点和内置污点,主要说明如下:
- 外置污点:人工使用Taint命令给节点打上的污点
- 内置污点:系统自带的污点
当某种条件为真时,节点控制器会自动给节点添加一个污点。当前内置的污点包括:
node.kubernetes.io/not-ready:节点未准备好。这相当于节点状况Ready的值为 "False"。node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状况Ready的值为 "Unknown"。node.kubernetes.io/memory-pressure:节点存在内存压力。node.kubernetes.io/disk-pressure:节点存在磁盘压力。node.kubernetes.io/pid-pressure: 节点的 PID 压力。node.kubernetes.io/network-unavailable:节点网络不可用。node.kubernetes.io/unschedulable: 节点不可调度。node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。
在节点被驱逐时,节点控制器或者 kubelet 会添加带有 NoExecute 效果的相关污点。 如果异常状态恢复正常,kubelet 或节点控制器能够移除相关的污点。但是被驱逐的Pod需要手动进行删除。
五、污点使用场景¶
污点一般用于调度Pod部署的节点,常用调度场景如下:
- Pod不能部署在Master节点上
- 某个节点需要维护/升级,需要将该节点上的Pod迁移到其他节点
- GPU的Pod只能部署在GPU服务器上
- Pod不能部署在没有完成可用性测试的节点上