前言
我们都知道, kubernetes的daemonset控制器,可以将副本每个运行在集群中的所有节点中,并且 daemonset 控制器 默认会对Pod添加污点容忍度
| 容忍度健名 | 效果 | 版本 | 描述 |
|---|---|---|---|
node.kubernetes.io/not-ready |
NoExecute | 1.13+ | 当出现类似网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。 |
node.kubernetes.io/unreachable |
NoExecute | 1.13+ | 当出现类似于网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。 |
node.kubernetes.io/disk-pressure |
NoSchedule | 1.8+ | |
node.kubernetes.io/memory-pressure |
NoSchedule | 1.8+ | |
node.kubernetes.io/unschedulable |
NoSchedule | 1.12+ | DaemonSet Pod 能够容忍默认调度器所设置的 unschedulable 属性. |
node.kubernetes.io/network-unavailable |
NoSchedule | 1.12+ | DaemonSet 在使用宿主网络时,能够容忍默认调度器所设置的 network-unavailable 属性 |
这些容忍度可以保证Pod可以允许在集群中的每个节点.
但是, 如果是我们用户自定义的Taint呢?
将Pod容忍所有的Taint
我们这时候就会发现一个有意思的事情, 如果我们将集群中的某个节点打上Taint, 就会发现我们自己设置的daemonset副本全部被驱逐,并且无法被调度回来. 而kube-system下的daemonset 如:kube-proxy就不会出现这种问题.
我们也可以在用户自己的daemonset当中设置容忍, 解决这个问题,但是kube-proxy到底是怎么做的呢?
通过观察,kube-proxy的配置,我们发现了关键
kube-proxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19- operator: Exists
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/disk-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/memory-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/pid-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
operator: Exists用户自己的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/disk-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/memory-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/pid-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
operator: Exists
可以发现,对比下来,我们发现kube-proxy多了一个operator,查询文档以后,发现原来[1]:
- 如果key留空,只保留operator的值为
Exists,则匹配所有的keys,values,effects. - 如果
effect留空,则会匹配对应key的所有effects.