此外,kubernetes 1.6引入了对节点问题的展示.也就是说当满足了特定条件,节点控制器会自动为符合条件的节点添加taint
,以下是一些内置的taint
node.kubernetes.io/not-ready,节点还没有准备好,对应节点状态Ready
值为false
node.kubernetes.io/unreachable,节点控制器无法触及节点,对应节点状态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
在kubernetes 1.13版本,基于污点的驱离策略提升到beta级别并且默认开启,因此污点被node控制器(kubelete)自动添加,并且普通的以节点的Ready
状态为基础的驱离策略被禁用.
这项beta功能,加上tolerationSeconds
,允许节点来指定仍然可以留存长时间即便节目有一种或者多种匹配的问题
例如:一个包含多种本地状态的应用在节点发生网络分裂情况时希望仍然可以留存一点时间,期望在指定的时段内网络能恢复正常以避免被驱离.这种情况下容忍此节点的pod编排如下
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
请注意,如果用户没有在pod的配置中指定node.kubernetes.io/not-ready
,则kubernetes会自动为pod配置加上node.kubernetes.io/not-ready tolerationSeconds=300
属性.同样地,如果没有配置,则自动添加node.kubernetes.io/unreachable tolerationSeconds=300
DaemonSet
类型的pod创建时自动为以下两种类型的taint添加NoExecute
效果类型并且没有tolerationSeconds
node.kubernetes.io/unreachable
node.kubernetes.io/not-ready
这确保即便节点出现问题,DaemonSet
也不会被驱离.
在kubernetes 1.12版,有条件为节点添加taint(TaintNodesByCondition)特征被提升为beta级别,节点生命周期控制器会自动根据节点的状态为节点添加taint.同样地调度器不检测node的状态,而是检测node 的污点(taint).这确保node的状态不影响哪些pod可以调度到此node上,用户可以选择通过添加相应的容忍(toleration)来忽略node的指定的问题(通过node的状态体现).注意TaintNodesByCondition
仅添加NoSchedule
类型的污点.NoExecute
效果类型由TaintBasedEviction
控制(此功能为1.13版本的beta功能)
从kubernetes 1.8开始,DaemonSet controller
自动以下类型的为所有的daemon
添加NoSchedule
效果类型的容忍(toleration),来防止DeamonSet分裂
node.kubernetes.io/memory-pressure
node.kubernetes.io/disk-pressure
node.kubernetes.io/out-of-disk (only for critical pods)
node.kubernetes.io/unschedulable (1.10 or later)
node.kubernetes.io/network-unavailable (host network only)
添加了这些类型的容忍是为了向后兼容,你可以为DaemonSet添加任意类型的容忍