1.2.1 敏捷基础设施
不管是传统应用,还是云原生应用,打包好的部署包(jar、war、镜像)最终都要部署在应用服务器上运行,应用服务器越来越朝着轻量化的方向发展(如图1-2所示),轻量化意味着更好的弹性、更短的启动时间。
▲图1-2 轻量化的IT应用服务器发展趋势
作为云原生应用的底座,敏捷基础设施主要为了解决传统基础设施所面临的挑战,包括以下几个方面。
(1)资源利用率低。传统基础设施的应用服务器一般由小型机、x86服务器、虚拟机等组成,因为缺乏弹性伸缩能力,所以为了确保业务的平稳运行,IT部门一般会按业务高峰期的流量并加上一定的富余,以此作为预估策略来配置服务器资源。然而业务高峰期可能只存在很短的时间,大部分业务平峰期或者业务低峰期期间,机器资源的利用率是非常低的,造成了资源浪费。
(2)资源扩容周期长。新业务上线或者已有业务规模变大时,为了确保业务的隔离,一般无法共享已有的服务器资源,需要采购新服务器,一般会在企业内部走层层审批流程,采购部署的周期长,效率低下。云带给开发运维人员最直观的感受就是不需要每年做大量的资源规划了,大家可以共享一个资源池。
(3)服务器数量暴增。由于微服务等应用架构的实施,单体架构下的服务器被拆分为虚拟机或容器,导致需要管理的节点数呈爆发性增长,传统的IT运维管理方式面临巨大的挑战。当应用节点个数达到成千上万的规模时,靠传统的单个节点监控运维的方式基本是不现实的,需要自动化批量化的工具来统一管理。
(4)缺乏标准化。开发、测试、生产等不同环境的配置靠人工维护,人为误操作的风险使线上变更引发故障的可能性大大增加(根据墨菲定律,可能出错的事总会出错),“人工操作”是不可靠的,尽可能把应用构建、环境准备、应用部署等过程标准化,通过工具自动化地完成。
正如通过业务代码能够实现产品需求、通过版本化的管理能够保证业务的快速变更一样,基于云原生的开发模式也要考虑如何保证基础资源的提供能够以可编程的方式自动实现需求,并实现记录变更,保证环境的一致性。容器技术真正实现了IaaS的理念落地。通过Dockerfile显式声明定义软件的运行环境,开发人员可以直接将所有的软件和依赖直接封装到容器中,打包成镜像,将应用和运行环境做到很好的统一。通过容器实现开发、测试、生产环境的一致,实现一次编写、到处部署的能力。
基础设施可以将基础设施配置完全当作程序代码来进行,这样做是为了提高效率,因为在整个研发交付环节中,人与人(特别是不同岗位角色的人)之间的沟通是非常浪费时间的,参与沟通的人越少,效率越高。可编程式基础设施可以让一个全栈工程师在没有运维人员参与的情况下,申请生产环境的资源,自动化配置、部署应用。
可编程式基础设施,也意味着开发人员可以更频繁地构建更强可控或更稳定的基础设施,无须运维人员参与,开发人员可以随时拉取一套基础设施来服务于开发、测试、联调和灰度上线等需求。当然,同时要求业务开发具有较好的架构设计,不需要依赖本地数据进行持久化,所有的资源都可以随时拉起、随时释放,同时以API的方式提供弹性、按需的计算和存储能力。这样做的好处是流程简单,速度比以前更快,而且摒弃了烦琐的人工操作。运维人员和开发人员一起以资源配置的应用代码为中心,不再是一台台机器;一切都可以通过工具(DevOps工具)完成,形成标准化变得更容易,比人工操作更可靠。
除了提供计算能力的容器,云环境下的其他基础设施资源(如存储、网络)可以以服务化(如OpenAPI)的方式提供资源申请和管理能力。