基于污点的驱逐

当某种条件为真时,节点控制器会自动给节点添加一个污点。当前内置的污点包括:

  • 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 将删除这个污点。

可以为 Pod 设置 tolerationSeconds,以指定当节点失效或者不响应时, Pod 维系与该节点间绑定关系的时长。

比如,你可能希望在出现网络分裂事件时,对于一个与节点本地状态有着深度绑定的应用而言, 仍然停留在当前节点上运行一段较长的时间,以等待网络恢复以避免被驱逐。 你为这种 Pod 所设置的容忍度看起来可能是这样:

tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000

注意:

Kubernetes 会自动给 Pod 添加针对 node.kubernetes.io/not-ready 和 node.kubernetes.io/unreachable 的容忍度,且配置 tolerationSeconds=300, 除非用户自身或者某控制器显式设置此容忍度。

这些自动添加的容忍度意味着 Pod 可以在检测到对应的问题之一时,在 5 分钟内保持绑定在该节点上。

DaemonSet 中的 Pod 被创建时, 针对以下污点自动添加的 NoExecute 的容忍(Toleration)将不会指定 tolerationSeconds

  • node.kubernetes.io/unreachable

  • node.kubernetes.io/not-ready

这保证了出现上述问题时 DaemonSet 中的 Pod 永远不会被驱逐

最后更新于