k8s节点亲和性

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 不支持
podAffinity Pod标签 In,NotIn,Exists,DoesNotExist 支持
PodAntiAffinity Pod标签 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放在不通区域,这时需要用到反亲和性。

  • requiredDuringSchedulingIgnoredDuringExecution, 硬约束,一定要满足,Pod的亲和性调度必须要满足后续定义的约束条件。
  • preferredDuringSchedulingIgnoredDuringExecution,软约束,不一定满足,Pod的亲和性调度会尽量满足后续定义的约束条件。

​ 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集群节点的内建标签,它的值为当前节点的主机名,对于各个节点来说都是不同的

你可能感兴趣的:(k8s)