You need to enable JavaScript to run this app.
导航
存储多可用区部署推荐配置
最近更新时间:2024.10.08 14:15:13首次发布时间:2024.10.08 14:15:13

通过存储多可用区部署优化,可以帮您最大程度的减少应用发布中断,确保关键业务系统和应用在各种故障情况下能持续运行。本文为您介绍存储在多可用区部署时的推荐配置。

背景信息

虽然 Kubernetes 简化了应用分发部署的流程,但隐藏底层硬件逻辑让用户很难感知具体的硬件逻辑,由此可能导致一些非预期的情况,导致应用发布中断受阻。例如:应用实际部署可用区与期望不一致、创建云盘时报错磁盘无效、挂载应用时报错不支持磁盘类型、调度应用时报错提示节点亲和冲突等。

存储多可用区部署方案,可以指定可用区部署业务,减少可用区资源不足带来的故障问题,能够最大程度减少上述问题,保证业务稳定运行。

推荐配置

存储多可用区部署方案的推荐配置如下:

  • 推荐集群内包含三个可用区,以确保节点和存储资源满足需求。
  • 推荐使用云盘进行持久化存储,因为云盘相对于 NAS 存储更加稳定,数据传输带宽更好。
  • 推荐使用高可用类型的云盘,避免云盘挂载失败,发生单点故障。
  • 当集群可用区内的节点均不可用时,建议立即弹出节点进行匹配。
  • 确保应用可以均匀分配至各个可用区、各个节点。

操作步骤

步骤一:创建包含三个可用区的集群

存储多可用区部署方案,推荐创建包含三个可用区的集群,以确保节点、存储、应用资源能够分布在不同可用区,提高容灾能力。

  1. 登录 容器服务控制台
  2. 在集群管理页面的左侧导航栏,选择 集群
  3. 在集群列表页面,单击左上角 创建集群,配置创建集群所需的参数。

alt

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建集群

配置项说明
私有网络私有网络为集群提供一个隔离的、自主配置和管理的虚拟网络环境。本场景推荐选择子网涵盖多个可用区的私有网络。
Pod 子网供 Pod 使用的网络,为了保证 Pod 在多可用区中部署,本场景推荐同时选择多个可用区中的 Pod 子网。

步骤二:根据推荐配置创建节点池

存储多可用区部署方案,推荐每个节点使用单一可用区。因此,创建节点池时,需要确保每个节点池对应各自不同的可用区。本场景依次创建 3 个可用区,每个节点池分别占用不同的可用区。

  1. 登录 容器服务控制台
  2. 在容器服务的左侧导航栏,选择 集群
  3. 在集群列表,单击需要创建节点池的目标集群名称。
  4. 在集群管理页面的左侧导航栏,选择 节点管理 > 节点池
  5. 单击节点池列表左上角的 创建节点池,根据实际需求选择合适的节点池类型,完成后单击 确定
  6. 在创建节点池页面,根据实际情况配置节点池相关参数。

alt

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建节点池

配置项说明
弹性伸缩根据 Pod 的调度状态以及集群内节点资源的使用情况,对集群进行自动扩容或缩容。本场景推荐开启节点池的弹性伸缩功能。更多详细介绍参见:节点弹性伸缩
可用区可用区是同一地域下电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离,本场景推荐每个节点池使用单一可用区。
计算规格本场景推荐在多可用区内尽量使用同一类型的 ECS 资源,或者支持同一种类型块存储的 ECS 资源。
系统云盘/数据盘本场景推荐优先选择 ESSD 云盘,更多详细介绍参见:云盘规格
节点污点本场景推荐对节点池上的所有节点池进行污点配置,确保不会有其他非预期应用被调度过来影响当前应用。

步骤三:使用高可用类型的云盘创建存储类

存储多可用区部署方案,推荐使用云盘类型的动态存储卷,因为云盘存储的性能更加稳定,数据传输带宽也更好。

  1. 登录 容器服务控制台
  2. 在容器服务的左侧导航栏,选择 集群
  3. 在集群列表,单击目标集群名称,前往集群管理页面。
  4. 在集群管理页面的左侧导航栏,选择 存储管理 > 存储类
  5. 单击 使用 Yaml 创建,输入已经准备的 Yaml 后,单击 确定 开始创建 StorageClass。

说明

以下提供 StorageClass 配置的标准模版,可根据实际需求自行修改。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-disk-essd
parameters:
  ChargeType: PostPaid
  type: ESSD_PL0
  zone: cn-beijing-a
provisioner: ebs.csi.volcengine.com
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:使用云盘动态存储卷

配置项说明
provisioner存储类型,本场景使用 ebs.csi.volcengine.com,表示火山引擎 csi-ebs 存储。

parameters

存储参数,不同类型的存储支持的参数不同。

  • type:云盘存储的类型,目前支持 ESSD_PL0、ESSD_FlexPL,可根据实际需求选择。其中,ESSD_FlexPL 提供外性能扩展,详细配置和说明参见:创建 StorageClass

  • zone:用于选择 EBS 云盘所属的可用区,本场景建议将制作卷的拓扑限制在特定的区域。

reclaimPolicy

云盘的回收策略,包括:Delete、Retain。如果数据安全性要求高,推荐使用 Retain 方式以免误删数据。

  • Delete:删除PVC的时候,PV和云盘会一起删除。

  • Retain:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

allowVolumeExpansion定义由此存储类创建的 PV 是否支持动态扩容,本场景推荐 true。

volumeBindingMode

云盘的绑定模式。包括:

  • Immediate:随存储卷声明的创建直接完成卷的绑定和分配。

  • WaitForFirstConsumer:延迟存储卷的绑定和分配,直到使用该存储卷声明的 Pod 被创建。

步骤四:创建应用并分布在不同可用区

存储多可用区部署方案,推荐将应用分布至各个可用区的各个节点,最大程度的减少应用发布中断。

  1. 登录 容器服务控制台
  2. 在容器服务的左侧导航栏,选择 集群
  3. 在集群列表,单击目标集群名称,前往集群管理页面。
  4. 在集群管理页面的左侧导航栏,选择 工作负载 > 有状态负载
  5. 单击 使用 Yaml 创建,输入已经准备的 Yaml 后,单击 确定 开始创建 StatefulSet。

说明

以下仅提供 StatefulSet 配置的标准模版,您可以根据实际需求自行修改。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
  namespace: default
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: sc-disk-essd
      resources:
        requests:
          storage: 40Gi

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建有状态负载

配置项说明

topologySpreadConstraints

尽量让高可用的 Pod 分布在不同的可用区,更多详细说明参见:Topology Spread Constraints

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

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

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

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

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