通过存储多可用区部署优化,可以帮您最大程度的减少应用发布中断,确保关键业务系统和应用在各种故障情况下能持续运行。本文为您介绍存储在多可用区部署时的推荐配置。
虽然 Kubernetes 简化了应用分发部署的流程,但隐藏底层硬件逻辑让用户很难感知具体的硬件逻辑,由此可能导致一些非预期的情况,导致应用发布中断受阻。例如:应用实际部署可用区与期望不一致、创建云盘时报错磁盘无效、挂载应用时报错不支持磁盘类型、调度应用时报错提示节点亲和冲突等。
存储多可用区部署方案,可以指定可用区部署业务,减少可用区资源不足带来的故障问题,能够最大程度减少上述问题,保证业务稳定运行。
存储多可用区部署方案的推荐配置如下:
存储多可用区部署方案,推荐创建包含三个可用区的集群,以确保节点、存储、应用资源能够分布在不同可用区,提高容灾能力。
本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建集群。
配置项 | 说明 |
---|---|
私有网络 | 私有网络为集群提供一个隔离的、自主配置和管理的虚拟网络环境。本场景推荐选择子网涵盖多个可用区的私有网络。 |
Pod 子网 | 供 Pod 使用的网络,为了保证 Pod 在多可用区中部署,本场景推荐同时选择多个可用区中的 Pod 子网。 |
存储多可用区部署方案,推荐每个节点使用单一可用区。因此,创建节点池时,需要确保每个节点池对应各自不同的可用区。本场景依次创建 3 个可用区,每个节点池分别占用不同的可用区。
本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建节点池。
配置项 | 说明 |
---|---|
弹性伸缩 | 根据 Pod 的调度状态以及集群内节点资源的使用情况,对集群进行自动扩容或缩容。本场景推荐开启节点池的弹性伸缩功能。更多详细介绍参见:节点弹性伸缩。 |
可用区 | 可用区是同一地域下电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离,本场景推荐每个节点池使用单一可用区。 |
计算规格 | 本场景推荐在多可用区内尽量使用同一类型的 ECS 资源,或者支持同一种类型块存储的 ECS 资源。 |
系统云盘/数据盘 | 本场景推荐优先选择 ESSD 云盘,更多详细介绍参见:云盘规格。 |
节点污点 | 本场景推荐对节点池上的所有节点池进行污点配置,确保不会有其他非预期应用被调度过来影响当前应用。 |
存储多可用区部署方案,推荐使用云盘类型的动态存储卷,因为云盘存储的性能更加稳定,数据传输带宽也更好。
说明
以下提供 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 | 存储参数,不同类型的存储支持的参数不同。
|
reclaimPolicy | 云盘的回收策略,包括:Delete、Retain。如果数据安全性要求高,推荐使用 Retain 方式以免误删数据。
|
allowVolumeExpansion | 定义由此存储类创建的 PV 是否支持动态扩容,本场景推荐 true。 |
volumeBindingMode | 云盘的绑定模式。包括:
|
存储多可用区部署方案,推荐将应用分布至各个可用区的各个节点,最大程度的减少应用发布中断。
说明
以下仅提供 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。
|
volumeClaimTemplates | 根据指定的 Replicas 数量自动创建对应数量的云盘,便于快速扩展。 |