污点taints和容忍toleration
查看taints
root@node81[14:12:09]:/home/k8s_conf/saas# kubectl describe nodes node81
...
CreationTimestamp: Tue, 10 May 2022 17:31:08 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
分别对应
effect可以取值:
- PreferNoSchedule: 尽量不要调度。
- NoSchedule: 一定不能被调度。
- NoExecute: 不仅不会调度, 还会驱逐 Node 上已有的 Pod。
- 设置taints
kubectl taint node node81 node-role.kubernetes.io/master:PreferNoSchedule
删除taints
#root@node81[14:41:26]:/home/k8s_conf/saas# kubectl taint node node81 node-role.kubernetes.io/master:NoSchedule-
node/node81 untainted
#root@node81[14:41:33]:/home/k8s_conf/saas# kubectl describe nodes node81
...
CreationTimestamp: Tue, 10 May 2022 17:31:08 +0800
Taints: <none>
Unschedulable: false
...
容忍
一个 Node 可以有多个污点,一个 Pod 可以有多个容忍。
想要pod调度到有污点node,需要pod容忍包含该node所有污点(PreferNoShedule除外)
设置容忍tolerations
apiVersion: apps/vl
kind: Deployment
Metadata:
name: example
spec:
replicas: 3
template:
spec:
......
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
tolerationSeconds: 3600
tolerationSeconds用于设置多长时间以后再踢掉pod,单位秒
operator:可选值Equal 和 Exists
Exists: 匹配容忍在已有条件下的所有污点
key为空,则匹配所有key
tolerations:
- operator: "Exists"
key不为空,effect为空,则匹配该key的所有值
tolerations:
- key: "key"
operator: "Exists"
Equal
Node 和 Pod 的 key 为 key1、value1 与 effect 相同则能调度
#污点
key1=value1:NoSchedule
#Pod设置
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
Node 的污点的 key、value、effect 和 Pod 容忍都相同则能调度
# 设置污点
key1=value1:NoSchedule
key2=value2:NoExecute
# Pod设置容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key2"
operator: "Equal"
value: "value2"
effect: "NoExecute"
Node 的污点和 Pod 的大部分都相同,不同的是 Node 污点 effect 为 PreferNoSchedule 的,可能会调度
# 污点
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule
# Pod设置容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key2"
operator: "Equal"
value: "value2"
effect: "NoExecute"
Node 的污点和 Pod 的大部分都相同,不同的是 Node 污点 effect 为 NoSchedule 和 NoExecute 的,不会被调度
# 污点
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule
# Pod设置容忍
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key3"
operator: "Equal"
value: "value3"
effect: "PreferNoSchedule"
驱逐
污点的 effect
可以设置为 NoExecute时
- 立即将没有配置容忍的 Pod 逐出。
- 设置容忍但是没有指定 tolerationSeconds 参数的,那么该容忍永久生效。
- 设置容忍但是有指定 tolerationSeconds 参数的,那么在指定的时间内容忍有效,超过指定时间后将被剔除。
当某些条件为 true 时,节点控制器会自动污染节点。内置以下污点:
- node.kubernetes.io/not-ready: 节点尚未准备好。这对应于 NodeCondition Ready 为 false。
- node.kubernetes.io/unreachable: 无法从节点控制器访问节点。这对应于 NodeCondition 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: 当 kubelet 从 "外部" 云提供程序开始时,此污点在节点上设置为将其标记为不可用。来自 cloud-controller-manager 的控制器初始化此节点后,kubelet 删除此污点。
节点失效 pod转移等待时间
当某个 Pod
运行所在的 Node
变成 unready
或者 unreachable
不可用状态时,Kubernetes
可以等待该 Pod
被调度到其他节点的最长等待时间
tolerations:
- effect: NoExecutekey: node.alpha.kubernetes.io/notReady
operator: Exists
tolerationSeconds: 300
- effect: NoExecutekey: node.alpha.kubernetes.io/unreachable
key: operator: Exists
tolerationSeconds: 300
这两个容忍度表示,该 Pod
将容忍所在节点处于 notReady
或者 unreachable
状态维持 300
秒。 当 Kubernetes
控制器检测到有节点处 notReady
或者 unreachable
状态时, 将会等待 300
秒,如果超过指定时间的话 Kubernetes
将会把该 Pod
重新调度到其他节点上。
参考:http://www.mydlq.club/article/69/#
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。