Taints(污点)

一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度 pod。

1
2
3
4
5
6
7
8
kubectl describe node k8s-1
Name:               k8s-1
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
.....

Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false

使用上面的命令查看 master 节点的信息,其中有一条关于 Taints 的信息:node-role.kubernetes.io/master:NoSchedule,就表示给 master 节点打了一个污点的标记,其中影响的参数是NoSchedule,表示 pod 不会被调度到标记为 taints 的节点,除了 NoSchedule 外,还有二个选项:

  • PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去
  • NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 pod 没有对应 Tolerate 设置,会直接被逐出
为node设置taint
1
2
3
4
5
6
7
8
9
kubectl taint nodes k8s-2 test=nodes02:NoSchedule
node/k8s-2 tainted

kubectl describe nodes k8s-2
Name:               k8s-2
Roles:              <none>
.....
Taints:             test=nodes02:NoSchedule
Unschedulable:      false

将 k8s-2 节点标记为了污点,影响策略是 NoSchedule,只会影响新的 pod 调度,如果仍然希望某个 pod 调度到 taint 节点上,则必须在 Spec 中做出Toleration定义,才能调度到该节点。案列:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: taint
  labels:
    app: taint
spec:
  replicas: 3
  revisionHistoryLimit: 10
  template:
    metadata:
      labels:
        app: taint
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
      tolerations:   # 添加容忍声明,使pod 可以调度到master节点上
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

# 创建
kubectl create -f taint-deploy.yaml

kubectl get po -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
taint-568dd68db9-2q4dl       1/1     Running   0          76s   10.244.13.70     k8s-3   <none>           <none>
taint-568dd68db9-6pdm8       1/1     Running   0          76s   10.244.200.219   k8s-1   <none>           <none>
taint-568dd68db9-8ks86       1/1     Running   0          76s   10.244.13.68     k8s-3   <none>           <none>

可以看到有一个pod调度到 k8s-1 这个master节点之上了,而K8S-2 添加污点没有添加容忍,就没法使pod调度上去。

  • 如果 operator 的值是 Exists,则 value 属性可省略
  • 如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 equal(等于)
  • 如果不指定 operator 属性,则默认值为 Equal
  • 空的 key 如果再配合 Exists 就能匹配所有的 key 与 value,也是是能容忍所有 node 的所有 Taints
  • 空的 effect 匹配所有的 effect
删除 taint
1
2
kubectl taint nodes k8s-2 test:NoSchedule-
node/k8s-2 untainted