乐趣区

关于k8s: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 放在不通区域,这时须要用到反亲和性。

  • <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 集群节点的内建标签,它的值为以后节点的主机名,对于各个节点来说都是不同的
退出移动版