kubernetes-污点和容忍

kubernetes-污点和容忍

1、什么是污点(Taint)

污点(Taint)是一种用于节点调度的机制。污点可以被认为是节点上的一种属性,它表示节点具有一些特定的限制或条件。当节点设置了污点后,只有具有对应的容忍(Toleration)标记的Pod才能被调度到该节点上。

在node节点上打污点,调度器在调度的时候,会选择没有污点的节点去启动pod。

2、什么是容忍度(Toleration)

pod有污点的节点服务器,任然可以调度到这个节点上去运行

调度器在调度的过程中会查看节点服务器是否有污点,然后看pod的策略里是否能容忍这个污点,如果能容忍就调度到这个节点服务器上,如果不能容忍就不调度过去。

本质上可以达到想让哪些pod调度到哪些节点上

3、为什么master节点上不跑业务pod

因为master有污点!!!

默认业务pod都不调度到master

4、这种打污点让我想到了通过nodename可以指定node节点

[root@master taint_toleration]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
    env: dev
spec:
  nodeName: node-1
  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
[root@master taint_toleration]# 
[root@master taint_toleration]# kubectl apply -f pod.yaml 
pod/demo-pod created
[root@master taint_toleration]# kubectl get -f pod.yaml -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
demo-pod   1/1     Running   0          9s    10.244.84.185   node-1   <none>           <none>
[root@master taint_toleration]# 

很明显在node-1上

5、怎么打污点

5.1、基本用法

可以使用命令 kubectl taint给节点增加一个污点

kubectl taint nodes node1 key1=value1:NoSchedule

给节点 node1 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能够被分配到 node1 这个节点。

若要移除上述命令所添加的污点,你可以执行:

kubectl taint nodes node1 key1=value1:NoSchedule-

5.2、查了一下chat

在 Kubernetes 中,你可以使用污点(Taints)和容忍(Tolerations)来影响 Pod 的调度。

设置节点上的污点:

要设置节点上的污点,你需要编辑节点的描述并添加 taints。以下是一个示例:

apiVersion: v1
kind: Node
metadata:
  name: xianchaonode1
spec:
  taints:
  - key: example-key
    value: example-value
    effect: NoSchedule
  • key: 污点的键,用于标识污点。
  • value: 污点的值,可选。
  • effect: 污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute。在这个例子中,NoSchedule 表示新的 Pod 不会被调度到具有这个污点的节点上。

设置 Pod 的容忍:

要设置 Pod 的容忍,你需要在 Pod 的描述中添加 tolerations。以下是一个示例:

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  tolerations:
  - key: example-key
    operator: Equal
    value: example-value
    effect: NoSchedule
  • key: 容忍的键,应该与节点上的污点的键匹配。
  • operator: 操作符,通常为 Equal
  • value: 容忍的值,应该与节点上的污点的值匹配。
  • effect: 容忍的效果,通常为 NoSchedule

这样,Pod 就能够容忍节点上的具有匹配污点的条件,从而可以被调度到这样的节点上。

请注意,这只是一个简单的示例,实际上可以根据需要进行更复杂的设置,包括容忍多个污点和在容忍中使用 Exists 操作符等。

5.3、effect污点效果的三种状态

  1. NoSchedule
    • 这是最常见的效果。当节点上有这个效果的污点时,新的 Pod 将不会被调度到该节点上。
    • 已经在节点上运行的 Pod 不受影响,它们将继续在节点上运行。
  2. PreferNoSchedule
    • 这个效果表示 Kubernetes 将尽量避免在具有该污点的节点上调度 Pod,但不是强制性的。如果没有其他可用的节点,Pod 仍然可以被调度到带有 PreferNoSchedule 污点的节点上。
    • 已经在节点上运行的 Pod 不受影响,它们将继续在节点上运行。
  3. NoExecute
    • 这是一个更强制的效果。除了阻止新的 Pod 被调度到带有这个污点的节点上之外,它还会影响已经在节点上运行的 Pod。
    • 对于已经在节点上运行的 Pod,如果它们不满足容忍(Tolerations),它们将被驱逐(eviction)出节点。这是一个更强制的效果,用于确保节点上的 Pod 在添加了 NoExecute 污点后被逐出。

5.4、打标签的时候定义的key和value有什么用呢

在Kubernetes中,打标签是为了给资源对象(例如Pod、Node、Service等)附加自定义的元数据。标签由键值对组成,键和值可以是任意字符串。

标签的作用是用于对资源进行分类、筛选和识别。通过为资源对象添加标签,你可以根据标签来选择性地操作或管理这些资源。

  • 标识是什么类型的污点
  • 方便调度的时候,pod能识别出来,容忍这个污点

6、查看有没有打污点

[root@master taint_toleration]# kubectl describe node master|grep -i taint
Taints:             node-role.kubernetes.io/master:NoSchedule
[root@master taint_toleration]# 

7、打污点实验

7.1、实验1

尝试给自己的node-1打污点

kubectl taint nodes node-1 cf=tencent:NoSchedule
[root@master taint_toleration]# kubectl taint nodes node-1 cf=tencent:NoSchedule
node/node-1 tainted
[root@master taint_toleration]# kubectl describe node node-1|grep -i taint
Taints:             cf=tencent:NoSchedule
[root@master taint_toleration]# 

创建pod看是否能调度到node-1上

[root@master taint_toleration]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80
[root@master taint_toleration]# 

实践一下: 发现都在node2上

[root@master taint_toleration]# kubectl get pod -o wide
NAME                                   READY   STATUS              RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-559d658b74-9zr2c      1/1     Running             0          65s   10.244.247.2    node-2   <none>           <none>
nginx-deployment-559d658b74-dgfpn      0/1     ContainerCreating   0          65s   <none>          node-2   <none>           <none>
nginx-deployment-559d658b74-l4whp      1/1     Running             0          65s   10.244.247.1    node-2   <none>           <none>
nginx-deployment-559d658b74-wnjxj      1/1     Running             0          65s   10.244.247.7    node-2   <none>           <none>
nginx-deployment-559d658b74-wspwq      0/1     ContainerCreating   0          65s   <none>          node-2   <none>           <none>
nginx-deployment-559d658b74-xrtr5      1/1     Running             0          65s   10.244.247.10   node-2   <none>           <none>
sc-nginx-deployment-66b6c48dd5-cxkzn   1/1     Running             1          8h    10.244.84.183   node-1   <none>           <none>
sc-nginx-deployment-66b6c48dd5-qmmn6   1/1     Running             1          8h    10.244.84.184   node-1   <none>           <none>
[root@master taint_toleration]# 

如果这个时候给node-2上也打个污点,状态用:NoExecute,那所有的pod都不能用了,状态变为:Pending

kubectl taint nodes node-2 cf=tencent:NoExecute
[root@master taint_toleration]# kubectl taint nodes node-2 cf=tencent:NoExecute
node/node-2 tainted
[root@master taint_toleration]# kubectl get pod -o wide
NAME                                   READY   STATUS        RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-559d658b74-4mbvp      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-9zr2c      0/1     Terminating   0          10m   10.244.247.2    node-2   <none>           <none>
nginx-deployment-559d658b74-c6kzv      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-dgfpn      0/1     Terminating   0          10m   10.244.247.9    node-2   <none>           <none>
nginx-deployment-559d658b74-hqn4s      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-l4whp      0/1     Terminating   0          10m   10.244.247.1    node-2   <none>           <none>
nginx-deployment-559d658b74-lqzz5      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-tz5ks      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-vz7bj      0/1     Pending       0          2s    <none>          <none>   <none>           <none>
nginx-deployment-559d658b74-wnjxj      0/1     Terminating   0          10m   10.244.247.7    node-2   <none>           <none>
nginx-deployment-559d658b74-wspwq      0/1     Terminating   0          10m   10.244.247.12   node-2   <none>           <none>
nginx-deployment-559d658b74-xrtr5      1/1     Terminating   0          10m   10.244.247.10   node-2   <none>           <none>
sc-nginx-deployment-66b6c48dd5-cxkzn   1/1     Running       1          8h    10.244.84.183   node-1   <none>           <none>
sc-nginx-deployment-66b6c48dd5-qmmn6   1/1     Running       1          8h    10.244.84.184   node-1   <none>           <none>
[root@master taint_toleration]# 

这个时候加个容忍度限制 ,修改yaml文件----》定义pod的容忍度能接受定义的污点

[root@master taint_toleration]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80
      tolerations:
      - key: "cf"
        operator: "Equal"
        value: "tencent"
        effect: "NoExecute"
[root@master taint_toleration]# 

[root@master taint_toleration]# kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment configured
[root@master taint_toleration]# kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-7ffb6b798c-hpbrn      1/1     Running   0          28s   10.244.247.13   node-2   <none>           <none>
nginx-deployment-7ffb6b798c-k82vg      1/1     Running   0          25s   10.244.247.16   node-2   <none>           <none>
nginx-deployment-7ffb6b798c-khh2c      1/1     Running   0          25s   10.244.247.19   node-2   <none>           <none>
nginx-deployment-7ffb6b798c-nvbxw      1/1     Running   0          25s   10.244.247.14   node-2   <none>           <none>
nginx-deployment-7ffb6b798c-pvr7x      1/1     Running   0          28s   10.244.247.18   node-2   <none>           <none>
nginx-deployment-7ffb6b798c-s8tzz      1/1     Running   0          28s   10.244.247.11   node-2   <none>           <none>
sc-nginx-deployment-66b6c48dd5-cxkzn   1/1     Running   1          8h    10.244.84.183   node-1   <none>           <none>
sc-nginx-deployment-66b6c48dd5-qmmn6   1/1     Running   1          8h    10.244.84.184   node-1   <none>           <none>
[root@master taint_toleration]# 

然后就都跑起来了

7.2、实验2

修改nginx.yaml文件的operator和key

[root@master taint_toleration]# vim nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-3
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80
      tolerations:
      - key: ""
        operator: "Exists"
        value: ""
        effect: ""
[root@master taint_toleration]# 

能容忍任何的污点和排斥等级

[root@master taint_toleration]# kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment-3 created
[root@master taint_toleration]# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
nginx-deployment-3-6bd9f68d59-6kpl9    1/1     Running   0          82s
nginx-deployment-3-6bd9f68d59-7whcx    1/1     Running   0          82s
nginx-deployment-3-6bd9f68d59-86xz9    1/1     Running   0          82s
nginx-deployment-3-6bd9f68d59-888dn    1/1     Running   0          82s
nginx-deployment-3-6bd9f68d59-hsbj7    1/1     Running   0          82s
nginx-deployment-3-6bd9f68d59-kj5f9    1/1     Running   0          82s

如果key为空,操作符号是Exists ↓

image-20240313193755082

8、容忍时间

在Kubernetes中,污点(Taints)和容忍度(Tolerations)是调度策略的一部分,用于控制Pod是否可以被调度到特定的节点上。当节点上有污点,并且Pod具有相应的容忍度时,Pod可以被调度到该节点。容忍度中的“容忍时间”(tolerationSeconds)是一个特定的字段,它与NoExecute效果的污点相关联。

当一个节点被标记为NoExecute效果的污点时,意味着新的Pod将不会被调度到这个节点上,而且已经存在于该节点上的Pod也会被驱逐。然而,如果你在Pod的容忍度中设置了tolerationSeconds,这将为Pod提供一个宽限期,在这个宽限期内,Pod可以继续在该节点上运行,即使它不容忍节点上的污点。

tolerationSeconds的值是一个整数,表示Pod在被驱逐之前可以继续在节点上运行的秒数。当tolerationSeconds设置为0时,Pod将立即被驱逐。如果tolerationSeconds没有被设置,Pod将不会被赋予任何宽限期,一旦节点上的污点变为NoExecute,Pod将立即被驱逐。

这是一个NoExecute污点和tolerationSeconds的示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoExecute"
    tolerationSeconds: 3600

在这个例子中,如果Pod被调度到一个具有相应污点的节点上,它将有3600秒(1小时)的时间来完成其工作并在被驱逐前进行清理。这个时间允许系统管理员或自动化工具在Pod被强制移除之前,有机会重新调度Pod到其他节点。

9、内置污点

image-20240313194851150

10、操作符Equal 和 Exists 的区别是什么

在 Kubernetes 中,EqualExists 是容忍(Tolerations)操作符,用于定义 Pod 在调度时对节点上的污点的容忍条件。

  1. Equal(等于):

    • 使用 Equal 操作符时,你可以指定具体的污点键、值和效果,以确保 Pod 只会被调度到具有与容忍条件完全匹配的污点的节点上。
    • 例如,如果你的节点上有一个污点:key=example-key, value=example-value, effect=NoSchedule,你可以在 Pod 中添加以下容忍条件,以确保它只能被调度到带有相同污点的节点上:
      tolerations:
      - key: example-key
        operator: Equal
        value: example-value
        effect: NoSchedule
      
  2. Exists(存在):

    • 使用 Exists 操作符时,你只需指定污点的键,而不需要指定值和效果。Pod 将容忍带有匹配键的任何污点,无论污点的值和效果如何。
    • 这对于那些只关心某个特定键是否存在,而不关心具体值和效果的情况非常有用。
    • 例如,如果你只关心节点上是否存在一个名为 example-key 的污点,而不关心其值和效果,你可以使用以下容忍条件:
      tolerations:
      - key: example-key
        operator: Exists
      

总的来说,Equal 更精确,要求匹配键、值和效果,而 Exists 只关心键是否存在,不考虑值和效果。选择使用哪种操作符取决于你的具体需求和场景。

image-20240313192035358

11、k8s中的HPA功能比传统的集群有什么优势?

  1. 启动速度快

  2. 扩展性更高

  3. 资源消耗方面---->节省服务器

  4. 价格

  5. 成本

  6. 稳定性

  7. 可靠性

12、k8s的调度算法(💘)

  1. deployment: 全自动调度 --》根据每台节点服务器的综合算力

  2. nodename 节点名字

  3. node selector:定向调度–>根据node的标签去调度

  4. nodeaffinity 节点亲和性 --》尽量把不同的pod放到一台node上

  5. podaffinity pod亲和性–》尽量把相同的pod放到一起

  6. taints和tolerations 污点和容忍度

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
污点容忍度是Kubernetes中用来控制Pod调度的机制。污点(Taint)是指在节点上设置的一种属性,用于排斥一类特定的Pod。而容忍度(Toleration)是指在Pod上设置的属性,用于指定Pod是否可以被调度到具有匹配污点的节点上。 当一个节点上设置了污点时,只有那些在Pod的容忍度中定义了匹配该污点的规则的Pod才能被调度到该节点上。如果Pod没有定义容忍度或者容忍度不匹配节点上的污点,则该Pod将不会被调度到该节点上。 举个例子,假设我们在节点node1上设置了一个污点,key为k1,value为v1,effect为NoSchedule。如果一个Pod的容忍度中定义了匹配这个污点的规则,比如key为test,value为16,effect为NoSchedule,那么这个Pod就可以被调度到拥有这个污点的node1节点上。 总结来说,污点容忍度是相互匹配的关系。通过在节点上设置污点和在Pod上设置容忍度,我们可以控制Pod的调度行为,避免将Pod调度到不合适的节点上。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [k8s--基础--20--污点容忍度](https://blog.csdn.net/zhou920786312/article/details/126241579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不冤不乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值