我有一个包含6个节点的多区域(3个区域)GKE群集(1.10.7-gke.1),希望每个区域至少具有我的应用程序的一个副本。
所以我尝试了首选的podAntiAffinity:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: failure-domain.beta.kubernetes.io/zone
我第一次安装应用程序(从1到3个副本缩放)时,一切看起来都很不错。在下一次滚动更新之后,一切都变得混乱了,我可以在一个区域中拥有3个应用程序副本。由于将创建其他副本,而旧副本将终止。
当我在 requiredDuringSchedulingIgnoredDuringExecution 中尝试相同的术语时,一切看起来都很好,但是滚动更新无法正常工作,因为无法安排新的副本(“组件” =“ app”的容器已经存在每个区域)。
如何配置我的部署以确保每个可用区中都有副本?
已更新:
我现在的解决方法是在滚动更新期间进行严格的反亲和并拒绝其他pod(多于3个):
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: failure-domain.beta.kubernetes.io/zone
deploymentStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
答案 0 :(得分:0)
我不认为Kubernetes调度程序提供一种方法来保证所有可用区域中的Pod。我认为这是一种尽力而为的方法,并且可能会有一些限制。
我已经打开issue来检查是否可以通过NodeAffinity或PodAffiity / PodAntiAffinity支持此功能。
答案 1 :(得分:0)
此处的关键问题是滚动更新-进行滚动更新后,将保留旧副本,直到启动新副本为止。但是由于与旧副本存在冲突,因此无法计划/启动新副本。
因此,如果不关心滚动更新,请采用此处的变通办法,将策略类型更改为Recreate
:
apiVersion: apps/v1
kind: Deployment
...
spec:
...
strategy:
type: Recreate
...
然后应用podAntiAffinity / requiredDuringSchedulingIgnoredDuringExecution规则将起作用。
答案 2 :(得分:0)
如果每个区域中都有两个节点,则可以使用以下相似性规则来确保滚动更新也能正常工作,并且每个区域中都有一个pod。
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: "kubernetes.io/hostname"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: failure-domain.beta.kubernetes.io/zone