1 项目背景
随着业务创新的加速和互联网规模的不断扩张,云原生应用架构因其灵活、快速迭代的特点应运而生。容器的敏捷、高效、弹性等特点实现了软件交付流程的标准化,一次构建,随处部署,是云原生应用的基石。金融行业作为数字化转型的重要阵地,近几年积极拥抱新技术,并取得了显著的进展。随着应用容器化部署,如何保证业务的高可用性,确保容器存储的安全可靠成为大家关注的重点。
基于我行容器持久化存储需求,本文探索容器持久化存储双活建设,构建本地双活+异地异步复制容灾架构,实现业务数据零丢失、业务零中断,保障客户业务连续运行。2 容器持久化存储
2.1 容器持久化存储需求
容器镜像数据存储:容器云平台建立私有镜像仓库,用于存储各应用系统的镜像、依赖、执行文件等数据,实现容器云平台从私有镜像库中拉取镜像。
应用系统数据共享:不同应用系统有数据上下游传输或共享文档读取需求,需要持久化存储提供文件系统满足上述需求。
静态资源数据存储:用于存储系统运行所需要的静态加载资源文件,例如:视频、图片、配置文件等。
系统日志数据存储:部分系统有日志类数据持久化存储需求,日志类数据先写入节点本地存储,然后再转存到持久化存储上以避免日志丢失。
2.2 存储双活需求
2.3 存储双活建设挑战
在容器的使用场景,通常会有非常多的Pod或者在Pod上会挂载较多的卷,需要消耗一定的资源,特别如今云原生时代,非常适合要求轻量、快速的容器云平台,一分钟内就能启动上百个pod,对存储IO性能,并发创建能力也有很高要求。3 容器持久化存储双活实践
3.1 容器存储选型
3.1.1 为何选择NAS存储
块存储:使用服务器本地存储或SAN存储,难以实现Pod跨节点漂移;当存储容量不足时,难以快速实现容量扩容;应用高可用能力依靠应用层自身实现,难以实现跨站点容灾能力。
对象存储:金融行业的存储需要首先保证读写性能,对象存储适合存储大容量只读数据,难以提供高性能数据读写服务。
文件存储:文件存储支持RWX访问模式,天然适合无状态应用访问,同时具备多租户能力、漂移速度快、灾备能力强等优势适合部署有状态应用。
综合以上分析,我行选择主要使用NAS存储作为容器存储,以适应Pod漂移需求和文件共享需求。
3.1.2 为何选择集中式NAS存储
集中式NAS存储通过Raid、冗余存储机头等自身高可用能力提供更稳定的存储服务,具备快照、克隆、灾备等高级功能提升可用性和资源利用率。同时,集中式存储效率高、延迟低,更符合金融行业业务需求。因此,我行容器存储选择使用华为OceanStor Dorado系列集中式存储
3.1.3 为何选择华为NAS存储
华为NAS存储具有业界最高性能,满足更多高并发业务场景需求,结合华为自研CSI(Container Storage Interface,容器存储接口)插件实现全面提升容器资源的发放效率,使容器存储资源随容器部署自动化发放;结合CDR(Container Disaster Recovery,容器容灾)插件,实现容器内应用的同集群和跨集群容灾能力,保障容器持久化数据的可靠性和安全性。
3.2 容器存储关键技术
3.2.1 CSI插件
CSI插件用于将NAS存储暴露给Kubernetes容器平台上的容器工作负载,实现容器存储资源随集群同步敏捷扩展。K8s将存储管理相关功能独立成多个Sidecar容器组件,通过与存储厂商实现的CSI Plugin容器组成Pod实现相应功能。当有存储需求时,这些组件监听K8s相关的事务变化,通过调用CSI Driver实现具体的存储操作。CSI组件设计如下图所示。
由Kubernetes 社区开发和维护的组件包括Driver
Registrar、External Provisioner、External Attacher等,对应从 K8s项目里面剥离出来的部分存储管理功能,各组件具体功能为:
Driver Registrar:负责将插件注册到 Kubelet,Driver Registrar 需要请求 CSI 插件的 Identity 服务来获取插件信息。
External-Provisioner:负责处理Persistent Volume Claim (PVC) 的创建和删除请求。
External-Attacher:负责处理卷的附加(attach)和分离(detach)操作,本质是将存储设备与主机实现关联。
External-Snapshotter:负责管理数据卷快照的创建、列表和删除操作。
External-Resizer:负责扩展存储卷的大小。
由存储厂商开发和维护的组件包括CSI Identity、CSI Controller和CSI Node,各组件具体功能为:
CSI Identity:CSI
Identity 服务,负责对外暴露这个插件本身的信息。
CSI Controller:以Deployment方式单独运行的一个Pod,用于和存储交互,用于存储卷的生命周期管理,包括在存储侧对资源进行创建、删除、快照等操作。
CSI Node:以DaemonSet方式运行在Kubernetes工作节点上,用于在工作节点上对华为存储提供的文件系统资源进行挂载、卸载、格式化等操作。
3.2.2 CDR插件
CDR是华为针对K8s场景的容器应用容灾插件,该插件将华为存储文件系统、备份容灾等数据管理特性与容器应用结合,对K8s中容器及持久化数据进行备份,从而提升容器应用的可用性。容器应用的持久化数据存储在后端存储文件系上,配置文件数据存储在K8s的ETCD数据库中,CDR支持对持久化数据和ETCD数据的应用级容灾保护,也支持对于持久化数据的数据级容灾保护。
备份流程:
使用CDR选择有备份需求的应用或命名空间,备份的应用通过命名空间、标签等进行筛选;
使用快照技术实现持久化数据备份,支持本地同存储、本地跨存储、跨集群备份,利用远程复制将快照同步到备份存储系统;
可手动、定时备份,可设置备份频率、保留副本数等备份策略;
将容器应用中的配置数据在NFS备份存储上完成备份。
恢复流程:
3.3 容器持久化存储双活方案
结合上述容器持久化存储需求,同时考虑现有企业级NAS存储能力,我行选择华为集中式存储作为容器持久化存储。同时,考虑到目前我行存储双活建设难点,为提高容器持久化存储可用性,建设本地存储双活和异地异步复制容灾架构,消除单点故障,提升容器云数据安全。
3.3.1 组网架构
(1)本地双活
容器持久化存储本地双活方案基于华为OceanStor Dorado存储和HyperMetro双活特性,实现同数据中心本地NAS双活。两台NAS存储实现跨机房部署,K8s生产集群通过华为CSI插件对接后端持久化存储,通过CDR插件实现同集群容器备份和恢复。
(2)异地异步复制容灾
异地异步复制容灾组网基于华为OceanStor Dorado存储和HyperReplication远程复制特性。异地容灾数据中心部署一台存储和K8s集群,灾备存储与生产站点其中一台存储组成远程复制关系。
本方案依靠Dorado存储自身及高可用性解决存储组件级故障;依靠K8s平台和CSI插件实现Pod漂移能力和平台自身高可用性,解决应用级故障;通过存储AA双活能力实现数据均衡分布与本地两个站点并解决存储级故障;通过存储异步复制能力实现应用和存储容灾能力,解决站点级故障。
3.3.2 存储特性
(1)双活特性
具备双活特性的两台存储设备均处于运行状态且互为备份,当其中一台存储发生故障时,业务自动切换至另一台存储。在容器场景下,容器持久化数据会同时写入两台NAS存储。创建双活Pair前需配置双活租户Pair,双活仲裁以双活租户Pair为单位,在该双活租户Pair中的双活发生故障时,确保该Pair中租户下的所有文件系统的仲裁结果均保持一致,以及保证文件系统运行所依赖的环境在两个租户之间保持一致。
在为存储配置前端逻辑端口时,需要配置逻辑端口归属于其中一个站点,该逻辑端口在此站点上为已连接状态。当建立双活租户Pair后,归属于对端站点的逻辑端口配置信息会自动同步到本端站点,状态为待工作状态。当前端业务系统发生故障时,存储会自动挂载对端待工作逻辑端口。
(2)异步复制特性
文件存储支持建立远程复制Pair和远程复制租户Pair。远程复制Pair指主文件系统和从文件系统建立数据复制关系,数据由主文件系统通过复制链路复制到从文件系统。远程复制租户Pair是基于租户粒度的数据同步,会同步文件系统数据、文件系统配置数据和租户配置数据。
在异步复制模式下,主机对主文件系统进行写操作,只要主端Cache写成功,存储系统即向主机返回写请求成功。文件系统的远程复制依赖快照技术,通过记录I/O日志的方式获取差异数据或通过前后两次同步周期的快照对比获取增量差异数据,周期性地向从存储写入增量数据。
3.3.3 本地存储单活转双活
由于我行容器云已经对接一台NAS存储,建设本地存储双活涉及单活存储转双活存储。通过与厂商沟通与论证,对于已经部署业务但使用单台存储对接容器平台的应用场景,可以通过在线转换的方式,实现单活存储场景转换为双活存储场景。
基于上述需求,我行对华为存储的单活存储扩展双活存储能力进行测试,具体测试步骤如下:
(1)在Pod中使用Vdbench工具下发业务。
(2)存储上配置双活域,对当前使用的租户创建双活租户Pair,完成双活逻辑端口配置。
(3)Kubernetes上删除单存储Backend,修改原Backend为双活Backend并重新创建。
(4)在存储上对PVC对应的卷手动创建双活Pair。
(5)过程中持续观察Vdbench业务情况。
(6)重启PVC使用的存储,模拟存储故障,观察Vdbench业务情况。
经测试验证,在原存储上成功配置双活域,完成双活租户Pair创建和双活逻辑端口配置。成功修改原Backend为双活Backend,成功创建双活Pair。在模拟单台存储故障的场景下,业务短暂归零,无中断影响。
在基于华为CSI可以从对接单存储扩展到对接双活存储系统的前提下,对以下双活功能场景、非功能场景能力进行验证。
在容器场景下,针对双活存储功能进行转换测试,对双活存储的PVC ReadWriteMany共享、PVC动态扩容、PVC快照等方面进行验证,确保单活转为双活后双活存储的功能可用性。
在容器场景下,针对双活存储可靠性进行验证,验证当复制链路、存储系统故障等场景下,CSI插件对故障切换能力。主要测试项涉及:双活存储系统故障、双活复制链路故障、仲裁服务器故障、仲裁服务器链路故障等故障场景。
在非容器环境下,验证双活存储功能,验证华为存储可以在线将NAS双活切换为NAS异步复制、在线将NAS双活切换为NAS异步复制。
3.3.4 对接容器云
我行单个K8s生产集群对接两个后端双活存储,在生产集群部署一套应用系统,后端对接两套存储,通过CSI插件实现双活持久卷发放和写入。通过配置StorageClass定义如何创建和管理存储资源,当用户提交PVC请求时,Kubernetes根据配置的StorageClass自动创建和绑定PV到PVC,实现PV的自动发放。容器通过CSI对接实现PV的自动发放,从而提高了存储资源的管理效率和灵活性。结合动态存储资源的分配和管理,以及Deployment控制器的滚动更新功能,实现了应用的不停在线扩容需求。
3.4 跨中心存储双活
不同数据中心存在二层网络不通的问题,在三层网络场景下逻辑端口漂移后会发送ARP消息,由于ARP消息无法在三层网络传播,导致主机无法感知逻辑端口MAC地址的变化,继续往故障站点发消息,从而导致业务中断。目前有两类方法可以实现三层网络跨中心双活:1. 通过BGP协议对现有网络改造构建大二层网络实现ARP消息在三层网络无法传播;2.通过NFS+客户端建立不同数据中心业务系统到存储的多条链路,在客户端出现IO超时后,NFS+客户端会主动将路径切换到其他可用链路从而实现跨数据中心三层网络双活。目前上述方案还未在我行双活实践中验证有效性,目前作为未来发展方向有待进一步探索。4 容器持久化存储双活实施效果
(1)高可用性
同中心双活NAS存储高可用架构的实现,可保证在单存储设备故障的场景下业务数据及访问能力均不受影响,存储服务可用性能力提高到6个9的水平,极大的提升了云数据安全。
(2)连续性
建立本地双活和异地远程复制容灾架构,满足RTO≈0,RPO=0的业务需求,实现任一站点故障时,数据零丢失,业务零中断,保障业务连续性。
(3)降低运维成本
通过构建本地双活NAS存储,实现存储发生故障时的业务快速切换,降低单点故障带来的运维工作量。5 总结
本文主要介绍我行在容器持久化存储双活建设和异地容灾建设中的实践分享。首先基于我行容器持久化存储需求、存储双活需求以及我行存储双活建设难点,确定了容器持久化存储选型以及本地双活+异地异步复制容灾的建设架构。基于华为OceanStor Dorado存储,结合存储双活特性、异步复制特性、CSI插件、CDR插件等,实现全面提升容器资源的发放效率,提供集群内以及跨集群的容灾能力,保障了容器数据持久化可靠性,不断提升业务连续性水平。
参与用户协作反馈:
毛 凯 某股份制银行 容器云工程师
林剑凡 股份制银行 容器工程师
段国彬 中原银行 云原生工程师
张 立 股份制银行 容器云负责人
李 容 某银行 存储架构师
顾问审核专家:
王 畅 某金融单位 容器云专家
如有任何问题,可点击文末阅读原文,到社区原文下评论交流
觉得本文有用,请转发或点击“在看”,让更多同行看到