一、前言

本文主要以下几方面介绍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不能部署在没有完成可用性测试的节点上