k8s节点亲和性
Kubernetes中的调度策略能够大抵分为两种:
- 一种是全局的调度策略,要在启动调度器时配置,包含kubernetes调度器自带的各种predicates和priorities算法,具体能够参看上一篇文章;
- 另一种是运行时调度策略,包含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: []}
- 同时指定
nodeSelectorTerms
和nodeSelector
时必须同时满足 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
andfailure-domain.beta.kubernetes.io/region
的组合; kubernetes.io/hostname
标签是Kubernetes
集群节点的内建标签,它的值为以后节点的主机名,对于各个节点来说都是不同的