利用Pod反亲和性,可以做到相同服务在每个节点只部署一份进程。

Pod间的亲和性和反亲和性(affinity and anti-affinity)

  • 亲和性:Node上已经部署了指定条件的Pod,Pod才会在这个节点上部署
  • 反亲和性:Node上已经部署了指定条件的Pod,Pod就不会再这个节点上部署

亲和性和反亲和性有两种选择类型:

  • requiredDuringSchedulingIgnoredDuringExecution
  • preferredDuringSchedulingIgnoredDuringExecution

前者是必须符合条件,后者是优先考虑符合条件的Node。

更多配置细节查看Assigning Pods to Nodes

配置每节点只部署一份进程

每节点:我们可以使用Node内建标签kubernetes.io/hostname来标识。
只部署一份:我们可以使用反亲和性的requiredDuringSchedulingIgnoredDuringExecution来规定。

假设我们要部署的imagenginx,节点数为3,那么我们可以这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname

部署完成后,当我们把replicas数升至4时,会出现错误信息:

1
0/4 nodes are available: 1 node(s) had taints that the pod didn't tolerate, 3 node(s) didn't match pod affinity/anti-affinity, 3 node(s) didn't satisfy existing pods anti-affinity rules.


此时第四个Pod是启动不起来的,达到了我们想要的目的。

参考

Assigning Pods to Nodes