Kubernetes-Taint (污点)和 Toleration(容忍)

目录

一、Taint(污点)

1.污点的组成

2.污点的设置、查看和去除

3.污点实验:

二、Toleration(容忍)

1.容忍设置的方案

2.容忍实验:


       Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。

一、Taint(污点)

       使用 `kubectl taint` 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去

1.污点的组成

         key=value:effect

         每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。当前 taint effect 支持如下三个选项:

NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上

PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上

NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去。

2.污点的设置、查看和去除

kubectl taint nodes node1 key1=value1:NoSchedule
    # 设置污点

kubectl describe node  node-name
    # 节点说明中,查找 Taints 字段

kubectl taint nodes node1 key1:NoSchedule-
    # 去除污点

3.污点实验:

kubectl describe node k8s-master01
    #主节点自带污点,所以master节点不能被调度

kubectl taint node k8s-master01 node-role.kubernetes.io/master=:NoSchedule-
	#取消master节点的污点

kubectl describe node k8s-master01
    #查看污点已被删除

kubectl create deployment taint_deploy --image=nginx:latest
    #创建名为taint_deploy的deployment,使用nginx:latest作为pod内容器创建的镜像。

kubectl scale deployment taint_deploy --replicas=20
    #设置刚刚创建的deployment的pod副本数为20

kubectl get pod -o wide
    #观察刚刚创建的pod,因为取消了master节点的污点,所以pod可以被调度到master节点运行了
    #master节点没有污点的情况下,运行daemonset,master节点也会运行一个daemonset。

二、Toleration(容忍)

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

pod.spec.tolerations

1.容忍设置的方案

tolerations:	#容忍

第一种方案:
- key: "key1"	#指定污点的key1
  operator: "Equal"	#运算符等于
  value: "value1"	#value是污点value1
  effect: "NoSchedule"	#策略是NoSchedule
#这种写法的含义是key,value,effect必须全部匹配,有一个不一样都匹配不到。

第二种方案:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
  tolerationSeconds: 3600	#容忍3600秒

第三种方案:
- key: "key2"		#只要匹配到key和dffect,value是什么无所谓。
  operator: "Exists"
  effect: "NoSchedule"

例:

Ⅰ、当不指定 key 值时,表示容忍所有的污点 key:** 
tolerations:
- operator: "Exists"		#只写一个存在,只要有污点,就能容忍

Ⅱ、当不指定 effect 值时,表示容忍所有的污点作用**
tolerations:
- key: "key"
  operator: "Exists"		#只要key匹配到了,其他的无所谓

Ⅲ、有多个 Master 存在时,防止资源浪费,可以如下设置
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

2.容忍实验:

kubectl taint node k8s-master01 node-role.kibernetes.io/master=:NoSchedule	
	#将主节点的污点恢复回来

kubectl get daemonset -n kube-system
    #查看有哪些daemonset资源

kubectl get daemonset -n kube-system calico-node -o yaml
    #查看calico的容忍
    #策略NoSchedule,运算符Exists(存在),key和value无所谓
	#value和策略无所谓
	#还能容忍NoExecute策略的,value和key无所谓

Kubernetes-Taint (污点)和 Toleration(容忍)_第1张图片

kubectl describe node k8s-master01
    #查询master节点的key

vim tolerations_daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: tolerations-daemonset
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      name: tolerations-daemonset-pod
  template:
    metadata:
      labels:
        name: tolerations-daemonset-pod
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"    #master节点的污点的key。
        operator: "Exists"    #匹配规则为exists,存在key就容忍。
      containers:
      - name: tolerations-daemonset-pod
        image: nginx:latest
        imagePullPolicy: IfNotPresent

kubectl apply -f tolerations_daemonset.yaml

kubectl get daemonset
    #查看创建的daemonset

kubectl get pod -o wide
    #查看daemonset的pod是否调度在master上。

你可能感兴趣的:(Kubernetes,kubernetes,容器,云原生,运维,linux)