5分钟搞懂K8S的污点和容忍度(理论+实战)

本文主要快速讲解Kubernetes的污点和容忍度,一句话总结:如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。

在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。污点和容忍度就像谈恋爱的小情侣,你情我愿,女生知道男生的缺点,却依然选择容忍,这样他们可以生活在一起。如果女生容忍不了男生的缺点,那就没法生活在一起。

1、理论

1.1、污点和容忍度的概念

1.2、排斥等级

Node对Pod对象的排斥等级有3种:

1.3、容忍度操作符

在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。

1.4、用法

污点定义在节点的nodeSpec中,容忍度定义在Pod的podSpec中。

污点和容忍度都是键值对的数据格式,但是要增加一个排斥等级(effect)标记。

语法格式为:"key=value:effect"。

1.5、使用场景

1、独占节点

2、驱逐Pod

上文中定义了Node对Pod的排斥等级有3种。Node如果定义的排斥等级是NoExecute,那么没有配置该污点容忍度的Pod会被驱逐。

K8S 也会使用污点自动标识有问题的节点,比如节点在内存不足的情况下,节点控制器会自动为该节点打上污点信息,并且使用 NoExecute作为排斥等级,此时没有设置此类污点容忍度的Pod 会被驱逐。

DaemonSet控制器会无视此类污点,以便能在节点上部署重要的Pod。

目前,内置的污点也比较多,比如以下几个:

2、实战

2.1、管理节点污点

给节点添加污点:

 kubectl taint nodes node01 key=value:effect

给节点删除污点,此处的effect可以没有

 kubectl taint nodes node01 key[:effect]-

2.2、管理Pod的容忍度

上文中提到了,容忍度的操作符有2种:Equal和Exists,同时把排斥等级也要加上。

使用Equal的场景:

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoExecute"

使用Exists的场景:

tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoExecute"

如果Node上污点的排斥等级是NoExecute时,该Node上正在运行的Pod如果没有该污点的容忍度,就会被立刻驱逐。不过系统增加了tolerationSeconds字段,用来延迟驱逐Pod。

tolerationSeconds字段的意思是:如果 Pod 的容忍度配置里存在排斥等级为 NoExecute ,并且指定了属性 tolerationSeconds 的值,那么Pod 还能继续在该节点上运行的时间(单位为秒):

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoExecute"
  tolerationSeconds: 3600

2.3、具体操作

2.3.1、前置小知识

kubectl get nodes --show-labels
kubectl label node k8s-worker-2 special-app=specialwebapp

查看某节点的污点情况,可以看到Taints这一栏是none,也可以看到label情况。

kubectl describe node k8s-worker-2

2.3.2、实战示例过程

步骤

  1. 给定某个K8S节点,比如k8s-worker-2,节点的有一个label,Pod根据label选择调度到k8s-worker-2,此时调度成功。
  2. 给k8s-worker-2增加污点,此时Pod调度失败。
  3. 给Pod配置此污点的容忍度,调度成功。
  4. 删除节点的污点,删除容忍度,部署成功。

操作过程

 kubectl taint nodes k8s-worker-2 question-node=broken-disk:NoSchedule

kubectl taint nodes k8s-worker-2 question-node-

完整的yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  namespace: demo
  labels:
    app: webapp
spec:
  nodeSelector:
    # 选择调度到具有这个label的节点
    "special-app": "specialwebapp"
#    kubernetes.io/hostname: k8s-worker-2
  tolerations:
    - key: "question-node"
      operator: "Equal"
      value: "broken-disk"
      effect: "NoSchedule"
  containers:
    - name: webapp
      image: nginx
      ports:
        - containerPort: 80

总结

在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:5分钟搞懂K8S的污点和容忍度(理论+实战) - 不焦躁的程序员

展开阅读全文

页面更新:2024-03-13

标签:容忍度   污点   实战   节点   字段   场景   定义   等级   理论   情况   操作

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top