k8s之taints污点使用方法及说明

taint:污点
tolerations:容忍度
 
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。
Taints(污点)是Node的一个属性,设置了Taints(污点)后,因为有了污点,所以Kubernetes是不会将Pod调度到这个Node上的,
于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。
 
Taints 和 tolerations 用于保证 Pod 不被调度到不合适的 Node 上,Taint应用于Node上,而toleration则应用于Pod上(Toleration是可选的)
 
K8S 污点使用方法示例
流程:
node打上污点(可以想象成一个标签),pod如果不定义容忍这个污点,那么pod就不会被调度器分配到这个node
操作命令:
1. node打上污点方法 的三种类型以及介绍
kubectl taint nodes node1 key=value:NoSchedule
kubectl taint nodes node1 key=value:NoExecute
kubectl taint nodes node1 key=value:PreferNoSchedule
目前支持的 taint 类型(也被称为effect):
NoSchedule:K8S的node添加这个effect类型污点,新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响
NoExecute:K8S的node添加这个effect类型污点,新的不能容忍的pod不能调度过来,老的pod也会被驱逐
PreferNoSchedule:尽量不要调度到该节点,但pod会尝试将pod分配到该节点

查看
kubectl describe node master
2. node删除污点
kubectl taint node node1 key1:NoSchedule- # 这里的key可以不用指定value kubectl taint node node1 key1:NoExecute- kubectl taint node node1 key1- # 删除指定key所有的effect kubectl taint node node1 key2:NoSchedule-
tolerations:  #containers同级
- key: "key1"          #能容忍的污点key
  operator: "Equal"    #Equal等于表示key=value , Exists不等于,表示当值不等于下面value正常
  value: "value1"      #值
  effect: "NoExecute"  #effect策略,见上面
  tolerationSeconds: 3600  #原始的pod多久驱逐,注意只有effect: "NoExecute"才能设置,不然报错
示例:
1. 给pod打一个污点
kubectl taint nodes node1 disktype=ssd:NoExecute
说明:给node1打上一个污点disktype值是ssd,并且原先分配的pod也驱逐
 
2. deployment添加容忍这个污点
---
apiVersion: apps/v1Beta1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 1
    selector:
      matchLabels:
        app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        images: nginx:laste
        ports:
        - containerPort: 80
    tolerations:
    - key: "disktype"
      operator: "Equal"
      value: "value1"
      effect: "NoExecute"
      tolerationSeconds: 3600
可以看到 如果pod打上这个污点,那么这个pod就会分配到这个node1,其他pod未打污点无法分配,并且old的pod也被驱赶出这个node
 
 
有时候在k8s-master节点上也安装了docker,但是又不想让master既作为主节点又做为node节点,避免让pod调度到master上,方法如下:
 
为Master节点打上污点,让pod尽可能的不要调度到Master节点上
kubectl taint node k8s-master node-role.kubernetes.io/master=k8s-master:NoSchedule
key为:node-role.kubernetes.io/master
value为:k8s-master
effect为:NoSchedule
 
如果输入命令时, 你丢掉了=符号, 写成了node-role.kubernetes.io/master:NoSchedule,会报error: at least one taint update is required错误
 
也可以直接在node的定义中修改annotations:
annotations:
  scheduler.alpha.kubernetes.io/taints: '[{"key":"xxx","operator":"Equal","value":"yyy","effect":"NoSchedule"}]'
operator可以定义为:
Equal 表示key是否等于value,默认
Exists 表示key是否存在,此时无需定义value
 
容忍master节点上的污点例子:
在 pod 的 spec 中设置 tolerations 字段

tolerations:
- key: "node-role.kubernetes.io/master"
  operator: "Equal"
  value: ""
  effect: "NoSchedule"
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
      role: logstore
  template:
    metadata:
      labels:
        app: redis
        role: logstore
    spec:
      containers:
      - name: redis
        image: redis:4.0-alpine
        ports:
        - name: redis
          containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  namespace: default
spec:
  selector:
    matchLabels:
      app: filebeat
      release: stable
  template:
    metadata:
      labels:
        app: filebeat
        release: stable
    spec:
########################################################
      # 容忍 taints 设置
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Equal"
        value: ""
        effect: "NoSchedule"
########################################################
      containers:
      - name: filebeat
        image: ikubernetes/filebeat:5.6.5-alpine
        env:
        - name: REDIS_HOST
          value: redis.default.svc.cluster.local
        - name: REDIS_LOG_LEVEL
          value: info
 

 

版权声明:
作者:allenjol
链接:https://www.ayunw.cn/archives/488
来源:爱生活,爱运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>