k8s节点亲和性

Kubernetes中的调度策略能够大抵分为两种:

  1. 一种是全局的调度策略,要在启动调度器时配置,包含kubernetes调度器自带的各种predicates和priorities算法,具体能够参看上一篇文章;
  2. 另一种是运行时调度策略,包含nodeAffinity(主机亲和性),podAffinity(POD亲和性)以及podAntiAffinity(POD反亲和性)。

  • nodeAffinity 次要解决POD要部署在哪些主机,以及POD不能部署在哪些主机上的问题,解决的是POD和主机之间的关系。
  • podAffinity 次要解决POD能够和哪些POD部署在同一个拓扑域中的问题(拓扑域用主机标签实现,能够是单个主机,也能够是多个主机组成的cluster、zone等。)
  • podAntiAffinity次要解决POD不能和哪些POD部署在同一个拓扑域中的问题。它们解决的是Kubernetes集群外部POD和POD之间的关系。
策略名称匹配指标反对的操作符反对拓扑域
nodeAffinity主机标签In,NotIn,Exists,DoesNotExist,Gt,Lt不反对
podAffinityPod标签In,NotIn,Exists,DoesNotExist反对
PodAntiAffinityPod标签In,NotIn,Exists,DoesNotExist反对
  • 亲和性:利用A与利用B两个利用频繁交互,所以有必要利用亲和性让两个利用的尽可能的凑近,甚至在一个node上,以缩小因网络通信而带来的性能损耗。
  • 反亲和性:当利用的采纳多正本部署时,有必要采纳反亲和性让各个利用实例打散散布在各个node上,以进步HA,避免节点down掉,服务生效。

nodeAffinity

硬亲和性

   affinity:     nodeAffinity:       requiredDuringSchedulingIgnoredDuringExecution: 硬亲和性         nodeSelectorTerms:   写多个满足其中一条就能够         - matchExpressions:  能够写多个满足必须同时满足           - key: disktype             operator: In             values:             -  ssd             -  hard

软亲和性

affinity:  nodeAffinity:    preferredDuringSchedulingIgnoredDuringExecution:    - weight:  60      preference:        matchExpressions:        - {key: zone, operator: In, values: ["foo"]}    - weight:  30      preference:        matchExpressions:        - {key: ssd, operator: Exists, values: []}
  • 同时指定nodeSelectorTermsnodeSelector时必须同时满足
  • nodeAffinity有多个nodeSelectorTerms ,pod只需满足一个
  • nodeSelectorTerms多个matchExpressions ,pod必须都满足
  • 因为IgnoredDuringExecution,扭转labels不会影响曾经运行pod

Pod affinity

因为业务的需要,有时会需要将pod调度到对立区域(node,机房)等,比方前端和和后端尽量放在一起,频繁交互的放在一起,这样能够缩小网络的开销,有时会出于平安思考,会将不通的pod放在不通区域,这时须要用到反亲和性。

  • <font color=#FF0000> requiredDuringSchedulingIgnoredDuringExecution, 硬束缚,肯定要满足,Pod的亲和性调度必须要满足后续定义的约束条件。 </font>
  • <font color=#FF0000> preferredDuringSchedulingIgnoredDuringExecution,软束缚,不肯定满足,Pod的亲和性调度会尽量满足后续定义的约束条件。 </font>

pod亲和性会依据节点上正在运行的pod的标签来调度,而非node的标签,要求对节点和Pod两个条件进行匹配,其规定为:如果在具备指定标签的Node上运行了一个或多个符合条件的Pod,那么Pod应该运行在此Node上。反之怎不容许运行在此node上。能够依据kubernetes.io/hostname作为评判规范是否在一个域中。

  • Pod亲和性调度:podAffinity
  • 非亲和性调度:podAntiAffinity
      affinity: #定义亲和性        podAntiAffinity: # pod亲和性          requiredDuringSchedulingIgnoredDuringExecution: #硬束缚          - labelSelector:              matchExpressions:               - key: app                operator: In                values:                - nacos            topologyKey: kubernetes.io/hostname  #域

topologyKey:

  • 对于亲和性和软反亲和性,不容许空topologyKey;
  • 对于硬反亲和性,LimitPodHardAntiAffinityTopology控制器用于限度topologyKey只能是kubernetes.io/hostname;
  • 对于软反亲和性,空topologyKey被解读为kubernetes.io/hostname, failure-domain.beta.kubernetes.io/zone and failure-domain.beta.kubernetes.io/region的组合;
  • kubernetes.io/hostname标签是Kubernetes集群节点的内建标签,它的值为以后节点的主机名,对于各个节点来说都是不同的