k8s每节点相同服务只部署一个进程
利用Pod反亲和性,可以做到相同服务在每个节点只部署一份进程。
Pod间的亲和性和反亲和性(affinity and anti-affinity)
- 亲和性:Node上已经部署了指定条件的Pod,Pod才会在这个节点上部署
- 反亲和性:Node上已经部署了指定条件的Pod,Pod就不会再这个节点上部署
亲和性和反亲和性有两种选择类型:
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringSchedulingIgnoredDuringExecution
前者是必须符合条件,后者是优先考虑符合条件的Node。
更多配置细节查看Assigning Pods to Nodes
配置每节点只部署一份进程
每节点
:我们可以使用Node内建标签kubernetes.io/hostname
来标识。只部署一份
:我们可以使用反亲和性的requiredDuringSchedulingIgnoredDuringExecution
来规定。
假设我们要部署的image
为nginx
,节点数为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
31kind: 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是启动不起来的,达到了我们想要的目的。
参考
- 本文链接:https://keepmoving.ren/kubernetes/only-one-pod-each-node/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!