的副本数量,还需要让这些不同副本调度到不同的节点,打散开来避免单点故障,这个可以利用反亲和
性来实现,示例
:
1. affinity:
2. podAntiAffinity:
3. requiredDuringSchedulingIgnoredDuringExecution:
4. - weight: 100
5. labelSelector:
6. matchExpressions:
7. - key: k8s-app
8. operator: In
9. values:
10. - kube-dns
11. topologyKey: kubernetes.io/hostname
requiredDuringSchedulingIgnoredDuringExecution
调度时必须满足该反亲和性条件,如果
没有节点满足条件就不调度到任何节点
(Pending)
。如果不用这种硬性条件可以使用
preferredDuringSchedulingIgnoredDuringExecution
来指示调度器尽量满足反亲和性条
件,如果没有满足条件的也可以调度到某个节点。
labelSelector.matchExpressions
写该服务对应
pod
中
labels
的
key
与
value
。
topologyKey
这里用
kubernetes.io/hostname
表示避免
pod
调度到同一节点,如果你
有更高的要求,比如避免调度到同一个可用区,实现异地多活,可以用
failure-
domain.beta.kubernetes.io/zone
。通常不会去避免调度到同一个地域,因为一般同一个集群
的节点都在一个地域,如果跨地域,即使用专线时延也会很大,所以
topologyKey
一般不至
于用
failure-domain.beta.kubernetes.io/region
。
使用PodDisruptionBudget 避免驱逐导致服务不可用
驱逐节点是一种有损操作,驱逐的原理:
封锁节点
(
设为不可调度,避免新的
Pod
调度上来
)
。
将该节点上的
Pod
删除。
- ReplicaSet
控制器检测到
Pod
减少,会重新创建一个
Pod
,调度到新的节点上。
这个过程是先删除,再创建,并非是滚动更新