使用ESSD同城冗余云盘实现应用的跨可用区容灾

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

ESSD同城冗余云盘是一种全新的ESSD云盘,写入该云盘的数据会自动存放在多个可用区,可用区的IDC、机柜、电力等均实现物理隔离。基于ESSD同城冗余部署应用,有状态的应用可以零改造成本,从单可用区应用升级为具有跨可用区级容灾能力的应用,当节点或可用区发生故障,或单可用区资源不足时,均可将该容器迁移到其他可用区,无需进行复杂的数据同步和数据校验,帮您实现更加简化的数据高可用架构。

阅读前提示

为了使您更好地了解ESSD同城冗余云盘,建议您在阅读本文之前,了解以下内容:

  • ESSD同城冗余云盘简介,请参见云盘简介

  • ESSD同城冗余云盘当前处于公测中,仅支持部分地域。更多使用限制,请参见使用限制

  • ESSD同城冗余云盘收取云盘容量费,在容器中挂载使用时,仅支持按量付费。具体计费规则请参见块存储计费

前提条件

已创建ACK托管集群,且集群为1.26及以上版本。集群中csi-plugincsi-provisioner组件版本为1.31.3及以上,请参见csi-plugincsi-provisioner

使用方法

  1. 确认支持ESSD同城冗余云盘的节点,并为该节点打标,以确保相关调度策略正常。

    1. 请在ECS网页控制台上尝试创建新实例,或为已有实例挂载ESSD同城冗余云盘,若可以挂载成功则说明该节点支持挂载ESSD同城冗余云盘。具体操作,请参见创建ESSD同城冗余云盘

    2. 执行以下命令,为节点打标。

      kubectl label node <node-name> node.csi.alibabacloud.com/disktype.cloud_regional_disk_auto=available

    如需验证跨可用区迁移能力,则至少需要准备2个处于不同可用区的节点。下文以cn-beijing-icn-beijing-l为例。

  2. 创建StorageClass。

    1. 使用以下内容,创建sc-regional.yaml文件。

      其中,type参数为cloud_regional_disk_auto

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alibabacloud-disk-regional
      parameters:
        type: cloud_regional_disk_auto
      provisioner: diskplugin.csi.alibabacloud.com
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
      allowVolumeExpansion: true
    2. 执行以下命令,创建StorageClass。

      kubectl apply -f sc-regional.yaml
  3. 创建测试应用。

    1. 使用以下内容,创建disk-test.yaml文件。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: disk-test
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
              - containerPort: 80
              volumeMounts:
              - name: pvc-disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: pvc-disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: alibabacloud-disk-regional
            resources:
              requests:
                storage: 20Gi
    2. 执行以下命令,创建应用并申请所需的云盘。

      kubectl apply -f disk-test.yaml
  4. 确认应用正常运行,并确认当前可用区。

    1. 执行以下命令查看PVCPod状态:

      kubectl get pvc pvc-disk-disk-test-0
      kubectl get pod disk-test-0

      预期输出:

      NAME                   STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS                 VOLUMEATTRIBUTESCLASS   AGE
      pvc-disk-disk-test-0   Bound    d-2ze5xxxxxxxxxxxxxxxx   20Gi       RWO            alibabacloud-disk-regional   <unset>                 14m
      NAME          READY   STATUS    RESTARTS   AGE
      disk-test-0   1/1     Running   0          14m

      可见同城冗余云盘已申请成功,Pod已挂载云盘并正常运行。

    2. 执行以下命令查看它调度到的Node:

      kubectl get node $(kubectl get pod disk-test-0 -ojsonpath='{.spec.nodeName}') -Ltopology.kubernetes.io/zone

      预期输出:

      NAME                       STATUS   ROLES    AGE     VERSION            ZONE
      cn-beijing.172.25.xxx.xx   Ready    <none>   6m32s   v1.32.1-aliyun.1   cn-beijing-i

      说明该Pod调度到了cn-beijing-i可用区。

  5. 为节点添加污点,模拟可用区故障。观察Pod可以带着云盘在另一可用区成功拉起。

    警告

    这会影响该可用区中所有正在运行的Pod,请勿在生产环境操作。

    1. 执行以下命令,为Pod当前运行的可用区的所有节点添加污点:

      kubectl taint node -ltopology.kubernetes.io/zone=cn-beijing-i testing=regional:NoExecute
    2. KCM将驱逐该可用区上的Pod,然后它会在其他可用区重建。执行以下命令以观察Pod状态和它调度到的新节点:

      kubectl get pod disk-test-0
      kubectl get node $(kubectl get pod disk-test-0 -ojsonpath='{.spec.nodeName}') -Ltopology.kubernetes.io/zone

      预期输出:

      NAME          READY   STATUS    RESTARTS   AGE
      disk-test-0   1/1     Running   0          20s
      NAME                       STATUS   ROLES    AGE   VERSION            ZONE
      cn-beijing.172.26.xxx.xx   Ready    <none>   32m   v1.32.1-aliyun.1   cn-beijing-l

      可见该Pod已成功在cn-beijing-l可用区拉起。云盘中的数据也均可以在新可用区访问。

  6. 执行以下命令,清理测试所使用的污点和资源:

    kubectl taint node -ltopology.kubernetes.io/zone=cn-beijing-i testing-
    kubectl delete sts disk-test
    kubectl delete pvc pvc-disk-disk-test-0