OAM—云原生下的应用模型

2023-09-09 11:04:03 浏览数 (1)

OAM概述

OAM (Open Application Model)是一个专注于描述应用的标准规范,OAM的愿景是在应用的维护生命周期内,提供一种标准化的沟通方式。将应用开发者、应用运维人员和基础设施运维人员,以一种标准化的方式连接起来,并且强化了应用生命周期中各个角色的职责。

对于平台开发人员来说,我们都知道Kubernetes的抽象层级:容器和基础设施API资源。但是对于平台的终端用户而言还是太过底层。

为了在一定程度上提高终端用户的体验,有的通过引入PaaS或者GUI来向终端用户隐藏Kubernetes API。但是这极大的限制了平台的能力,因为Kubernetes设计的原则就是系统的所有能力都要能够可以表达成"数据"

怎样使平台构建者能够定义应用级别的抽象而不引入对平台可扩展性限制的理念? 这就要求一个真正面向最终用户侧的应用定义,需要能够为业务研发和应用运维人员提供各自视角的应用定义原语。所以说,OAM 带来的改变,就是提供了一种大家都可以遵循的、标准化的方式来定义更高层级的应用层抽象,并且把“关注点分离”作为这个定义模型的核心思想。

特点:
  • 开发和运维关注点分离:开发者关注业务逻辑,运维人员关注运维能力,让不同角色更专注于领域知识和能力;
  • 平台无关与高可扩展:应用定义与平台实现解耦,应用描述支持跨平台实现和可扩展性;
  • 模块化应用部署和运维特征:应用部署和运维能力可以描述成高层抽象模块,开发和运维可以自由组合和支持模块化实现。

OAM规范模型

应用定义

OAM通过一个application配置来定义一个整体的应用实例,如下:

代码语言:javascript复制
apiVersion: core.oam.dev/v1alpha1
kind: ApplicationConfiguration
metadata:
  name: cool-example
spec:
  components:
  - componentName: example-server
    parameterValues:
    - name: instanceName
      value: cool-example
    - name: cacheSecret
      value: cache-connection
    traits:
    - trait:
        apiVersion: core.oam.dev/v1alpha1
        kind: ManualScalerTrait
        spec:
          replicaCount: 3
    scopes:
    - scopeRef:
        apiVersion: core.oam.dev/v1alpha1
        kind: NetworkScope
        name: example-vpc-network
  - componentName: example-cache
    parameterValues:
    - name: instanceName
      value: cool-example
    - name: engineVersion
      value: "4.0"
    - name: secret
      value: cache-connection

通过上面的配置我们知道:

  • 一个application可以由多个组件component组成
  • 一个组件由一个组件定义、一个或者多个trait基础设施定义、一个或者多个scope范围定义组成

下面来分别看看各个部分的说明

组件定义component

OAM 中最基础的对象,该配置与基础设施无关,定义负载实例的运维特性。例如一个微服务 workload 的定义。

代码语言:javascript复制
apiVersion: core.oam.dev/v1alpha1
kind: WorkloadDefinition
metadata:
  name: rediscluster.cache.crossplane.io
spec:
  definitionRef:
    name: rediscluster.cache.crossplane.io
apiVersion: core.oam.dev/v1alpha1
kind: Component
metadata:
  name: example-cache
spec:
  workload:
    apiVersion: cache.crossplane.io/v1alpha1
    kind: RedisCluster
    spec:
      engineVersion: "3.2"
  parameters:
  - name: instanceName
    required: true
    fieldPaths:
    - ".metadata.name"
  - name: secret
    required: true
    fieldPaths:
    - "spec.writeConnectionSecretToRef.name"
  - name: engineVersion
    required: false
    fieldPaths:
    - "spec.engineVersion"

范围定义scope

多个 Component 的共同边界。可以根据组件的特性或者作用域来划分 Scope,一个 Component 可能同时属于多个 Scope:

代码语言:javascript复制
apiVersion: core.oam.dev/v1alpha1
kind: ScopeDefinition
metadata:
  name: networkscope.core.oam.dev
spec:
  allowComponentOverlap: true
  definitionRef:
    name: networkscope.core.oam.dev

基础设施定义trait

一个组件所需的运维策略与配置,例如环境变量、Ingress、AutoScaler、Volume 等。(注意:该对象在 apiVersion: core.oam.dev/v1alpha1 中的名称为 Trait)。

平台使用

上面我们说明了OAM规范,只要平台满足这些规范的CRD及其operator,那么平台使用者只需要定义相关的CR即可

通过OAM规范将复杂的k8s配置分离开,那么业务开发人员、系统运维人员就可以只关注自己的那部分定义即可,这也就是OAM的关注点分离的理念

0 人点赞