OAM (Open Application Model)是一个专注于描述应用的标准规范,OAM的愿景是在应用的维护生命周期内,提供一种标准化的沟通方式。将应用开发者、应用运维人员和基础设施运维人员,以一种标准化的方式连接起来,并且强化了应用生命周期中各个角色的职责。
对于平台开发人员来说,我们都知道Kubernetes的抽象层级:容器和基础设施API资源。但是对于平台的终端用户而言还是太过底层。
为了在一定程度上提高终端用户的体验,有的通过引入PaaS或者GUI来向终端用户隐藏Kubernetes API。但是这极大的限制了平台的能力,因为Kubernetes设计的原则就是系统的所有能力都要能够可以表达成"数据"
怎样使平台构建者能够定义应用级别的抽象而不引入对平台可扩展性限制的理念? 这就要求一个真正面向最终用户侧的应用定义,需要能够为业务研发和应用运维人员提供各自视角的应用定义原语。所以说,OAM 带来的改变,就是提供了一种大家都可以遵循的、标准化的方式来定义更高层级的应用层抽象,并且把“关注点分离”作为这个定义模型的核心思想。
OAM通过一个application配置来定义一个整体的应用实例,如下:
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
通过上面的配置我们知道:
下面来分别看看各个部分的说明
OAM 中最基础的对象,该配置与基础设施无关,定义负载实例的运维特性。例如一个微服务 workload 的定义。
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:
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的关注点分离的理念