污点一般用在节点上。匹配到的条目越多得分越低。

查看节点的spec:node节点同样有spec字段,使用如下命令可以看到。

kubectl get nodes master -o yaml | grep -i taints -C 5

yaml:

spec:
  podCIDR: 10.244.0.0/24
  taints:
  - effect: NoSchedule # 表示Pod不调度到此节点上,除非打上容忍污点的标签
    key: node-role.kubernetes.io/master

查看文档使用 kubectl explain nodes.spec.taints ,而运行在master节点上的Pod 都打上了容忍污点的标签。


taints.effect 各个值对Pod的调度效果:

        NoSchedule:仅影响调度过程,对现存Pod对象不产生影响。在打这个标签之前的Pod不受影响,打上了这个标签之后不容忍这个污点的Pod就不会被调度上来。

        NoExecute:既影响调度过程,也影响现存的Pod,不容忍的将被驱逐。在打上这个标签之前的Pod也会受到这个标签的影响,不接受这个污点将重新调度。

        PreferNoSchedule:如果实在没节点可以调度的话也可以运行在这个节点上。


管理节点的污点:

在node1上打标签:这样Pod就不会被调度到node1节点上了。

kubectl taint node node1 node-type=production:NoSchedule

如果在node2上打上NoExecute 则原有的Pod会被驱逐。

kubectl taint node node2 node-type=dev:NoExecute

去除节点上的污点:

kubectl taint node node1 node-type-


容忍污点:

如果在Pod上打上容忍度容忍污点这样就可以运行在有污点的节点上了。

容忍某个具体的污点:当污点 node-type 的 value 等于production 、effect 等于NoSchedule 时这个污点将被容忍。

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-dm
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: busybox
        ports:
        - name: http
          containerPort: 80
        command: ["sleep","3600"]
      tolerations:   # 容忍度标签
      - key: "node-type"  # 标签名称
        operator: "Equal"   # 匹配方式 Exists and Equal Exists存在即可,Equal存在且effect值要相等
        value: "production"  #标签值
        effect: "NoSchedule"  # 效果
        #tolerationSeconds: 20  # 容忍的时间,在这个时间内迁移出Pod,只有值为NoExecute时使用

容忍node-type的NoSchedule污点:不管value的值是什么

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-dm
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: busybox
        ports:
        - name: http
          containerPort: 80
        command: ["sleep","3600"]
      tolerations: 
      - key: "node-type"
        operator: "Exists"
        value: ""  # 当operator为Exists 时这个值自动变为匹配所有
        effect: "NoSchedule"

容忍node-type的污点:只要是node-type的污点都将被容忍,不管value和effect是什么。

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-dm
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: busybox
        ports:
        - name: http
          containerPort: 80
        command: ["sleep","3600"]
      tolerations: 
      - key: "node-type"
        operator: "Exists"
        value: ""
        effect: ""