我的知识库 / Kubernetes / 反亲和性提高服务可用性
在 Kubernetes 中部署服务时,我们通常会部署多副本来提高服务的可用性。但是当这些副本集中部署在一个节点,而且很不幸,该节点出现故障,那么服务很容易陷入不可用状态。
下面介绍一种方法,将服务副本分散部署在不同的节点(把鸡蛋放在不同的篮子里),避免单个节点故障导致服务多副本毁坏,提高服务可用性。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 5
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
ports:
- name: tcp
containerPort: 80
使用
kubernetes.io/hostname
作为拓扑域,查看匹配规则,即同一打有同样标签app=nginx
的 pod 会调度到不同的节点。
podAntiAffinity 使用场景:
对于亲和性和反亲和性,每种都有三种规则可以设置:
调度策略 | 匹配标签 | 操作符 | 拓扑域支持 | 调度目标 |
---|---|---|---|---|
nodeAffinity | 主机 | In, NotIn, Exists, DoesNotExist, Gt, Lt | 否 | pod 到指定主机 |
podAffinity | Pod | In, NotIn, Exists, DoesNotExist | 是 | pod 与指定 pod 同一拓扑域 |
PodAntiAffinity | Pod | In, NotIn, Exists, DoesNotExist | 是 | pod 与指定 pod 非同一拓扑域 |