k8s 亲和、反亲和、污点、容忍

文章目录

  • 1. K8s 调度
  • 2. 亲和与反亲和
    • 2.1 Pod 和 Node
    • 2.2 硬亲和和软亲和
  • 3. 污点与容忍
    • 3.1 污点
    • 3.2 容忍


1. K8s 调度

  • 调度器通过 kubernetes 的 list-watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。

  • kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。

  • 在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。

Kuberbetes调度可以参考官网地址:
https://kubernetes.io/zh/docs/concepts/scheduling/kube-scheduler/

调度框架:
https://kubernetes.io/zh/docs/concepts/configuration/scheduling-framework/

2. 亲和与反亲和

2.1 Pod 和 Node

  • 从 pod 出发,可以分成亲和性和反亲和性,分别对应 podAffinitypodAntiAffinity

  • 从 node 出发,也可以分成亲和性和反亲和性,分别对应 nodeAffinitynodeAntiAffinity

  • 从操作指令来讲,可以有 In、NotIn、Exists、DoesNotExist 等等。

针对亲和性来讲,in 代表我要调度到有这个标签的位置。
针对反亲和性来讲,in 代表我不要调度到有这个标签的位置。

2.2 硬亲和和软亲和

preferredDuringSchedulingIgnoredDuringExecution 软亲和

requiredDuringSchedulingIgnoredDuringExecution 硬亲和

  • 硬策略:结合下面的 “operator: In”,意思就是必须调度到满足条件的节点上,否则就等着 Pending。
  • 软策略:结合下面的 “operator: NotIn”,意思就是尽量不要将 pod 调度到匹配到的节点,但是如果没有不匹配的节点的话,也可以调度到匹配到的节点。
kubectl get pods -n company ai-action-statistic-gray-86465f9c4b-hdfk4 -oyaml | grep nodeSelector -B 5 -A 5
  uid: ed47f094-f70a-45ed-b7dd-d46f2d01986f
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:    #硬策略
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/gray
            operator: In
            values:
            - gray
      preferredDuringSchedulingIgnoredDuringExecution:  #软策略
          - weight: 1
            preference:
              matchExpressions:
              - key: pc-app
                operator: NotIn
                values:
                - luna

不管哪种方式,最终还是要依赖 label 标签。

3. 污点与容忍

3.1 污点

  如果一个节点被标记为有污点,那么就意味着不允许将 pod 调度到该节点,除非 pod 也被标记为可以容忍污点节点。
  在使用 kubeadm 部署的 k8s 集群的时候应该会发现,通常情况下,应用是不会被调度到 master 节点的。因为 kubeadm 部署的 k8s 集群默认给 master 节点加了 Taints(污点)。

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   4d    v1.15.1
node01   Ready    <none>   4d    v1.15.1
node02   Ready    <none>   4d    v1.15.1
[root@master ~]# kubectl describe node master | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule

污点有两种策略:

  • PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去。
  • NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 Pod 没有对应容忍(Tolerate)设置,则会直接被逐出。

3.2 容忍

如果我们想将 pod 调度到污点节点,我们只要给 pod 添加容忍申明就可以了,如下:

...................
          containerPort: 80
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
...................

对于 tolerations 属性的写法,其中的 key、value、effect 与 Node 的 Taint 设置需保持一致, 另外:

  • 如果 operator 的值是 Exists,则 value 属性可省略
  • 如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 等于
  • 如果不指定 operator 属性,则默认值为 Equal
  • 空的 key 如果再配合 Exists 就能匹配所有的 key 与 value,也就是是能容忍所有节点的所有 Taints
  • 空的 effect 匹配所有的 effect

K8S——Label 详解
Kubernetes-k8s label 标签的运用
k8s-Label


k8s 亲和、反亲和、污点、容忍
kubernetes 调度机制、亲和、反亲和、污点、容忍
K8S 之 Taints 污点与 Tolerations 容忍详解
K8s 亲和反亲和策略


你可能感兴趣的:(kubernetes,docker,容器)