前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Kubernetes(k8s)-污点(Taints)和容忍(Tolerations)

Kubernetes(k8s)-污点(Taints)和容忍(Tolerations)

作者头像
运维小路
发布2025-02-08 14:23:12
发布2025-02-08 14:23:12
14200
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

上一小节的标签(lable)属于Pod选Node,并且需要Pod主动增加NodeSelectors配置,如果不增加这个标签对于Pod筛选Node实际上是没有作用的。有没有一种是Node主动来选择Pod呢,类似于Node节点预设了密码,Pod在默认情况下没有密码就无法调度到这个节点,除非它拿到密码的才可能能调度到这个节点上面。Kubenetes给我们提供了一个资源:污点(Taint),就可用满足这个要求。

在 Kubernetes 中,污点(Taints)是一种将节点标记为不适宜运行某些 Pod 的机制。污点可以用来确保 Pod 不会被调度到不合适的节点上。与节点亲和性(Node Affinity)相反,污点是一种排斥机制。

污点的组成

污点由以下三个部分组成:

  1. 键(Key)表示污点的唯一标识符。
  2. 值(Value)与键相关联的值,通常用来表示污点的具体信息。
  3. 效果(Effect)表示污点的作用,有以下几个可选值:
    • NoSchedule:Kubernetes 不会将 新Pod 调度到具有该污点的节点上,历史存在pod不受影响(一般使用这个最多)
    • PreferNoSchedule:Kubernetes 会尽量避免将 Pod 调度到具有该污点的节点上,但不是强制的,也就是就算没有配置容忍(Tolerations)也有可能调度
    • NoExecute:如果 Pod 已经在具有该污点的节点上运行,它将被驱逐(后面会单独讲驱逐和隔离);同时,Kubernetes 不会将新的 Pod 调度到该节点上,历史存在Pod会受到影响。

查看污点

代码语言:javascript
代码运行次数:0
复制
# 查看所有节点污点
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

Master节点默认自带污点,这个污点的目的是避免业务Pod调度到Master节点,这样预设的目的可以把管控节点和业务节点进行区分,Master节点只承担管理功能,不承担业务功能。这样我们可用在部署集群的时候选择合适的配置避免资源浪费,对于超大集群这个功能可以更好的管理集群于提高服务性能。

添加污点

代码语言:javascript
代码运行次数:0
复制
#没有vlues的污点
kubectl taint nodes node01 node-role.kubernetes.io/master=:NoSchedule

#有vlaue的污点
kubectl taint nodes node02 node-role.kubernetes.io/master=true:NoSchedule

去除污点

代码语言:javascript
代码运行次数:0
复制
#实际上就是后面加个"-"就是移除污点
kubectl taint nodes node01 node-role.kubernetes.io/master=:NoSchedule-
kubectl taint nodes node02 node-role.kubernetes.io/master=true:NoSchedule-

容忍污点

如果所有节点都有污点,那么创建一个新的Pod,则会因为污点原因导致无法调度成功,如果这个时候需要调度成功,则需要在Pod配置里面添加容忍(Tolerations)的配置,才可以调度成功。

所有节点都有污点

总共3个节点可用,3个节点都有污点,导致无法调度。

代码语言:javascript
代码运行次数:0
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      tolerations:  # 添加污点容忍
      - key: "key1"  # 污点的键
        operator: "Equal"  # 操作符
        value: "value1"  # 污点的值
        effect: "NoSchedule"  # 污点效果
        tolerationSeconds: 3600  # 可选,容忍时间
      - key: "key2"
        operator: "Exists"
        effect: "NoExecute"
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

1.tolerations: 这是一个数组,表示 Pod 可以容忍的污点列表。Pod 可以容忍一个或多个污点。

2.key: 这是污点的键,与节点上设置的污点键相对应。如果 Pod 愿意容忍具有该键的任何污点,则可以省略该字段,或者将其设置为空字符串。

代码语言:javascript
代码运行次数:0
复制
tolerations:
- operator: "Exists"  # 忽略所有污点的键和值

3.operator: 这是用于比较污点键和值的操作符。它可以是 “Equal” 或 “Exists”:

  • “Equal” 表示污点的键和值必须与 Pod 的容忍定义相匹配。
  • “Exists” 表示只要污点的键存在,Pod 就会容忍它,不管其值是什么。

4.value: 这是污点的值。只有当操作符为 “Equal” 时,这个字段才是必需的。如果操作符是 “Exists”,则不应该设置此字段。

5.effect: 这是污点的影响,如 “NoSchedule”、“PreferNoSchedule” 或 “NoExecute”。它指定了污点对 Pod 调度的影响:

  • “NoSchedule” 表示如果 Pod 没有匹配的容忍,则不会被调度到具有该污点的节点上。
  • “PreferNoSchedule” 是一种较弱的 “NoSchedule”,表示调度器会尝试不将 Pod 调度到具有该污点的节点上,但如果没有其他选项,它仍然可以这样做。
  • “NoExecute” 表示如果 Pod 已经在具有该污点的节点上运行,它将被驱逐;如果 Pod 尚未运行,它不会被调度到该节点上。

5.tolerationSeconds: 这是一个可选字段,仅当污点效果为 “NoExecute” 时才有效。它指定了 Pod 在被节点驱逐之前可以在具有相应污点的节点上容忍的时间。在这个例子中,如果节点在 Pod 被调度之后添加了具有 “key1” 和 “value1” 的 “NoExecute” 污点,Pod 将被允许在该节点上运行 3600 秒(1 小时),之后将被驱逐。

注:Pod有这个污点容忍只代表了它可以忽略掉节点上的污点,而不代表它只能调度到有污点的节点。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 污点的组成
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档