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