Pod在多可用區worker節點上的高可用部署

1、 需求分析

當前kubernetes集羣中的worker節點能夠支持添加多可用區中的ECS,這種部署方式的目的是可讓一個應用的多個pod(至少兩個)可以分佈在不一樣的可用區,起碼不能分佈在同一個可用區,已達到高可用或者同城災備的部署。node

2、 效果圖

3、 實現原理

爲了實現上述的效果,kubernetes提供了pod的親和性和反親和性來保證pod在節點級別,可用區級別的高可用部署;具體的值爲topologyKey:failure-domain.beta.kubernetes.io/zone。redis

4、 實現步驟

在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

原文連接部署

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索