八年磨一剑,四大技术视角总结云上应用管理实践
阿里妹导读
背景
算力的生产:由资产采购的模式,变为在线租赁的模式;传统业务上线之前,通常由业务方发起资源采购需求,再由采购部门采购之后交由运维团队装机准备好相应的环境后,再交付给业务团队使用;这通常是一个很漫长的过程,严重影响业务创新的速度。云的出现悄然改变了这一形态,需要的算力资源,可以通过在线服务的方式轻松获得。算力的交付效率从之前的月级别一下降低到秒级。
算力的分配:由人为配给的模式,变为流量配给的模式;算力交付之后,就是将其分配给业务;传统的交付方式通常是整机的方式全部交付给业务方独享,长此以往,资源碎片会越来越大,资源利用率就会越来越低。但是云的形态下,业务使用的资源可以做到按照真实业务的流量和程序的服务能力,通过弹性的方式做到自动调节,也可利用业务对于算力需求时机的不同进行混部,从而有效提升资源使用率。
服务的运维:由专人管专项,变为面向角色的管控方式;如果说以上两点,通过自行搭建一套虚拟化系统外加一些系统调度与编排工具的方式也能做到的话,那么我们所认知的云与虚拟化一个本质的区别就是,在算力层所代表的 IaaS 上是否长出来了可充分发挥基础设施能力的 PaaS 服务。当应用程序所需要的基础设施(计算、网络、存储)以及周边依赖的平台服务(DB、中间件、大数据等)均以类似的服务化的方式提供交付与服务的时候,对应服务的运维也同时交给了云,云透露给我们的运维工作会更加简单,操作界面界面也会随之简化。我们不再需要专业的人去运维专门的事情,只需要面向同一角色人群,授予不同的角色,控制操作的影响范围即可。
如果一切都如我们理想中的样子:算力是无限的、资源永远是充足的。我们可能不需要花费如此长时间来探索。现实与理想总有错配,接下来,我们再来谈几点云与我们常规理解上的认知错配:
物理资源受限:云厂商的算力总归需要依托在数据中心之上,在每一个城市,数据中心的建设总有土地规模的限制,对于常规的业务而言,在建设初期可以暂时忽略算力的规模,但随着业务越来越大,尤其是全民性的大规模算力需求产生时(如:所有零售业在双十一大促场景、AIGC 爆发时等),需要提前跟云厂商进行资源锁定,以防到点买不到资源的情况。为防止这种情况的出现,除了商务上的沟通之外,上规模的业务通常会采用多可用区、异地多活等多活架构,尽量减少物理环境对资源瓶颈的冲击。
算力规格受限:另外一个会限制算力生产的原因是规格,同一种规格不可能无限制的存在,这里的原因是除了本身厂商会将原本有限的算力按照规格进行分配之外。还有一个原因就是厂商会自己会不停的更新换代,每年都会有新的规格和机型,同时也会将一些老的机型进行淘汰。正是由于上面这些原因的存在,在一个存在时长较长的业务集群中,总会出现不同规格的机型混合调度的情况;而不同规格的机型意味着不同的性能基线;不同的性能基线,就会影响同一个应用下不同节点之间计算能力的失衡。
政策导向变化:另外一个会影响算力供给规模就是政策,随着科技自主国策的提出,国家开始要求部分行业在建设自己的信息系统时,需要严格采用我们自主可控的技术,这对于应用而言,基本上从底向上到提出来了明确的要求,对于算力而言,主要是体现在芯片和操作系统上。部分行业已经明确不能采用国外的芯片,所以很多的厂商均推出基于 Arm 架构的自研芯片。操作系统层面,随着 CentOS 的部分版本的停服,国内厂商(如龙蜥、麒麟、统信等)开始涌现。国内芯片的繁荣,带给了我们的用户更低的算力价格的同时。也在倒逼上层应用适配部署在不同芯片、不同的操作系统之上,带来了一定的交付、运维、甚至运行时的复杂性。
视角一:多中心(代表性基础架构)
多可用区下的容灾能力建设
常规的技术架构形态
梳理出中间件(如 Zookeeper 等)各个组件的容灾模型:以 ZooKeeper 为例,为了满足挂掉一个机房也不影响服务的诉求,光有简单的对等部署是不行的,因为无法满足选举 Leader 票数过半的条件,我们推荐的架构方式如下图:
从业务角度梳理出有状态和无状态的应用:其中无状态应用,意味着只需要有一个节点拉起在任意网络畅通的位置,即可对外提供服务,这种方式最为灵活。这也是为什么微服务体系下或者云上的应用中都推荐大家使用无状态应用的原因。而有状态比较容易忽略,比如:游戏场景下,线下玩家和服务器上的房间的关系,通过网络流量严格绑定;再比如 RocketMQ 的 Broker 的消息对于磁盘的依赖。这些情况都需要在灾备切换时根据业务形态做特殊处理。
梳理流量接入和转发:流量接入通常以 DNS 为入口,DNS 解析后对接到一个公网 IP,这个 IP 一般是对外提供的一个负载均衡地址,在发生容灾切换时,有的时候需要对对应的 DNS 做一个全面的切换。但 DNS 通常在切换时有时延,有的客户端会存在 DNS 的缓存,导致切换不生效。安全起见,通常在 DNS 后面搭配一个可切换后端主机的负载均衡,能获得更好的效果。
云服务带来的变化
多可用区下流量管理的变化
多可用区下应用调度的变化
将集群中的节点,分别打上 zone 标签:kubectl label nodes nodeName topology.kubernetes.io/zone=cn-hangzhou-a 同时,kubernetes 引入 topologyKey 的概念,结合 Pod 调度时的 podAntiAffinity,从而达到跨可用区部署的能力 。
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
key: ${appLabel}
operator: In
values:
${labelValue}
topologyKey: topology.kubernetes.io/zone
同样的逻辑,如果我们的应用,比较依赖可用区中的某一类型的资源,也可以在使用类似的方法做了同样的效果,比如:
node.csi.alibabacloud.com/disktype.cloud_ssd: available:依赖具有阿里云 SSD 磁盘的机器
node.kubernetes.io/instance-type: ecs.c6.2xlarge:依赖 c6.2xlarge 规格类型的机器。
kubernetes.io/os: linux:依赖 Linux 操作系统
kubernetes.io/arch: amd64:依赖 Amd64 芯片架构
等等
EDAS中的实践
对于流量管理:EDAS 会默认集成同可用区优先调度的能力,同时支持 Spring Cloud / Dubbo / HSF 这三种服务框架,在服务框架中需要额外扩展的能力(注册过程与路由过程),EDAS 会默认提供。且为了防止可用区资源不对等的情况,EDAS 中还支持设置所分布应用节点的规模阈值,以防止单边可用区节点被打挂的情况,如下图所示:
对于应用调度:将 Kubernetes 调度过程中的调度能力场景化呈现,除了支持自定义的方式之外,我们还抽象出 可用区调度 与 节点调度 两类场景。其中多可用区调度,可尽量满足容灾需求;而跨节点调度,可尽量将应用的不同实例打散到不同的节点,尽量保证 Kubernetes 节点之间的负载均衡。
视角二:一云多芯(代表性基础技术)
指令集与芯片
X86与英特尔
Arm指令集与Arm公司
RISC-V联盟
云的新角色
云上应用管理新的挑战
在软件开发的过程中,需要花费更多的精力去考虑并适配不同的技术栈。
在软件交付的过程中,需要尝试更多的努力在不同技术栈上将性能优化至尽可能一致的水平。
在软件运维的过程中,需要更多的精力与更好的工具维护不同技术栈上的基础设施依赖。
.....
EDAS 中的实践
视角三:弹性(释放技术红利的最短路径)
弹性用云模型
基础资源:用以保证常规低峰业务流量的资源保障。 弹性资源:用来应对突发流量的情况。
场景一:线下资源 与 线上资源
容灾:主要从网络容灾和数据容灾两个方面去看。首先在网络容灾上,线下 IDC 的接入后可当成一个可用区,配合云上的可用区实现同城双活的效果。其次是在数据容灾上,我们还可以将线下的数据,利用线上的存储容量往进行备份,而且备份的副本数量还可以随着接入的云中心的区域进行异地多点备份。
安全:云厂商提供的能力丰富,而且网络接入方式众多,在网络、安全、审计等各个方面都有对应的服务。而如果采用自建 IDC 的话,这些能力都需要自己的研发团队从 0 - 1 进行建设。一些面向互联网的业务,通常在安全(如:防侵入、安全审计等)和网络(如:CDN、DNS等)上有着较高的诉求。这样就诞生出来了一类很典型的架构:利用云上资源和服务作为流量接入能力和安全防护的能力,做完流量清洗并进行操作鉴权之后再转入到 IDC 内的生产区进行服务。
监管:国家对于特定的行业(如金融行业)对于数据安全的要求很高,中国人民银行 2020 年发布的《云计算技术金融应用规范安全技术要求》中明确指出,云计算平台部署的物理数据中心及附属设施,应保证用于服务金融业的云计算数据中心运行环境与其他行业物理隔离。这样很多的数据敏感型的金融业务,都只能部署在符合规定的自己的 IDC 机房内。但是有一些数据敏感程度不高的其他业务,则可以放在云厂商提供的资源池内。当有需要进行业务交互时,再通过线上线下接入的方式完成数据交换。
成本:虽然云上提供了低成本、按需弹性使用的方式,可以将 IT 资源使用成本大幅度降低。但是很多的公司原本就在自己的 IDC 机房中存在很多的资源,这一部分资源不可能完全抛弃。同时存量的资源上的业务,如果一蹴而就改造成适应云产品的架构模式,也会带来一定的改造成本。在新老架构进行切换时,在流量治理、数据同步等方面也都会带来技术挑战。将线上和线下的资源拉通之后,原有资源和云上资源可以当成在一个局域网内来对待,为整体应用架构平滑迁移带来了可能。
场景二:包年包月 与 按量付费
预算控制:采用包年包月的方式,客户可以提前预算成本,避免突发事件造成的支出增加。而使用按需计费的方式,在财务的角度成本不确定,使用量也难以预测。因此需要不断地监控和评估资源使用情况,以避免资源费用过高。
资源供给稳定性:包年包月的方式企业可以根据自己的需求和预算,在某些时期内提前锁定预留资源,以避免资源不足的情况,确保资源的稳定性和可用性;而按需购买的方式则不能百分之百确定在需要时能准确提供所需要的算力,存在一定的不稳定性。
成本:相对于按量付费,单价上包年包月的价格更为便宜。但按量付费可以根据具体的使用量进行计费,避免因为不必要的资源而付出额外费用;企业只需要支付实际使用的资源费用,就可以避免因为资源闲置而产生的额外支出。
业务增长很大程度上是不可预知的;业务的不可预知意味着预算就不可预知,成本控制就不可预知。
业务会有明显的流量特征(比如:办公类型的内网应用,上班时间流量高峰,其余时间流量低谷;社交类型的应用晚间至凌晨流量高峰等等),业务流量的高峰和低谷的差值,意味着资源可供整理的理论空间,而整理资源碎片空间的方式就是弹性。
以包年包月为基础资源,锁定资源供给,满足常规业务低峰期的算力供应。
以按量付费的模式,以应对业务高峰流量对于算力的需求。
场景三:Container 与 Serverless Container
第一种是基于云主机的有着正常 Worker 节点的容器,这种形态下,我们可以提前准备好云主机作为 Kubernetes 的节点,然后容器服务会在节点上准备好 Kubernetes 的集群。
第二种是无需准备云主机的 Serverless 集群,这种形态下,用户感知不到 Worker 节点的存在,但是具备完整的 Kubernetes 的运维体验,当需要创建资源的时候,容器服务会负责临时生产 Serverless Container。
第三种是上面两种形态的结合,即在一个正常的 Kubernetes 集群中,配合 Serverless Container 的方式使用。
临时性短周期业务:对于需要短暂处理的任务,如图像处理、数据转换、临时开发环境等,Serverless Container 可以在任务完成后自动释放资源,避免长时间占用云资源。
无状态服务的突发负载:API 网关、消息队列、事件处理器等,这些服务可以快速响应请求,遇到突发流量时,自动扩展容器的数量,同时在负载过低时自动释放资源。
大规格应用的无损发布:在 Kubernetes 的应用滚动发布的过程中,一般都是需要先起一个新的实例,等到实例 Ready 后在滚动个升级下一个实例,这就意味着所在实例预留的资源至少要多出来一份才能做到常规更新。这样在机器上需要冗余的资源碎片会随着容器的规格而成比例放大,Serverless Container 很完美的解决了这个问题。
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: ElasticWorkload
metadata:
name: elasticworkload-sample
spec:
sourceTarget:
name: nginx-deployment-basic
kind: Deployment
apiVersion: apps/v1
min: 2
max: 4 # 副本数超过 4 个时,使用 elasticUnit 中的资源进行调度
replicas: 6
elasticUnit:
name: virtual-kubelet
labels:
"true" :
# min: 0 每个单元也可以指定自己的上下限。
# max: 10
EDAS中的实践
在 线上资源 + 线下资源 的场景,EDAS 除了默认支持云上的 ECS 节点作为应用的托管节点之外,也支持非阿里云集群(如 IDC 机房)的接入。在线下 IDC 进行网络接入后,在对应节点上安装 EDAS 的 Agent,就能托管线下的节点作为应用节点,在该集群中通过 EDAS 发布的应用,就能当成云上的应用一样统一管控:
在包年包月 + 按量付费的场景下,EDAS 中的弹性伸缩能力可以在对应指标触发之后,临时以按量付费的模式去“代购”指定形态的资源,同时在流量高峰过去后,可以自动将临时购买的机器资源释放回去。
在 Container + Serverless Container 的场景,EDAS 支持基于阿里云容器服务的ElasticWorkload工作负载,将应用的一部份实例运行在ECS节点上,超量部份运行在 Serverless Container 中。得益于Serverless Container的秒级弹性能力,在集群资源紧张的情况下,可将应用分钟级扩容缩短至秒级别。在缩容场景下,优先缩容Serverless Container实例,避免随机缩容的场景下,释放ECS节点上的实例,从而造成算力资源的空闲浪费。
视角四:平台工程(降低复杂度的理念)
平台工程诞生
平台工程这一技术领域,至今已经连续两年 (2023年与2024年) 被 Gartner 评为最需关注的十大科技趋势之一。尤其在去年(2022 年) 7 月份一条 Twitter ("DevOps is dead, long live Platform Engineering") 引爆了 IT 圈对于平台工程进一步的关注,讨论的焦点主要是两个:
所涉及技术领域太宽,除了大型企业,不是所有公司都有足够的人才宽度去承担起符合标准的产品研发团队。
云原生崛起,工程师除了需要掌握常规的流水线工具之外,又突然带来的十多种额外的基础工具的学习和使用,如:Helm/Terrafrom 等。
领域商业化严重,有过度营销包装,实际落地项目中,容易出现与理想的偏差。
“平台工程是一种新兴的技术方法,可以加快应用程序的交付及其产生业务价值的速度” -- Gartner
"平台工程是一门新兴学科,专注于通过降低现代软件交付的复杂性和不确定性来提高开发人员的生产力。” -- CircleCI
“平台工程是设计和构建工具链和工作流的学科,为云原生时代的软件工程组织提供自助服务功能。” -- platformengineering.org
“平台工程是设计和构建自助服务功能的学科,以最大限度地减少开发人员的认知负荷,并实现快速的软件交付。” -- Puppet
如何建设一个平台工程平台?
EDAS中的实践
EDAS 作为一个云上的微服务应用管理平台,或多或少的会引入新的概念,每增加一个新概念对于用户的使用成本就会上升,所以 EDAS 协助客户践行平台工程的理念就是:“不新造没必要的工具,将能力插件化的方式递送到工程师最熟悉的工具链中”。从 2019 年的 EDAS 2.0 开始,我们在工具链中持续迭代演进,到如今基本涵盖了应用的开发、构建、交付、测试、运维各个阶段,在标准工具中提供官方插件支持能力,如下:
应用开发中,全面兼容标准开源的 Spring Cloud/Dubbo 框架,同时在标准的 IDE 开发工具中(Eclipse/IDEA),推出官方插件 CloudToolkit,开发人员能在插件中完成应用创建、部署、端云互联、API 测试、配置管理、微服务治理、应用运行时日志,Shell 操作审计等能力。 应用构建与交付的过程中,提供官方 Jenkins / Gradle / Maven / Terraform / HelmChart 插件。 应用测试过程中,不仅提供 Web 版本的快速访问测试,也支持 JMeter / Postman / Apifox / IDE(CloudToolkit) 的官方标准插件。 应用运行时,EDAS 一直主打无侵入的方式提供微服务治理与 APM 应用监控的能力,同时针对常规应用管控场景,我们也支持完整的基于 kubectl 的黑屏完整能力,给用户提供白屏/黑屏/CD 工具三端完整的能力。
尾声
十年前开启的数字化转型的浪潮,拉开了以分布式互联网应用架构为主导、对企业数字化系统的迭代升级序幕。随着越来越多的开源框架的涌现,以及以 Kubernetes 技术为代表的云原生技术对基础设施技术架构的进一步重塑。云技术、云原生应用架构,已经在各个行业的基础设施中变得深入人心。以多中心(可用区)、一云多芯为代表的云基础设施,不仅仅是业务持续迭代演进的自信,更是符合政策监管要求的底气;弹性技术是释放技术红利最快的方式;而在这一过程中衍生出来的技术和概念的复杂度,希望借助平台工程的理念,在企业内部将其抹平。
欢迎加入【阿里云开发者公众号】读者群
微信扫码关注该文公众号作者