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

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

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

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

1、理论

1.1、污点和容忍度的概念

  • 污点(Taints):定义在节点上,用于拒绝Pod调度到此节点,除非该Pod具有该节点上的污点容忍度。被标记有Taints的节点并不是故障节点。
  • 容忍度(Tolerations):定义在Pod上,用于配置Pod可容忍的节点污点,K8S调度器只能将Pod调度到该Pod能够容忍的污点的节点上。
  • 调度示例图:

1.2、排斥等级

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

  • NoSchedule:没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响。
  • PreferNoSchedule:没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点。
  • NoExecute:没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐。

1.3、容忍度操作符

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

  • Equal:容忍度与污点必须在key、value和effect三者完全匹配。
  • Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。

1.4、用法

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

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

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

1.5、使用场景

1、独占节点

  • 如果想拿出部分节点给特定的Pod使用,可以通过给节点添加污点,然后特定的Pod加入对应的容忍度。
  • 在集群中有些机器设备可能比较特殊,比如CPU性能很好、内存很大等等,不希望普通Pod占用这部分特殊节点,可以通过污点和容忍度来解决。

2、驱逐Pod

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

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

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

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

  • node.kubernetes.io/not-ready:节点未就绪
  • node.kubernetes.io/unreachable:节点不可触达
  • node.kubernetes.io/memory-pressure:节点内存空间已满。
  • node.kubernetes.io/disk-pressure:节点磁盘空间已满。
  • node.kubernetes.io/network-unavailable:节点网络不可用。

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、前置小知识

  • 查看看节点label,label是key-value的数据格式
kubectl get nodes --show-labels
  • 增加节点label,比如设置一个key是special-app,value是specialwebapp的label
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

  • 部署Pod,可以看到没有配置容忍度的Pod一直处于Pending状态,查看Pod的描述,也给出了原因:调度失败,node有污点,Pod没有容忍度。

  • 给Pod配置容忍度,部署成功

  • 删除污点,删除容忍度,部署成功
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就可以调度到该节点。如果不能容忍,那就无法调度到该节点。

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

原文链接:http://www.mangod.top/articles/2023/09/20/1695183781351.htmlhttps://mp.weixin.qq.com/s/td6gTN49gq08UYzWJgxvWg

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
229 0
|
6天前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
79 0
|
1天前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
116 3
|
6天前
|
存储 Kubernetes 监控
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
113 0
|
5天前
|
Kubernetes 应用服务中间件 调度
k8s-高级调度-污点容忍、亲和性调度
k8s-高级调度-污点容忍、亲和性调度
|
6天前
|
运维 Kubernetes Linux
Kubernetes详解(九)——资源配置清单创建Pod实战
Kubernetes详解(九)——资源配置清单创建Pod实战
21 2
|
6天前
|
存储 Kubernetes 调度
K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)
本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。
|
6天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes 核心实战之三(精华篇 3/3)
Kubernetes 核心实战之三(精华篇 3/3)
38 0
|
6天前
|
Kubernetes 数据可视化 应用服务中间件
Kubernetes 核心实战之二(精华篇 2/3)
Kubernetes 核心实战之二(精华篇 2/3)
31 0
|
6天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes 核心实战之一(精华篇 1/3)
Kubernetes 核心实战之一(精华篇 1/3)
35 0