内容提要
Kubernetes污点与容忍用于控制Pod调度:可为特定用户或特殊硬件(如GPU)节点打污点,仅允许带容忍的Pod调度;NoExecute污点可驱逐不容忍的Pod,并通过tolerationSeconds控制停留时间。节点故障时系统自动添加not-ready、unreachable等污点,默认容忍300秒;DaemonSet的Pod永不被驱逐。
延伸解读
污点与容忍的典型应用场景
文章列举了污点与容忍的两种典型用法:一是为特定用户组指定节点,通过打上专用污点并配合准入控制器自动添加容忍;二是为GPU等特殊硬件节点打污点,避免普通Pod占用资源。后者推荐使用Extended Resources和ExtendedResourceToleration准入控制器,自动为需要扩展资源的Pod添加容忍,无需手动配置,既保证了资源专用性,又简化了调度管理。
节点故障时的自动驱逐与容忍时间
当节点故障时,节点控制器会自动添加not-ready、unreachable等污点,默认给Pod添加tolerationSeconds=300的容忍,使Pod在故障后5分钟内不被驱逐。用户可自定义容忍覆盖默认值,例如为有本地状态的应用设置更长的tolerationSeconds,以等待网络脑裂恢复。DaemonSet的Pod则默认添加不带tolerationSeconds的NoExecute容忍,确保永不被驱逐。
基于污点驱逐的版本演进与限流机制
基于污点的驱逐在1.13版本提升为beta并默认开启,取代了之前基于Node condition ready状态的驱逐逻辑。系统通过限速方式添加污点,防止master与node脑裂导致大规模驱逐。condition驱动的污点在1.12版本为beta,仅NoSchedule,1.13才默认开启NoExecute。DaemonSet控制器自1.8起自动添加NoSchedule容忍,避免DaemonSet中断。
Q&A
Kubernetes污点和容忍有哪些典型使用场景?
典型使用场景包括:为特定用户指定一组节点,通过给节点打污点并给Pod添加容忍来实现;对于有特殊硬件的节点(如GPU),给节点打污点,并利用ExtendedResourceToleration准入控制器自动为需要扩展资源的Pod添加容忍,确保只有需要特殊硬件的Pod被调度到这些节点上。
NoExecute污点的驱逐行为是怎样的?
NoExecute污点会影响已经在节点上运行的Pod:不能容忍该污点的Pod会被立即驱逐;容忍该污点但没有指定tolerationSeconds的Pod会一直留在节点上;指定了tolerationSeconds的Pod会在节点上停留指定的时间后被驱逐。
节点故障时Kubernetes会自动添加哪些污点?
节点故障时,节点控制器会自动添加内置污点,包括:node.kubernetes.io/not-ready(节点未就绪)、node.kubernetes.io/unreachable(节点控制器与节点失联)、node.kubernetes.io/out-of-disk(磁盘空间不足)、node.kubernetes.io/network-unavailable(网络不可用)、node.kubernetes.io/unschedulable(节点不可调度)以及node.cloudprovider.kubernetes.io/uninitialized(云提供商初始化前)。
Pod默认对节点故障的容忍时间是多少?如何自定义?
Kubernetes会自动为Pod添加对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable的容忍,tolerationSeconds默认为300秒,即节点故障后Pod默认在5分钟内不会被驱逐。用户可以通过在Pod中显式配置这两个污点的容忍来覆盖默认值,自定义容忍时间。
DaemonSet的Pod在节点故障时会被驱逐吗?
不会。DaemonSet的Pod会默认添加对node.kubernetes.io/unreachable和node.kubernetes.io/not-ready的NoExecute容忍,且不指定tolerationSeconds,因此这些Pod在节点发生故障时永远不会被驱逐。
condition驱动的污点是什么?它有什么作用?
condition驱动的污点是指节点生命周期控制器根据节点condition自动创建的污点。调度器不直接检查节点condition,而是检查污点,从而保证节点condition不会影响已调度到该节点的Pod。用户可以通过添加容忍来忽略节点的某些问题。在1.12版本中该特性为beta,仅打上effect=NoSchedule的污点;1.13版本中effect=NoExecute也作为beta默认开启。