[英]Multizone Kubernetes cluster and affinity. How to distribute application per zone?
我有一个包含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尝试相同的术语时,一切看起来都不错,但是滚动更新无法正常工作,因为无法安排新副本(每个区域中已经存在带有“ component” =“ 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
我认为Kubernetes调度程序无法保证所有可用区域中的Pod。 我认为这是一种尽力而为的方法,可能会有一些局限性。
我已经打开一个问题来检查是否可以通过NodeAffinity或PodAffiity / PodAntiAffinity支持该功能。
这里的关键问题是滚动更新-进行滚动更新后,将保留旧副本,直到启动新副本为止。 但是由于与旧副本的冲突,无法安排/启动新副本。
因此,如果不考虑滚动更新,请在此处提供一种变通方法,将策略类型更改为Recreate
:
apiVersion: apps/v1
kind: Deployment
...
spec:
...
strategy:
type: Recreate
...
然后应用podAntiAffinity / requiredDuringSchedulingIgnoredDuringExecution规则将起作用。
如果每个区域中都有两个节点,则可以使用以下相似性规则来确保滚动更新也能正常工作,并且每个区域中都有一个容器。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.