海安零距离 海安论坛 海安新闻 海安

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2007|回复: 0

开放应用模型操作指南(一)| 云服务一键接入 OAM 体系

[复制链接]

6234

主题

6234

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18716
发表于 2019-12-27 15:35 | 显示全部楼层 |阅读模式
作者 | 邓洪超阿里云容器平台软件工程师
导读Open Application Model(OAM)是阿里云团结微软等国际顶级技能团队团结发布的开放应用模子技能。旨在通过全新的应用定义、运维、分发与交付模子,推动应用管理技能向“轻运维”的方向迈进,努力开启下一代云原生 DevOps 的技能革命。本《开放应用模子利用指南》系列文章,将为广大技能职员(研发、运维、基础办法工程师)提供接地气的、体系化的 OAM 利用和接入指南。
前言

自 OAM 标准推出以来,越来越多的平台和服务开始接入 OAM 标准,朝着 BaaS (Backend as a service) 化的方向迈进。在阿里巴巴集团,我们见证了 EDAS、内部中间件交付平台等以 OAM 的方式打造和推出应用交付和运维产品。而且,ROS、PolarDB 等以开放的姿态渐渐接入 OAM 作为跨平台集成方案。
随着跟终端用户平静台提供方的交换日益增多,我们也同时更加清晰地相识到在 OAM 集成各个平台和服务的时间照旧有一些不一致、不标准的地方。举些例子,DB 等资源创建起来后毗连信息该怎样袒露,已有的资源定义该怎样模子化成 OAM,什么应该作为 Workload?什么应该作为 Trait 等等。这些标题在差别团队的办理方式是类似却有些许差别的,不仅造成重复劳作,实践履历也缺乏进一步沉淀。
我们盼望用户去使用和接入 OAM,可以大概有一个同一的、清晰的流程和架构。这就是本文实行去论述标题、提供解法的地方。
什么人恰当读这篇文章?

这篇文章重要面向服务集成方,他们盼望本身的服务可以大概通过 OAM 去被使用。这包罗:

  • 服务提供方。比如监控服务 ARMS、日记服务 SLS、分布式追踪服务等;
  • 平台提供方。比如 EDAS、中间件交付平台、ROS、DBaaS 等,一个平台通常包罗很多服务。
用 OAM 形貌云资源/服务

如果你有一个服务,怎样才能以云原生的方式袒露呢?答案就是在 Kubernetes 上提供该服务。而 OAM,正是资助各人更好地在 K8s 上形貌服务本领、实现扩平台集成的一种标准。
1. 归类 OAM 范例

起首,服务的本领需要归类为 OAM 范例中的某一种。这里有三种范例:
范例定义例子Workload能单独跑起来、单独使用的服务需要定义的范例。DB (MySQL)、MQ (Kafka)、Cache (Redis)、Service MeshTrait跟运维干系的服务需要定义的范例。Ingress、Monitoring、Logging、服务发现、灰度发布Scope囊括一组服务组件的界限。如今仅实用少数场景。网络界限 (VPC、Firewall、Gateway)、健康界限 (相互关联的组件的团体健康检测)服务提供方需要将己方服务归类为上述一种。如允许以大概在平台上清晰地表达本身的目的,更好地被集成和使用。
2. 编写 OAM 定义

我们通常在把一个服务归类为一种 OAM 范例之后,就会去编写这个服务的 OAM 定义。这包罗两部门:

  • 编写 OAM 定义内里的通用元数据;
  • 编写服务自定义的 API。
服务自定义的 API 是用来形貌服务对外提供的本领的 API。在这方面,我们选择使用 JSON Schema 来作为 API 形貌语言,由于它是一种开放、标准的方式,在工程领域为各人所熟知。
下面,我们就分别以 Workload 和 Trait 为例,团结解释来详解怎样去编写服务的 OAM 定义。
OAM Workload 例子
  1. apiVersion: oam.dev/v1alpha1kind: WorkloadTypemetadata:  name: rdsspec:  group: alibaba.io/v1  names: [RDS]  # 下面用 JSON schema 形貌服务本领  settings: |    {      "$schema": "http://json-schema.org/draft-07/schema#",      "type": "object",      "required": [        "storageType"      ],      "properties": {        "storageType": {          "type": "string",          "description": "The type of storage for RDS instance"        }      }    }
复制代码
OAM Trait 例子
  1. apiVersion: core.oam.dev/v1alpha1kind: Traitmetadata:  name: ManualScaler  annotations:    version: v1.0.0    description: "Allow operators to manually scale a workloads that allow multiple replicas."spec:  appliesTo:    - core.oam.dev/v1alpha1.Server    - core.oam.dev/v1alpha1.Worker    - core.oam.dev/v1alpha1.Task  # 下面用 JSON schema 形貌运维本领  properties: |    {      "$schema": "http://json-schema.org/draft-07/schema#",      "type": "object",      "required": [        "replicaCount"      ],      "properties": {        "replicaCount": {          "type": "integer",          "description": "the target number of replicas to scale a component to.",          "minimum": 0        }      }    }
复制代码
3. 实现 OAM Operator

在定义了 OAM API 之后,我们还需要有实现层能让这个 spec “跑”起来。这里我们保举实现 K8s Operator 来作为这个 OAM API 的服务。Operator 详细细节有很多文章介绍,这里不再赘述。
阿里巴巴云原生应用团队实现并开源了 OAM framework(oam-go-sdk)来资助各人简化【构建 API + 实现 Operator】。
各人如果在实现 OAM Operator 过程中有什么标题,欢迎接洽我们。可以在上游提 issue 大概钉钉发消息。
服务的袒露与消耗

OAM 能给各人带来的一个重要好处就是可以大概横向联通差别平台之间的服务本领。这里我们介绍下怎样实现。
在集成服务的时间,通常要做两件事变:

  • 服务提供方需要袒露服务信息,比如 DB 毗连信息写到 CMDB;
  • 服务信息需要提供给用户应用去消耗,比如将 DB 毗连信息主动注入到(消耗者)应用的环境变量。
当前现状是,OAM 对接的项目通常都有本身的一套体系袒露和消耗服务的方式。下面我们举些例子:

  • Service Broker 将服务信息写入到 CRD 实例状态中,然后通过工作流读取并写入应用环境变量;
  • ROS 在 DB 模板实行完后有 outputs 属性包罗服务信息,然后作为用户应用模板的参数入参;
  • CrossPlane 在多家云厂商上提供同一的 MySQL Resource 定义,然后通过将 connection 信息写入 secret 并挂载到用户应用文件体系里。
除了上面的例子,我们另有很多其他或大或小的服务袒露与消耗的例子。如今这里有一个标题,那就是差别的项目之间,没有同一的服务袒露与消耗方式,导致差别的平台之间无法互通。在这里,我们盼望定义一个同一的接口,让差别平台差别服务在接入 OAM 以后可以大概互通,更简朴地透出服务本领赋能云用户。
办理思绪

针对上述标题,我们接下来形貌下办理思绪:

  • OAM Runtime 剖析 AppConfig,发现一个 Component (微服务应用) 需要消耗另一个 Component (云服务) 。于是 Runtime 需要安排好 Component 之间的创建序次;
  • 起首,OAM Runtime 创建云服务 Workload Component,并将相应的服务信息袒露到一个 spec 指定名字的 secret 内里去;
  • 然后,OAM Runtime 创建微服务应用 Component,并将 spec 声明的消耗内容通过名字干系联,并将 secret(通过 env、file 等方式)注入到应用中去。
团体架构图如下:

示例

下面我们通过举例来分析整个过程。
通过 CrossPlane 创建一个 CloudSQL Component:
  1. apiVersion: oam.dev/v1alpha1kind: Componentmetadata:  name: mysqlspec:  workloadType: database.cloud.io/v1beta1.CloudSQL  expose:    name: mysql-connection   ... # 其他一些参数输入
复制代码
上面我们看到 expose 字段声明了袒露信息的名字,如许做是为了让消耗者能关联。详细怎样袒露与消耗服务信息,则是由 Runtime 层来实现。在这里,创建完 MySQL Workload 实例之后,MySQL 毗连信息会被写入到一个 mysql-connection secret 内里去。
另一个应用 Web Component 则如下面定义所示来消耗 MySQL:
  1. apiVersion: oam.dev/v1alpha1kind: Componentmetadata:  name: webspec:  workloadType: Server  consume:  - name: mysql-connection    as: env # 注入到环境变量当中。也可以设置为 file,则会注入到当地文件当中
复制代码
总结

在这篇文章里,我们重要针对云服务提供方讲了怎样用 OAM 形貌服务本领、定义和实现相应的 OAM Runtime、以及怎样通过 OAM 集成差别平台的服务。
如今,OAM 还处于一个早期阶段,阿里巴巴团队正在上游贡献和维护这套技能,盼望这篇文章能给各人对于 OAM 以及怎样接入云服务有更多的相识。如果各人有什么标题大概反馈,也非常欢迎跟我们在上游大概钉钉接洽。
到场方式:

  • 钉钉扫码进入 OAM 项目中文讨论群

等待各人的到场!
阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技能领域、聚焦云原生盛行技能趋势、云原生大规模的落地实践,做最懂云原生开辟者的技能圈。”

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|深圳论坛-深圳人的网上家园  

GMT+8, 2020-6-1 13:53 , Processed in 0.155715 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表