十七、K8S-污点(Taint)和容忍度(toleration)

这篇具有很好参考价值的文章主要介绍了十七、K8S-污点(Taint)和容忍度(toleration)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是污点和容忍度

1、官方解释:

2、自我理解:

3、污点

1、污点的组成:

2、污点的三种策略:

        1、PreferNoSchedule

        2、NoExecute

         3、NoSchedule

 4、容忍

1、Toleration基本用法

2、用法:

3、注意:

二、使用演示

三、Pod优先级调度

1、调度策略:

        1、驱逐(Eviction)

        2、抢占(Preemtion)

2、创建权重

3、yaml文件定义

4、使用优先级


一、什么是污点和容忍度

1、官方解释:

  1. 节点亲和性,是pod的一种属性,它使pod被吸引到一类特定的节点
  2. Taint(污点)与节点亲和性相反,它使节点能够排斥一类特定的pod
  3. Taint(污点)和toleration(容忍福)互相配合,可以用来避免pod被分配到不合适的节点上
  4. 每个节点都可以应用一个或多个taint,这表示对于那些不能容忍这些taint的pod,是不会被运行在该节点上。
  5. 如果将toleration应用于pod上,则表示这些pod可以被调度到具有匹配taint的节点上。

2、自我理解:

  1. 污点和容忍度是相互匹配的关系,我们在node上定义一个污点,pod上定义容忍度
    1. 如果pod能容忍这个污点,就会被调度到拥有这个污点的节点上
    2. 如果pod不能容忍这个污点,就不会被调度到拥有这个污点的节点上
  2. 如果node节点上没有定义污点,那么任何pod都会调度到这个节点上
  3. 我们可以给node节点打一个污点,pod如果不能容忍这个节点上定义的污点,那就调度不到这个节点上。
  4. taint:污点
    1. 定义在节点上的,是键值对数据
  5. tolerations:容忍度
    1. 定义在pod上,可以定义能容忍哪些污点

3、污点

        如果一个节点被标记为有污点,那么意味着不允许pod调度到该节点,除非pod也被标记为可以容忍污点的节点。

1、污点的组成:
  1.  使用kubectl taint 命令可以给某个node节点设置污点,Node被设置上污点之后就和pod之间存在一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。
  2. 每个污点有个key和value作为污点的标签,其中value可以为空,effect是描述污点的作用
2、污点的三种策略:

        effect:用来定义节点污点对pod对象的排斥效果

        1、PreferNoSchedule

                表示尽量不调度到污点节点上去。

        2、NoExecute

                当pod能够容忍这个节点污点,会被调度到节点;当pod不能容忍节点污点,将会被驱逐。

        NoExecute对正在运行的pod的影响:

                1、没有设置 Toleration 的 Pod 会被立刻驱逐

                2、配置了对应 Toleration 的 pod,如果没有为 tolerationSeconds 赋值,则会一直留在这一节点中

                3、配置了对应 Toleration 的 pod 且指定了 tolerationSeconds 值,则会在指定时间后驱逐

         3、NoSchedule

                不允许调度,已经调度的不受影响

给node1添加污点
[root@k8s-master-1 Taint]#  kubectl taint node k8s-node-1 key1=value1:NoSchedule
node/k8s-node-1 tainted
查看是否添加成功
[root@k8s-master-1 Taint]# kubectl describe nodes k8s-node-1 | grep Taints
Taints:             key1=value1:NoSchedule
删除污点(和标签相同)
kubectl taint nodes node1 key1=value1:NoSchedule-

 4、容忍

        设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。 

1、Toleration基本用法

        一个toleration和一个taint相"匹配"是指它们有一样的key和effect

  1. operator的值为 Exists,这是无需指定value
  2. operator的值为Equal并且value相等
  3. 如果不指定operator,则默认为Equal。

另外还有如下两个特例:

  1. 空的 key 配合 Exists 操作符能够匹配所有的键和值
  2. 空的 effect 匹配所有的 effect
2、用法:
    tolerations:
      - key: key1
        value: value1
        operator: "Equal"
        effect: "NoSchedule"
- - 或者 - -
      tolerations:
      - key: key1

        operator: "Exists"
        effect: "NoSchedule" 
以上两个容忍,使用任意一个容忍的pod都能调度到node1上。
- - 或者- - 表示:如果一个toleration的effect为空,则key值与之相同的相匹配taint的effect可以是任意值
      tolerations:
      - key: key1

        operator: "Exists"
3、注意:
  • 可以给1个节点添加多个Taint
  • 可以给一个pod添加多个toleration

二、使用演示

yaml文件如下:在此基础上修改
apiVersion: apps/v1
kind: Deployment
metadata:
  name: taint-test
spec:
  selector:
    matchLabels:
      app: nginx
      env: prod
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
        env: prod
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx

1、node节点没有任何的污点,创建有两个副本的deploy,会指定到两个节点上

[root@k8s-master-1 Taint]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
taint-test-5579c4b477-2c2r6   1/1     Running   0          7s    10.244.0.13    k8s-node-1   <none>           <none>
taint-test-5579c4b477-v6rgx   1/1     Running   0          7s    10.244.1.242   k8s-node-2   <none>           <none>

删除deploy,然后给node1添加污点,在创建有容忍的deploy
      tolerations:
      - key: key1
        value: value1
        operator: "Equal"
        effect: "NoSchedule"

2、node1添加污点
[root@k8s-master-1 Taint]# kubectl taint nodes k8s-node-1 key1=value1:NoSchedule
node/k8s-node-1 tainted

[root@k8s-master-1 Taint]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
taint-test-5579c4b477-hklqg   1/1     Running   0          5s    10.244.1.243   k8s-node-2   <none>           <none>
taint-test-5579c4b477-xsdfd   1/1     Running   0          5s    10.244.0.14    k8s-node-1   <none>           <none>

可以看到也被调度到了两个节点上,因为node1上添加了污点,这个pod能容忍他的污点,node2上没有添加污点,所以也可以调度过去。

3、给node2 添加NoExecute 污点,此时node2上的pod就会被驱逐,因为创建了2个副本的deploy,为了保证副本数,会在node1 上新创建一个pod
[root@k8s-master-1 Taint]# kubectl taint nodes k8s-node-2 key1=value1:NoExecute
node/k8s-node-2 tainted

[root@k8s-master-1 Taint]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
taint-test-5579c4b477-2kqq8   1/1     Running   0          20s   10.244.0.15   k8s-node-1   <none>           <none>
taint-test-5579c4b477-xsdfd   1/1     Running   0          14m   10.244.0.14   k8s-node-1   <none>           <none>

4、给node1 添加NoExecute 污点和NoSchedule污点,并且设置tolerationSeconds值为30,让其在30秒之后被驱逐,,此时pod在30秒之后会被驱逐,被调度到node2上。
      tolerations:

      - key: key1
        value: value1
        operator: "Equal"
        effect: "NoExecute"
        tolerationSeconds: 30

[root@k8s-master-1 Taint]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
taint-test-58b64c6989-2qxpq   1/1     Running   0          5s    10.244.1.43   k8s-node-2   <none>           <none>
taint-test-58b64c6989-5hts2   1/1     Running   0          47s   10.244.1.42   k8s-node-2   <none>           <none>

三、Pod优先级调度

        当集群资源不足时又有新的Pod创建请求,那么这个Pod会一直处于Pending状态,就算是这个Pod非常的重要,非部署不可,那也没办法,你只能删除一些Pod释放一些资源才能被调度成功。

1、调度策略:

        1、驱逐(Eviction)

                Eviction 是kubelet进程的行为,当该Node上的资源不足时,kubelet就会执行驱逐动作,配合优先级,将优先级低的Pod驱逐,如果优先级都一样,那么实际使用的资源量超过申请量最大倍数的高耗能 Pod 会被首先驱逐。

        2、抢占(Preemtion)

        Preemption 是 Scheduler 执行调度的行为,当有新的Pod创建,但是因为资源不够无法正常调度,调度器便会驱逐部分优先级较低的Pod来满足新Pod的需求。

2、创建权重

        权重是区分优先级的关键因素。

3、yaml文件定义

1、查看优先级 kubectl get PriorityClass

[root@k8s-master-1 diaodu]# kubectl get pc
NAME                      VALUE        GLOBAL-DEFAULT   AGE
system-cluster-critical   2000000000   false            60d
system-node-critical      2000001000   false            60d

2、通过yaml方式定义一个PriorityClass

[root@k8s-master-1 diaodu]# vim PriorityClass.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass # PriorityClass不受命名空间约束
metadata:
  name: app-priority
value: 100 # 优先级为100,数字越大,优先级越高,没有设置优先级的Pod默认优先级为0
globalDefault: false #globalDefault 给没有设置优先级的Pod使用,整个系统只能设置一个globalDefault=true的PriorityClass
description: " app test priority." #description 描述什么时候应该使用该优先级

3、创建优先级
[root@k8s-master-1 diaodu]# kubectl apply -f PriorityClass.yaml 
priorityclass.scheduling.k8s.io/app-priority created

4、查看优先级
[root@k8s-master-1 diaodu]# kubectl get pc
NAME                      VALUE        GLOBAL-DEFAULT   AGE
app-priority              100          false            10s
system-cluster-critical   2000000000   false            60d
system-node-critical      2000001000   false            60d

4、使用优先级

        结合前面讲到的亲和性调度与污点来模拟效果。给node02设置上一个污点,使得Pod不能调度进来,给node01运行一个带有标签env=pro的Pod,再创建一个新的Pod使用了优先级app-priority,并且通过反亲和性设置不能调度到带有标签env=pro的Pod所在Node,那么新Pod将没有节点可调度,但是由于它的优先级高,那么会不会丢车保帅,将node01上的Pod驱逐呢?下面来验证一下。

1、创建一个标签是ds=true的Pod,指定调度到node1上

[root@k8s-master-1 diaodu]# vim pod-test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
    ds: "true"
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
  nodeName: k8s-node-1

[root@k8s-master-1 diaodu]# kubectl apply -f pod-test.yaml 
pod/pod-test created

[root@k8s-master-1 diaodu]# kubectl get pod -owide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          4s    10.244.0.85   k8s-node-1   <none>           <none>

2、给node02创建污点,模拟不可用
[root@k8s-master-1 diaodu]# kubectl taint node k8s-node-2 app=true:NoExecute
node/k8s-node-2 tainted

[root@k8s-master-1 diaodu]# kubectl describe node k8s-node-2 | grep Taints
Taints:             app=true:NoExecute

3、创建带有优先级的Pod
[root@k8s-master-1 diaodu]# vim priority-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: priority-pod
  labels:
    env: pro
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    imagePullPolicy: IfNotPresent # 本地有不拉取镜像
  affinity:
    podAntiAffinity: # 使用Pod反亲和性
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬限制
      - labelSelector:
          matchExpressions:
          - key: ds
            operator: In
            values:
            - "true"
        topologyKey: kubernetes.io/hostname
  priorityClassName: app-priority

# 启动priority-pod并且立刻查看Pod详情,pod-test正在被驱逐

[root@k8s-master-1 diaodu]# kubectl apply -f priority-pod.yaml && kubectl get pod -owide
pod/priority-pod created
NAME           READY   STATUS        RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod-test       1/1     Terminating   0          18s   10.244.0.89   k8s-node-1   <none>           <none>
priority-pod   0/1     Pending       0          0s    <none>        <none>       k8s-node-1       <none>

# 再次查看Pod详情,priority-pod运行成功,target-pod被驱逐
[root@k8s-master-1 diaodu]#kubectl get pod -owide

NAME           READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
priority-pod   1/1     Running   0          4s    10.244.0.90   k8s-node-1   <none>           <none>

解释:第一步创建了一个app-priority的优先级策略,然后,创建了一个设置有ds=true标签的Pod,并将其调度到node1上,在给node2打了一个NoExecute
模拟不可用,然后在创建一个反亲和性的Pod,指定不让他调度到和带有ds=true标签的Pod所在的节点上,此时,kube-scheduler,就会把它调度到node2上,
但是node2上添加了NoExecute污点,此Pod又不容忍,所以就调度失败,但是此pod优先级较高,故而就会把node1上优先级底的删除,用来创建优先级较高的Pod.

注意事项:

        优先级抢占的调度方式可能会导致调度陷入“死循环”状态。当Kubernetes集群配置了多个调度器(Scheduler)时,这一行为可能就会发生。

        高优先级Pod抢占节点并驱逐低优先级的Pod,这个问题对于普通的服务型的Pod来说问题不大,但对于执行批处理任务的Pod来说就可能是个灾难,当一个高 优先级的批处理任务的Pod创建后,正在执行批处理任务的某个低优先级的Pod可 能因为资源不足而被驱逐,从而导致对应的批处理任务被搁置。

        为了避免这个问题发生,PriorityClass增加了一个新的属性一preemptionPolicy,当它的值为 preemptionLowerPriorty(默认)时,就执行抢占功能,当它的值被设置为Never 时,就默认不抢占资源,而是静静地排队,等待自己的调度机会。

[root@k8s-master-1 diaodu]# kubectl get pc app-priority -oyaml
apiVersion: scheduling.k8s.io/v1
description: ' app test priority.'
kind: PriorityClass
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"scheduling.k8s.io/v1","description":" app test priority.","globalDefault":false,"kind":"PriorityClass","metadata":{"annotations":{},"name":"app-priority"},"value":100}
  creationTimestamp: "2023-06-19T03:02:55Z"
  generation: 1
  managedFields:
  - apiVersion: scheduling.k8s.io/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:description: {}
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:preemptionPolicy: {}
      f:value: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2023-06-19T03:02:55Z"
  name: app-priority
  resourceVersion: "1938189"
  selfLink: /apis/scheduling.k8s.io/v1/priorityclasses/app-priority
  uid: 2f925930-40c4-4bc1-a497-0d1748d14751
preemptionPolicy: PreemptLowerPriority
value: 100

 文章来源地址https://www.toymoban.com/news/detail-829700.html

到了这里,关于十七、K8S-污点(Taint)和容忍度(toleration)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)

    🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 五、健康探测 1、健康探测的概念 2、Pod启动探测(Startup Probe) 3、Pod存活探测(Liveness Probe) 4、Pod就绪探测(Readiness Probe) 5、Pod健康探测在故障转移与

    2024年04月08日
    浏览(50)
  • K8s(二)Pod资源——node调度策略、node亲和性、污点与容忍度

    目录 node调度策略nodeName和nodeSelector 指定nodeName 指定nodeSelector node亲和性 node节点亲和性 硬亲和性 软亲和性 污点与容忍度 本文主要介绍了在pod中,与node相关的调度策略,亲和性,污点与容忍度等的内容 在创建pod等资源时,可以通过调整字段进行node调度,指定资源调度到满足

    2024年01月17日
    浏览(47)
  • 学习笔记十八:污点、容忍度

    给了节点选则的主动权,我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属性数据,可以定决定拒绝那些pod; taints是键值数据,用在节点上,定义污点; tolerations是键值数据,用在pod上,定义容忍度,能容忍哪些污点 pod亲和性是pod属性;但

    2024年02月12日
    浏览(31)
  • 【云原生】POD污点和容忍度

    节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint) 则相反——它使节点能够排斥一类特定的 Pod。 容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度

    2024年02月16日
    浏览(31)
  • 【云原生 · Kubernetes】Taint和Toleration(污点和容忍)

    个人名片: 因为云计算成为了监控工程师👨🏻‍💻 个人博客🏆:念舒_C.ying CSDN主页✏️:念舒_C.ying 节点亲和性是 pod 的一种属性(优先选择或硬性要求),它使 pod 被优先分配到一类特定的节点上。而 Taint 则相反,它使 节点 能够 排斥 一类特定的 pod。 Taint(污点)和

    2023年04月08日
    浏览(36)
  • k8s 污点和容忍

    在 Kubernetes 中,节点亲和性 NodeAffinity 是 Pod 上定义的一种属性,能够使 Pod 按我们的要求调度到某个节点上,而 Taints(污点) 则恰恰相反,它是 Node 上的一个属性,可以让 Pod 不能调度到带污点的节点上,甚至会对带污点节点上已有的 Pod 进行驱逐。当然,对应的 Kubernetes 可以

    2023年04月08日
    浏览(31)
  • k8s概念-污点与容忍

    k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。 此时就需要用到污点(Taint)和容忍(Toleration),这些配

    2024年02月14日
    浏览(41)
  • K8s的亲和、反亲和、污点、容忍

    亲和性的原理其实很简单,主要利用label标签结合nodeSelector选择器来实现 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity。 从操作指令来讲,可以有ln、Notln、Exists、DoesN

    2024年04月27日
    浏览(35)
  • 【k8s】pod调度——亲和,反亲和,污点,容忍

    官方网址:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ pod.spec.nodeAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策略  p开头 ●requiredDuringSchedulingIgnoredDuringExecution:硬策略  r开头 pod.spec.affinity.podAffinity/podAntiAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策

    2024年02月05日
    浏览(42)
  • k8s打污点、取消污点、驱动pod

    在 Kubernetes 中,可以使用 kubectl taint 命令来打污点,它有以下语法: 其中, node-name 是节点的名称, key 和 value 是用于标识污点的键和值, effect 则指定了污点的影响。 例如,要在名为 node-1 的节点上打一个污点,使它不能被调度 NoSchedule ,可以使用以下命令: 这将在 node-

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包