文档首页/ 云容器引擎 CCE/ 最佳实践/ 存储/ 存储多可用区部署的推荐配置
更新时间:2024-12-17 GMT+08:00
分享

存储多可用区部署的推荐配置

应用场景

  • 在多可用区构成的集群下,业务可以指定可用区部署。
  • 多可用区部署可以减少可用区资源不足带来的故障问题。

通过存储多可用区部署优化,可以帮您最大限度地减少应用发布中断,确保关键业务系统和应用在各种故障情况下能持续运行。

前提条件

  • 您已创建一个安装CCE容器存储(Everest)的集群,并且集群版本≥1.21。若没有可用集群 ,请参照购买Standard/Turbo集群创建。
  • 集群的节点至少分布在三个不同的可用区,若当前集群的节点分布尚未覆盖三个可用区,请参照创建节点创建节点池在未部署的可用区中创建新节点。

操作步骤

  1. kubectl连接集群,具体请参见kubectl连接集群
  2. 创建存储类StorageClass的Yaml文件。

    vi storageclass.yaml

    向storageclass.yaml中填入以下内容,该内容仅是StorageClass配置的模板,您可以根据需求自行修改。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: test-disk-topology-alltype
    provisioner: everest-csi-provisioner
    parameters:
      csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
      csi.storage.k8s.io/fstype: ext4  
      everest.io/disk-volume-type: SAS #表示高I/O类型云硬盘 
      everest.io/passthrough: "true"
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    表1 StorageClass部分参数说明

    参数

    说明

    provisioner

    存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。

    parameters

    存储参数,不同类型的存储支持的参数不同。详情请参见parameters参数说明

    须知:

    everest.io/disk-volume-type表示云硬盘类型,有多种选择。

    • SAS:高I/O。
    • SSD:超高I/O。
    • GPSSD:通用型SSD。
    • ESSD:极速型SSD。
    • GPSSD2:通用型SSD v2,everest版本为2.4.4及以上支持使用,使用时需同时指定everest.io/disk-iops和everest.io/disk-throughput注解。
    • ESSD2:极速型SSD v2,everest版本为2.4.4及以上支持使用,使用时需指定everest.io/disk-iops注解。

    reclaimPolicy

    用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass对象被创建时没有指定reclaimPolicy,它将默认为Delete。

    • Delete:表示动态创建的PV,在PVC销毁的时候PV也会自动销毁。
    • Retain:表示动态创建的PV,在PVC销毁的时候PV不会自动销毁。

    allowVolumeExpansion

    定义由此存储类创建的PV是否支持动态扩容,默认为false。是否能动态扩容是由底层存储插件来实现的,这里只是一个开关。

    volumeBindingMode

    表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。

    • Immediate:创建PVC时完成PV绑定和动态创建。
    • WaitForFirstConsumer:延迟PV的绑定和创建,当在工作负载中使用该PVC时才执行PV创建和绑定流程。

  3. 创建StorageClass。

    kubectl create -f storageclass.yaml

  4. 创建StatefulSet的Yaml文件。

    vi statefulset.yaml

    向statefulset.yaml文件中填入以下内容,该内容仅是标准StatefulSet应用配置的模板,您可以根据需求自行定义。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx 
    spec:
      replicas: 3
      serviceName: "nginx"
      selector:
        matchLabels: 
          app: nginx
      template:
        metadata:
          labels: 
            app: nginx
        spec:
          topologySpreadConstraints:
          - labelSelector:   # 用于查找匹配的Pod,对匹配此标签选择器的Pod进行计数,以确定其相应拓扑域中的Pod数量
              matchLabels:
                app: nginx
            maxSkew: 1       # 表示在给定的拓扑类型中,任意两个拓扑域上匹配的Pod数量所允许的最大差异
            topologyKey: topology.kubernetes.io/zone    # 表示节点标签的键
            whenUnsatisfiable: DoNotSchedule    # 表示当Pod不满足传播约束时,调度器处理该Pod的方式
          containers:
          - image: nginx:latest
            name: nginx
            env:
            - name: NGINX_ROOT_PASSWORD
              value: "nginx"
            volumeMounts: 
            - name: disk-csi
              mountPath: /var/lib/nginx
          imagePullSecrets:
          - name: default-secret
          tolerations:
          - key: "app"
            operator: "Exists"
            effect: "NoSchedule"
      volumeClaimTemplates:    # 根据指定的Replicas数量自动创建对应数量的云硬盘,便于快速扩展
      - metadata:
          name: disk-csi
        spec:
          accessModes: [ "ReadWriteOnce" ]   # 云硬盘只支持以读写模式被单个节点挂载和访问,即ReadWriteOnce
          storageClassName: test-disk-topology-alltype
          resources:
            requests:
              storage: 40Gi
    表2 StatefulSet部分参数说明

    参数

    说明

    topologySpreadConstraints

    拓扑分布约束,用来控制Pod在集群内拓扑域之间的分布,如区域、可用区、节点和其他用户自定义拓扑域。了解更多信息,请参见Pod 拓扑分布约束

    topologySpreadConstraints.labelSelector

    用于查找匹配的Pod。对匹配此标签选择器的Pod进行计数,以确定其相应拓扑域中的Pod数量。

    topologySpreadConstraints.maxSkew

    表示在给定的拓扑类型中,任意两个拓扑域上匹配的Pod数量所允许的最大差异。这个值用来衡量Pod分布的不均匀程度,且取值必须大于0。

    topologySpreadConstraints.topologyKey

    表示节点标签的键。当两个节点都使用此键标记且标签值相同时,调度器会认为这两个节点处于相同的拓扑中,调度器试图向每个拓扑域放入数量均衡的Pod。

    topologySpreadConstraints.whenUnsatisfiable

    表示当Pod不满足传播约束时,调度器处理该Pod的方式。whenUnsatisfiable有两种取值:

    • DoNotSchedule(默认):当Pod不满足传播约束时,不调度该Pod。
    • ScheduleAnyway:当Pod不满足传播约束时,仍然调度该Pod,并且优先考虑最小化偏斜的节点。

    volumeClaimTemplates

    根据指定的Replicas数量自动创建对应数量的云盘,便于快速扩展。

  5. 创建StatefulSet应用。

    kubectl create -f statefulset.yaml

配置验证

验证动态创建的存储卷(PV)是否跟随Pod实例部署在不同可用区。

  1. 通过以下命令查看新建的PV。

    kubectl get pv

    回显如下,其中前3条为随Pod实例动态创建的PV。

    NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS                 VOLUMEATTRIBUTESCLASS   REASON   AGE
    pvc-699eda75   40Gi       RWO            Delete           Bound    default/disk-csi-nginx-0   test-disk-topology-alltype   <unset>                          132m
    pvc-6c68f5a7   40Gi       RWO            Delete           Bound    default/disk-csi-nginx-1   test-disk-topology-alltype   <unset>                          131m
    pvc-8f74ce3a   40Gi       RWO            Delete           Bound    default/disk-csi-nginx-2   test-disk-topology-alltype   <unset>                          131m
    pvc-f738f8aa   10Gi       RWO            Delete           Bound    default/pvc                csi-disk                     <unset>                          6d4h

  2. 根据PV名称查看PV所在的可用区。

    kubectl describe pv pvc-699eda75 pvc-6c68f5a7 pvc-8f74ce3a | grep zone

    回显如下,由结果可知3个PV分别位于不同可用区,实现存储多可用区部署。

    Labels:            failure-domain.beta.kubernetes.io/zone=cn-east-3d
        Term 0:        failure-domain.beta.kubernetes.io/zone in [cn-east-3d]
    Labels:            failure-domain.beta.kubernetes.io/zone=cn-east-3b
        Term 0:        failure-domain.beta.kubernetes.io/zone in [cn-east-3b]
    Labels:            failure-domain.beta.kubernetes.io/zone=cn-east-3c
        Term 0:        failure-domain.beta.kubernetes.io/zone in [cn-east-3c]

相关文档