全部產品
Search
文件中心

Container Service for Kubernetes:儲存多可用性區域部署的推薦配置

更新時間:Jun 19, 2024

通過儲存多可用性區域部署最佳化,可以幫您最大限度地減少應用發布中斷,確保關鍵業務系統和應用在各種故障情況下能持續運行。本文介紹儲存在多可用性區域部署時的推薦配置。

背景資訊

Kubernetes強大的容器編排能力,使得使用者在Kubernetes上構建大規模的有狀態應用變得越來越簡單。雖然Kubernetes簡化了應用分發部署的流程,但是也隱藏了底層的硬體邏輯,使用者很難感知具體的硬體邏輯,由此可能會導致如下一些非預期的情況。

  • 在多可用性區域構成的叢集下,需要部署在A可用性區域,最後發現實際部署在B可用性區域。

  • 建立雲端硬碟(PV/PVC)時,出現錯誤InvalidDataDiskCatagory.NotSupported。更多資訊,請參見動態建立PV失敗且提示InvalidDataDiskCatagory.NotSupported

  • 掛載應用時,出現錯誤The instanceType of the specified instance does not support this disk category

  • 調度應用時,出現錯誤0/x node are available, x nodes had volume node affinity conflict

以上這些問題,均會導致應用發布中斷受阻,本文推薦一種儲存多可用性區域部署的最佳配置,最大程度的減少上述問題。

推薦配置

  • 使用雲端硬碟進行持久化儲存,相對於NAS更加穩定,資料傳輸頻寬更好。

  • 叢集內包含三個可用性區域,確保機器和儲存資源滿足需求。

  • 當叢集可用性區域內的節點均不可用時,可立即彈出節點進行匹配。

  • 使用高可用類型的雲端硬碟避免雲端硬碟掛載失敗。

  • 確保應用可以均勻分配至各個節點(各個可用性區域)。

節點池推薦配置

  • 每個節點池使用單一可用性區域,每新增一個可用性區域,都需要建立節點池。具體操作,請參見建立節點池

    重要

    建立節點池時,確保每個節點池對應各自不同的可用性區域,建議使用節點池名稱區分不同的可用性區域。

  • 開啟節點池的Auto Scaling功能。具體操作,請參見節點自動調整

  • 多可用性區域內盡量使用同一類型的ECS資源,或者支援同一種類型Block Storage的ECS資源。

  • 在節點池上對所有節點池進行汙點配置,確保不會有其他非預期應用被調度過來影響當前應用。汙點

配置說明如下:

  • 每個節點池使用單一可用性區域,同時開啟節點池的Auto Scaling功能。

    當前可用性區域沒有可用的節點時,系統會自動彈出一個對應可用性區域的節點供Pod調度,如下圖所示。pod

  • 使用單一類型的ECS資源。

    ECS和Block Storage有對應關係,即使在同一個可用性區域調度,也可能因為有節點不支援聲明的Block Storage,導致Pod因雲端硬碟掛載問題而無法啟動。

叢集推薦配置

  • 確保叢集版本不低於1.20。

  • 確保叢集的CSI組件版本不低於1.22。更多資訊,請參見csi-provisioner

  • 使用高可用類型的雲端硬碟,儲存類StorageClass模板如下:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-alltype
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.diskplugin.csi.alibabacloud.com/zone
        values:
        - cn-beijing-a
        - cn-beijing-b

部分參數說明如下:

  • type: cloud_essd,cloud_ssd,cloud_efficiency

    保證CSI組件優先建立ESSD雲端硬碟,如果可用性區域內ESSD雲端硬碟庫存不足時,可以建立SSD雲端硬碟。不會因雲端硬碟庫存不足等原因導致應用無法啟動。

  • volumeBindingMode: WaitForFirstConsumer

    Kubernetes提供的一種建立雲端硬碟的方式,它可以先讓Pod進行調度,等到Pod被調度到某一個特定的節點後,CSI才開始根據StorageClass的配置進行雲端硬碟建立,此時,您就可以根據Pod所在節點上的資訊來建立雲端硬碟。

  • allowedTopologies

    可以將製作卷的拓撲限制在特定的地區。當StorageClass為WaitForFirstConsumer時,調度器將根據StorageClass的拓撲結構對Pod進行調度,以滿足雲端硬碟的建立需求。

應用推薦配置

以下給出了標準StatefulSet應用配置的模板,您可以根據需求自行定義應用配置。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app: mysql
        maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "mysql"
        volumeMounts:
        - name: disk-csi
          mountPath: /var/lib/mysql
      tolerations:
      - key: "app"
        operator: "Exists"
        effect: "NoSchedule"
  volumeClaimTemplates:
  - metadata:
      name: disk-csi
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: alicloud-disk-topology-alltype
      resources:
        requests:
          storage: 40Gi

部分參數說明如下:

  • topologySpreadConstraints

    盡量讓高可用的Pod分布在不同的可用性區域。更多資訊,請參見Topology Spread Constraints

  • volumeClaimTemplates

    您可以根據指定的Replicas數量自動建立對應數量的雲端硬碟,便於快速擴充。

重要
當PV被動態建立出來,PV對應的YAML中會包含PV所在節點上的可用性區域資訊。此PV以及關聯的PVC只能在節點的可用性區域內進行調度,不會被調度到可用性區域之外,以此來確保Pod能掛載成功。

相關文檔