當前kubernetes集羣中的worker節點能夠支持添加多可用區中的ECS,這種部署方式的目的是可讓一個應用的多個pod(至少兩個)可以分佈在不一樣的可用區,起碼不能分佈在同一個可用區,已達到高可用或者同城災備的部署。node
爲了實現上述的效果,kubernetes提供了pod的親和性和反親和性來保證pod在節點級別,可用區級別的高可用部署;具體的值爲topologyKey:failure-domain.beta.kubernetes.io/zone。redis
在ACK上建立完集羣后,不論從哪一個可用區添加節點,都會對該節點打上對應的可用區標籤,好比,一個節點是屬於北京可用區a的,那麼在加入到kubernetes集羣后,該節點上會有一個這樣的標籤:failure-domain.beta.kubernetes.io/zone: cn-beijing-a。api
在有了上述標籤後,對應用進行多可用區部署時,咱們就可使用一下yaml文件來使不一樣的pod分配到不一樣的可用區。app
Yaml文件示例:
apiVersion: apps/v1 kind: Deployment metadata: name: redis-cache spec: selector: matchLabels: app: store replicas: 3 template: metadata: labels: app: store spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "failure-domain.beta.kubernetes.io/zone" containers: - name: redis-server image: redis:3.2-alpine
上面yaml文件中的podAntiAffinity:部分規定了node的反親和性,而且因爲使用了topologyKey: "failure-domain.beta.kubernetes.io/zone",若是failure-domain.beta.kubernetes.io/zone這個key有三種value,好比cn-beijing-a,cn-beijing-b,cn-beijing-c;那麼pod會被分配在這三個不一樣的可用區。而且因爲使用了preferredDuringSchedulingIgnoredDuringExecution,因此若是pod個數大於可用區個數的話,pod會盡量的放在不一樣的可用區,最後會出現多出來的pod會與原有pod在同一個可用區。dom
上面的使用方式還有不少種,包括node級別的,詳細請參考:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinityspa
因爲雲盤不能跨可用區掛載,若是有pod使用了存儲卷,該pod須要被調度到與存儲卷相同的可用區的機器上。code
其餘存儲卷好比NAS,OSS是能夠採用上述部署方式的。server
本文做者:朱延生blog
原文連接部署
本文爲雲棲社區原創內容,未經容許不得轉載。