k8s亲和和反亲和相关

背景

最近在测试亲和和反亲和,发现很多知识都遗忘了,准备重新捡起来看看。

Pod和Node

从pod出发,可以分成亲和性和反亲和性,分别对应podAffinitypodAntiAffinity

从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinitynodeAntiAffinity

从操作指令来讲,可以有InNotInExistsDoesNotExist等等。

  • 那么针对亲和性来讲,in代表我要调度到有这个标签的位置。
  • 那么针对反亲和性来讲,in代表我不要调度到有这个标签的位置。

结论:反亲和和亲和的in和notin操作是完全相反的,注意一下就行了。

硬亲和和软亲和

preferredDuringSchedulingIgnoredDuringExecution 软亲和

requiredDuringSchedulingIgnoredDuringExecution 硬亲和

不必过多讲解,反正就是必须和尽量的关系。

代码样例

下面代表我的pod不调度到pod拥有release=opsnatmonitor-v1标签的node上.

1
2
3
4
5
6
7
8
9
10
11
12
13
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: release
operator: In
values:
- opsnatmonitor-v1
topologyKey: kubernetes.io/hostname

下面代表我的pod要调度到pod拥有release=opsnatmonitor-v1标签的node上.

1
2
3
4
5
6
7
8
9
10
11
12
13
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: release
operator: In
values:
- opsnatmonitor-v1
topologyKey: kubernetes.io/hostname

最后补充

场景: pod有3个,node有2个,分别测试硬亲和和软亲和结果。

结果:

硬亲和会分别调度到两个node上,并有一个pod是pending的。

软亲和会按照pod个数为1:2分配到两个node上。