在互联网相关的业务中,高弹性是经常被提及的一个架构设计目标,前两个我就遇到一个客户要求我们帮忙设计一个高弹性的架构以承载他们周期性暴增的业务压力,客户90%以上的业务压力都集中在业务高峰期,因此在设计这个架构之初,我和客户就在纠结,到底是采用更熟悉的“堆”服务器的思路呢,还是采取更具弹性的容器化的方案呢?其实作为一个技术人员,在问这个问题的时候就已经有确定的答案了,最终我们设计出了这样的一个架构:
容器平台选择阿里云的ACK(阿里云容器服务Kubernetes版)。其中ACK 分成专有版和托管版,区别是专有版的管控节点需要用户自行准备,而托管版使用阿里云的资源进行资源管控,在托管版中又分成标准版和Pro版,其中Pro版有确定的SLA保障,生产系统建议选择Pro版。同时为了保障worker节点的信息安全,建议为充当worker节点的ECS配置云安全中心服务进行主机安全防护。
除了ACK,阿里云还提供无服务器架构的ASK,区别是ACK有ECS服务器充当worker节点,创建POD所需的资源通过ECS进行分配,而ASK没有worker节点,ASK直接在阿里云的共享资源池中通过ECI(弹性容器节点)来分配资源创建POD。
在这个项目中为了保证始终有一定量的稳定资源供给,我们决定使用ACK再结合阿里云的ECI来实现资源的弹性供给。ECI资源的申请和释放可通过ACK的ack-virtual-node插件来自动完成,动态增加的POD将自动运行在ECI之上。
这里的POD是Kubernetes的基本资源调度单元,由一组紧密联系的容器所组成,POD的功能类似于虚拟化平台的VM。
ECI 是阿里云的弹性容器实例,通过安全容器沙箱技术在共享资源池按照用户要求分配所需的资源进行容器创建,Kubernetes集群在使用ECI时可通过在yaml文件中指定资源需求直接创建所需规格的POD。
考虑到业务高峰期和平时存在巨大的使用量落差,选择使用按流量的方式购买网络带宽资源,并通过购买共享流量包将所有的网络流量进行集中抵扣。这个项目所用到的网络流量主要有如下三个:
- 进入的业务流量、Kubernetes集群正常情况下通过Ingress接受来自外界的服务器请求,阿里云默认情况下将所有的Ingress绑定到一个SLB上实现负载平衡和高可用,因为要承载业务服务器请求,因此建议这个SLB选择尽可能高的规格。通过Kubernetes的服务发现和负载均衡机制,业务流量进入负载均衡后会被自动分配到由ECS和ECI节点所创建的POD之上。
- POD对外部接口的访问和容器镜像的拉取、POD中的业务系统当需要对外部接口和服务进行调用时,需要通过NAT网关进行地址转换以访问外部服务,另外在ECI节点创建POD时,需要从镜像仓库拉取容器镜像,镜像的拉取也需要NAT网关进行地址转换,NAT网关在进行地址转换时需要绑定一个EIP,从外部服务看,所有的请求皆来自该EIP。为了加快容器镜像的拉取速度和安全性,还可以考虑购买阿里云的容器镜像服务。
- 集群的管控流量、默认情况下阿里云ACK在创建集群时会创建一个内网SLB来接受管控流量,假如需要在公网对集群进行管控可以通过将EIP弹性公网IP绑定到这个内外SLB上来实现远程管理,集群的管控流量相对不大,因此该SLB选择最低规格即可。
鉴于ECI节点上服务的启动需要一定的时间,而业务流量可能瞬间到达峰值,因此通过MQ来缓冲瞬时的业务压力,为运行在ECI弹性资源上的服务争取启动时间。
阿里云MQ服务根据访问协议的不同分成RocketMQ、AMQP、Kafka三个系列,对于海量的业务交易场景建议选择经过双十一检验的RocketMQ系列,在RocketMQ系列中又分成普通版和企业铂金版两个版本,企业铂金版采用独享硬件资源,能够更充分的保障峰值吞吐能力,对于瞬时业务峰值高的业务,建议尽可能选择铂金版。
数据库采用云原生数据库PolarDB,PolarDB可以从2个节点扩容到16个节点,单节点可升级至88核710G规格,集群采用分布式共享存储架构,单个集群可存储100TB的数据,有赖于其采用分布式共享存储的架构,PolarDB集群增加节点时无需进行大量的数据拷贝,因此可以在分钟级完成集群的横向扩容。
我觉得这个架构对于大多数“腰部”级别的互联网行业客户都是适用的,因此分享出来,希望对大家有所帮助。