Kubernetes 污点和容忍度

Kubernetes官方文档——污点和容忍度
建议先去看下官方文档下

简介:
Taint(污点),它使节点能够排斥一类特定的 Pod。

容忍度(Tolerations)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。

关键词 注解
NoSchedule 不会将Pod调度到具有污点的节点上
PreferNoSchedule 尽量避免将 Pod 调度到具有污点的节点上
NoExecute 不会将Pod调度到具有污点的节点上,同时驱逐Node节点上已存在的Pod

Kubernetes 污点和容忍度_第1张图片

一、查看当前存在的节点

kubectl   get nodes

在这里插入图片描述

二、使用命令 kubectl taint 给节点k8s-node2增加一个污点

kubectl  taint   node k8s-node2  node-role.kubernetes.io=k8s-node2:NoSchedule

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

kubectl taint node k8s-node2  node-role.kubernetes.io:NoSchedule-

三、查看k8s-node2节点详细信息

kubectl  describe   nodes  k8s-node2

Kubernetes 污点和容忍度_第2张图片
四、创建可以容忍k8s-node2的污点的Pod

  1. 生成Pod文件
kubectl  create   deployment  noschedule --image=nginx:latest  -o yaml --dry-run=client  > noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: noschedule
  name: noschedule
spec:
  replicas: 1
  selector:
    matchLabels:
      app: noschedule
  template:
    metadata:
      labels:
        app: noschedule
    spec:
      affinity:
        nodeAffinity:    #这里强制将pod调度到k8s-node2节点上进行测试
          requiredDuringSchedulingIgnoredDuringExecution:  # 定义硬亲和性
            nodeSelectorTerms:
            - matchExpressions:   #集合选择器
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-node2
      containers:
      - image: nginx:latest
        name: nginx

2、创建并且查看Pod调度情况

kubectl  apply -f noschedule.yaml   &&  kubectl   get  pod   -o wide

在这里插入图片描述
Kubernetes 污点和容忍度_第3张图片

五、为Pod添加容忍点
1、生成Pod文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: noschedule
  name: noschedule
spec:
  replicas: 1
  selector:
    matchLabels:
      app: noschedule
  template:
    metadata:
      labels:
        app: noschedule
    spec:
      affinity:
        nodeAffinity:    #这里强制将pod调度到k8s-node2节点上进行测试
          requiredDuringSchedulingIgnoredDuringExecution:  # 定义硬亲和性
            nodeSelectorTerms:
            - matchExpressions:    #集合选择器
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-node2
      containers:
      - image: nginx:latest
        name: nginx
      tolerations:
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"    #污点的键
        effect: "NoSchedule"  #污点策略

2、更新Pod文件

kubectl apply  -f noschedule.yaml && kubectl  get   po

在这里插入图片描述

六、使用污点NoExecute策略进行测试
1、k8s-node2添加NoExecute污点

kubectl  taint  node k8s-node2  node-role.kubernetes.io=k8s-node2:NoExecute

Kubernetes 污点和容忍度_第4张图片
Kubernetes 污点和容忍度_第5张图片

2、更新yaml文件并且更新Pod

vim noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: noschedule
  name: noschedule
spec:
  replicas: 1
  selector:
    matchLabels:
      app: noschedule
  template:
    metadata:
      labels:
        app: noschedule
    spec:
      affinity:
        nodeAffinity:    #这里强制将pod调度到k8s-node2节点上进行测试
          requiredDuringSchedulingIgnoredDuringExecution:  # 定义硬亲和性
            nodeSelectorTerms:
            - matchExpressions:    #集合选择器
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-node2
      containers:
      - image: nginx:latest
        name: nginx
      tolerations:
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"    #污点的键
        effect: "NoSchedule"  #污点策略
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"     #污点的键
        effect: "NoExecute"    #污点策略
        tolerationSeconds: 60  #Pod在节点上运行60秒
kubectl  apply  -f noschedule.yaml  && kubectl  get  pod -w

Kubernetes 污点和容忍度_第6张图片
Kubernetes 污点和容忍度_第7张图片

七、使用污点PreferNoSchedule策略进行测试
在这里插入图片描述
k8s-node2添加PreferNoSchedule污点

kubectl  taint   node   k8s-node2 node-role.kubernetes.io=k8s-node2:PreferNoSchedule

1、实验一测试是否有软性质(强制调度到node2节点上)

vim noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: noschedule
  name: noschedule
spec:
  replicas: 3
  selector:
    matchLabels:
      app: noschedule
  template:
    metadata:
      labels:
        app: noschedule
    spec:
      affinity:
        nodeAffinity:    #这里强制将pod调度到k8s-node2节点上进行测试
          requiredDuringSchedulingIgnoredDuringExecution:  # 定义硬亲和性
            nodeSelectorTerms:
            - matchExpressions:    #集合选择器
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-node2
      containers:
      - image: nginx:latest
        name: nginx
      tolerations:
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"    #污点的键
        effect: "NoSchedule"  #污点策略
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"     #污点的键
        effect: "NoExecute"    #污点策略
kubectl  get  pod  -o wide

在这里插入图片描述

可以看到也可以正常调度到node2节点上。

2、实验二测试是否有软性质(不强制调度到node2节点上,随机调度策略)

在这里插入代码片
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: noschedule
  name: noschedule
spec:
  replicas: 3
  selector:
    matchLabels:
      app: noschedule
  template:
    metadata:
      labels:
        app: noschedule
    spec:
      #affinity:
      #  nodeAffinity:    #这里强制将pod调度到k8s-node2节点上进行测试
      #    requiredDuringSchedulingIgnoredDuringExecution:  # 定义硬亲和性
      #      nodeSelectorTerms:
      #      - matchExpressions:    #集合选择器
      #        - key: kubernetes.io/hostname
      #          operator: In
      #          values:
      #          - k8s-node2
      containers:
      - image: nginx:latest
        name: nginx
      tolerations:
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"    #污点的键
        effect: "NoSchedule"  #污点策略
      - key: "node-role.kubernetes.io" #污点的key
        operator: "Equal"
        value: "k8s-node2"     #污点的键
        effect: "NoExecute"    #污点策略
kubectl  delete  -f   noschedule.yaml   &&   kubectl  apply -f noschedule.yaml    && kubectl   get  pod  -o wide

Kubernetes 污点和容忍度_第8张图片

总结:
1、如果未被过滤的污点中存在至少一个 effect 值为 NoSchedule 的污点, 则 Kubernetes 不会将 Pod 分配到该节点

2、如果被过滤的污点中不存在 effect 值为NoSchedule 的污点, 但是存在 effect 值PreferNoSchedule污点, 则 Kubernetes 会 尝试Pod 分配到该节点

3、如果未被过滤的污点中存在至少一个 effect 值为NoExecute 的污点, 则 Kubernetes 不会将 Pod 分配到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。

你可能感兴趣的:(kubernetes)