存储多可用区部署的推荐配置
应用场景
- 在多可用区构成的集群下,业务可以指定可用区部署。
- 多可用区部署可以减少可用区资源不足带来的故障问题。
通过存储多可用区部署优化,可以帮您最大限度地减少应用发布中断,确保关键业务系统和应用在各种故障情况下能持续运行。
前提条件
- 您已创建一个安装CCE容器存储(Everest)的集群,并且集群版本 ≥ 1.21。若没有可用集群 ,请参照购买Standard/Turbo集群创建。
- 集群的节点至少分布在三个不同的可用区,若当前集群的节点分布尚未覆盖三个可用区,请参照创建节点或创建节点池在未部署的可用区中创建新节点。
操作步骤
- kubectl连接集群,具体请参见kubectl连接集群。
- 创建存储类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 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创建和绑定流程。
- 创建StorageClass。
kubectl create -f storageclass.yaml
- 创建StatefulSet的Yaml文件。
vi statefulset.yaml
向statefulset.yaml文件中填入以下内容,该内容仅是标准StatefulSet应用配置的模板,您可以根据需求自行定义。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: serviceName: "nginx" selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: topologySpreadConstraints: - labelSelector: matchLabels: app: nginx maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway containers: - image: nginx:latest name: nginx env: - name: NGINX_ROOT_PASSWORD value: "nginx" volumeMounts: - name: disk-csi mountPath: /var/lib/nginx tolerations: - key: "app" operator: "Exists" effect: "NoSchedule" volumeClaimTemplates: - metadata: name: disk-csi spec: accessModes: [ "ReadWriteOnce" ] storageClassName: test-disk-topology-alltype resources: requests: storage: 40Gi
表2 StatefulSet部分参数说明 参数
说明
topologySpreadConstraints
尽量让高可用的Pod分布在不同的可用区。
topologySpreadConstraints.labelSelector
用于查找匹配的Pod。对匹配此标签选择器的Pod进行计数,以确定其相应拓扑域中的Pod数量。
topologySpreadConstraints.maxSkew
表示在给定的拓扑类型中,任意两个拓扑域上匹配的Pod数量所允许的最大差异。这个值用来衡量Pod分布的不均匀程度,且取值必须大于0。
topologySpreadConstraints.topologyKey
表示节点标签的键。当两个节点都使用此键标记且标签值相同时,调度器会认为这两个节点处于相同的拓扑中。调度器试图向每个拓扑域放入数量均衡的Pod。
topologySpreadConstraints.whenUnsatisfiable
表示当Pod不满足传播约束时,调度器处理该Pod的方式。whenUnsatisfiable有两种取值:
- DoNotSchedule(默认):不调度该Pod。
- ScheduleAnyway:仍然调度该Pod,并且优先考虑最小化偏斜的节点。
volumeClaimTemplates
根据指定的Replicas数量自动创建对应数量的云盘,便于快速扩展。
- 创建StatefulSet应用。
kubectl create -f statefulset.yaml
配置验证
以下步骤均满足,则说明配置成功。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧选择“工作负载”,上方选择“有状态负载”,目标工作负载状态为运行中。
图1 检查目标工作负载状态
- 在左侧选择“存储”,上方选择“存储卷声明”,SC名称为test-disk-topology-alltype对应的PVC状态为已绑定。
图2 检查PVC状态
- 上方选择“存储卷”,SC名称为test-disk-topology-alltype对应的PV状态为已绑定。
图3 检查PV状态
- 在PV的操作列单击“查看YAML”,检查PV的YAML文件中是否存在可用区信息。
图4 检查PV可用区