Kubernetes资源编排系列之五: OAM篇

作者 雪尧(郭耀星) 炯思(钟炯恩)

前文我们提到了 Helm / Kustomize / CRD+Operator 这些方式,都可以在各自的领域很好的承载一个组件 (Component) 的概念。但是都没有解决一个完整的面向业务场景的应用 (Application) 的问题。
OAM (Open Application Model) 是 2019 年阿里云与微软联合推出的开放应用模型。下面我们来看这个模型是什么。

1. OAM是什么

在应用部署上,大家或多或少有过一些这样的经历:面对复杂的K8S YAML手足无措,有些字段能理解含义,有些字段光从字面上又无法确认影响,有些已经确认的字段一提交修改就被提示报错,说这个字段运行态不能动。如果说k8s内置资源的字段基本都还有迹可循的话,通过CRD+Operator创建的自定义资源的很多字段都会放飞自我,连文档都找不到。那么这些YAML能不能做得像乐高积木一样呢?既能自由地插拔创造发挥,又有一些限制约束,使得创意不会太剑走偏锋,让后续使用者也能快速理解其中的作用和价值。

于是 OAM 应运而生。OAM(Open Application Model)是一个标准的、基础设施无关的跨云应用部署模型。有以下几个特性:

  • 应用为先。一个应用的交付与部署应该是自包含的,其中的各类操作行为应该作为应用定义的一部分,这些内容与实际基础设施无关。
  • 清晰和可扩展性。定义一套开放标准,可以模块化整个应用交付流程,根据个人需要将这些模块自由组装,达成自己想要的结果。
  • 云服务供应商无关。定义的开放标准应该是一套更高级别的抽象,可以跨本地集群、跨云服务供应商,不会被锁定到任何一个厂商的底座。

其实上面这些点写几个Operator也都能解决,但OAM的亮点在于他并不是一个程序的实现,他是一个文字定义的标准,大家只要依照这个标准去落地,就能把已有的东西整合起来发挥作用。下面来看一下OAM模型抽象:

如上图所示,OAM将一个模型分成了Application(应用)、Component(组件)、Trait(运维特征) 这样几层,于是相关角色的关注点也都被巧妙地分解开来,各角色只要聚焦于自己的内容就能一起协作完成一个复杂的应用工程,如下图所示:

  • 应用开发人员:负责组件 Component 的定义及研发。
  • 应用运维人员
  1. 定义适用于不同 Workload 的运维属性 Trait 和管理 Component 的 ApplicationScope (or Policy)
  2. 将应用开发人员定义好的 Component 与运维属性 Trait 绑定在一起,辅以 Policy + Workflow,生成 Application,提交到 Runtime 实现,维护应用程序的生命周期
  • 基础设施运维人员:提供不同的 Workload 类型映射到实际的基础设施。

OAM 通过一系列概念的定义,完成了对一个应用的抽象,实现了角色职责的分离,将应用交付这件事情与底座解耦,使得跨云快速交付应用成为可能。开发同学也不再关心底座实现细节,只关心自己的应用模型即可。OAM 的诞生,旨在定义云原生应用标准。

OAM 只是一纸协议,并没有应用/组件管理的能力,但它却定义了一个良好的管理应用/组件的系统应该是什么样子,通过一套统一的概念收拢社区中分散在各处的垂直能力工具。下面我们就来讲讲SREWorks如何基于这个协议构建完整的云原生运维生态。

2. SREWorks的OAM落地实践

SREWorks作为阿里大数据运维平台,在设计之初,云原生应用管理在满足内部业务需求时候,遇到了这样一些问题和挑战:

  • 需要应用异地多活,避免单 Region 故障。
  • 需要环境分离,区分开发测试与生产环境。
  • 需要一定的集群扩展性,突破单一集群容量上限。
  • 需要多云部署,避免受限于单一云底座,或降低成本。
  • 开发者花费了太多的时间在基础设施的细节中。机器从哪来,网络环境怎么样,中间件资源/DNS/负载均衡怎么生成,服务怎么适配到各种底座等等。或者更进一步,每个开发者都是 YAML 工程师,哪怕都是 K8S,但每个底座让你提交的 YAML 都不一样。
  • 可扩展性低。有越来越多的平台 or 底座在尝试去支撑各种类型需求的业务,但一般来说,应用本身对于平台的诉求会很快超越平台的能力。
  • 云服务供应商绑定。当选择了一个固定的底座后,应用交付的方方面面将会打上这个底座的烙印,当想尝试转到另一个底座的时候难于登天。

当SREWorks-Appmanager基于OAM实现了底层引擎,驱动各个服务的开发与交付流程之后,这些问题基本都有了答案,让我们来看看这些问题是如何被解决的。

应用模块插拔

如上图的YAML所示:

  • 通过运维能力(trait)注入进行运维能力的增强,使部署者不用关注太多底座基础设施的细节。
  • 通过各种组件(compent)的插拔和参数变量(parameterValues)的定制来满足应用的功能需求。
  • 通过工作(workflow)和策略(policy)来定制部署策略,满足灰度发布、金丝雀发布等多样的发布策略。

应用插件机制
上面提到了各种组件(compent)和运维能力(trait),那么这些能力是从哪里来的呢?这些也是用插件机制增强出来的,可以看下图:

在Appmanager中预先定好了各种能力的接口(interface),一个插件只要实现这些接口(interface)就能够将能力增强到Appmanager中。用户可以基于这个机制来满足各种能力需求,比如将一个Flink服务制作成一个组件(compent),用户只要寥寥几行在YAML中加上这个组件,就能在自己应用中瞬间就有了流计算以及其管理能力。

应用组件Addon体系
在将一个应用做组件化拆解的时候,我们会遇到一个问题,像MySQL、Redis这种要如何拆。拆成一个普通的组件(compent)的话,有些资源少的场景,每个应用分配一个独享MySQL实例会导致资源不够分;拆成一个运维特征(trait)的话,每次申请一个实例的逻辑太重,不太符合一个特征的轻量级行为。所以我们将这类组件定义为addon。

应用组件构建
在OAM模型定义中没有包含构建,在Appmanager中,我们对此进行了增强,将应用的生命周期延展到构建环节,用户可以基于源代码直接构建出组件,进而组成一个完整应用模型。下面是构建过程的拓扑:

总结一下,SREWorks中基于OAM的Appmanager基本满足了如下的核心诉求:

  • 构建:易于获取且一致的开发、测试环境;易于发现和使用的 API
  • 交付:安全、可灰度的发布环境;可回滚的版本管理能力
  • 运行:异常行为可观测;运行稳定且能够自愈

后续文章我们会分享更多的Kubernetes科普文章,均会发布在我们的公众号“阿里智能运维”上,请大家持续关注~也欢迎大家在公众号后台留言想了解的内容和感兴趣的相关话题,与SR EWorks团队进行交流。

Github地址:​ ​https://github.com/alibaba/sreworks​​

文章参考

​https://developer.aliyun.com/article/741494​​ 《OAM 深入解读(一):OAM 为云原生应用带来哪些价值?》
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340