Skip to main content

Command Palette

Search for a command to run...

Yaml 程序员眼中的 Oam

Updated
3 min read

在 10.17 ,阿里云和微软联袂发布了一个有意思的新东西:OAM(开放应用模型)。这个项目要解决的问题是:用一致的、定义良好的模型来对应用进行描述。

Kubernetes 达成了一个小目标:不管是什么云,上面都有 Kubernetes 的一席之地。OAM 的小目标是什么呢?

OAM 用(Holy)YAML 对应用程序进行了描述,其中核心组件包含了几个:

  • Component:组件交付物
  • Application Scope:部署目标
  • Traits:运维能力
  • Application Configuration:应用配置

一头雾水是吧?还好每个对象都提供了代码范例,可以拿来解释。

Component

一种类似 Pod 的东西。。。

apiVersion: core.oam.dev/v1alpha1
kind: ComponentSchematic
metadata:
  name: admin-backend
  annotations:
    version: v1.0.0
    description: >
      Sample component schematic that describes the backend for our Twitter bot.
spec:
  workloadType: core.oam.dev/v1.SingletonServer
  osType: linux
  parameters:
  ...
  - name: twitter-access-token-secret
    description: Twitter API access token secret
    type: string
    required: true
  containers:
  - name: my-twitter-bot-backend
    image:
      name: example/my-twitter-bot-backend:1.0.0
      digest: sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b
    resources:
      cpu:
        required: 1.0
      memory:
        required: 100MB
      volumes:
      - name: config
        mountPath: /var/lib/my-twitter-bot/conf
        accessMode: RW
        sharingPolicy: Exclusive
    ports:
    - name: http
      value: 8080
    env:
    ...
    - name: TWITTER_ACCESS_TOKEN_SECRET
      fromParam: 'twitter-access-token-secret'
    livenessProbe:
      httpGet:
        port: 8080
        path: /healthz
    readinessProbe:
      httpGet:
        port: 8080
        path: /healthz

很像 Kubernetes 有没有?容器、参数、资源(外部加载卷的加载方式,类似 volumeMount 也定义在资源里)、端口和环境变量都是 YAML 程序员们很熟悉的东西。最值得注意的是 workloadType,工作负载的类型可以分为核心和扩展两个大类,其中核心工作负载有一个明确要求:所有实现本规范的平台必须支持核心工作负载。

核心工作负载有几个类型:

  • Server:可多实例运行的,对外提供服务的守护进程。
  • Singleton Server:只能单实例运行的,对外提供服务的守护进程。
  • Worker:能够多实例运行,不对外提供服务的守护进程。
  • Singleton Worker:不对外提供服务,不可复制的守护进程。
  • Task:不对外提供服务,可复制,非守护进程(一次性)。
  • Singleton Task:不对外提供服务,不可复制,非守护进程(一次性)。

另外这里还有一个字段叫 ConfigFile,用于存储配置内容。

在组件模型一节的尾部,给出了下面这样的例子:

apiVersion: core.oam.dev/v1alpha1
kind: ComponentSchematic
metadata:
  name: azurefunction
  annotations:
    version: v1.0.0
    description: "Extended workflow example"
spec:
  workloadType: azure.com/v1.Function
  parameters:
  - name: github-token
    description: GitHub API session key
    type: string
    required: true
  workloadSettings:
    - name: source
      value: git://git.example.com/function/myfunction.git
    - name: github_token
      fromParam: github-token

这个例子展示的是扩展类型的组件:从 git 拉取代码,用于提供 Function 服务。

Trait

一种运行平台中,针对特定工作负载进行运维支撑的能力,例如下面例子中的手动伸缩,似乎 Service Mesh 也应该名列此列?

apiVersion: core.oam.dev/v1alpha1
kind: Trait
metadata:
  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
  properties:
    type: object
    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
          }
        }
      }

这里定义了一个用来做手动伸缩的 Trait,它仅适用于第一节中提到的几个可伸缩的工作负载类型。这个 Traits 仅包含一个必要字段,用于设置副本数量。

但是在 YAML 里面包 JSON 真的好吗?

Application Scopes

百撕不得其解的一个概念。通过外部设施,如网络或者健康对应用范围进行划分,把应用进行聚合。 并且在 Application Configuration 中作为一个部署目标进行实例化。

apiVersion: core.oam.dev/v1alpha1
kind: ApplicationScope
metadata:
  name: health
  annotations:
    version: v1.0.0
    description: "aggregated health state for a group of components."
spec:
  type: core.oam.dev/v1alpha1.HealthScope
  allowComponentOverlap: true
  parameters:
    - name: probe-method
      description: The method to probe the components, e.g. 'httpGet'.
      type: string
      required: true
...
    - name: required-healthy-components
      description: Comma-separated list of names of the components required to be healthy for the scope to be health.
      type: []string
      required: false

Application Configuration

前面的几个概念中,描述了组件的定义、平台提供的运维能力、以及应用的部署范围,最终应用要运行起来,需要进行一个部署过程,部署过程除了把前面提到的对象组合起来之外,还需要加入一些配置内容。本对象就是用来完成这一功能的。

apiVersion: core.oam.dev/v1alpha1
kind: ApplicationConfiguration
metadata:
  name: my-vpc-network
spec:
  variables:
    - name: networkName
      value: "my-vpc"
  scopes:
    - name: network
      type: core.oam.dev/v1alpha1.Network
      properties:
        - name: network-id
          value: "[fromVariable(networkName)]"
        - name: subnet-id
          value: "my-subnet"
---
apiVersion: core.oam.dev/v1alpha1
kind: ApplicationConfiguration
metadata:
  name: custom-single-app
  annotations:
    version: v1.0.0
    description: "Customized version of single-app"
spec:
  variables:
    - name: message
      value: "Well hello there"
    - name: domainName
      value: "www.example.com"
  components:
    - componentName: frontend
      instanceName: web-front-end
      parameterValues:
        - name: message
          value: "[fromVariable(message)]"
      traits:
        - name: Ingress
          properties:
            - name: host
              value: "[fromVaraible(domainName)]"
            - name: path
              value: "/"
      applicationScopes:
        - my-vpc-network

    - componentName: backend
      instanceName: database
      applicationScopes:
        - my-vpc-network

这一组文件对象完成了几个任务:

  • 创建了一个网络类型的 Application Scope,my-vpc-network
  • 引用一个叫做 frontend 的组件,生成 web-front-end 对象,并赋予参数 message
  • web-front-end 提供一个 Ingress 对象。
  • 将两个实例部署在 my-vpc-network

后记

这几个对象里,基本形成了一个从交付物到运维的标准过程和定义,并且也直接使用 Rust 实现了基于这一规范的工具。符合这个规范的应用,就能能够在支持 OAM 的平台上进行运行和运维,虽然应用自身的结构、拓扑、构建、观测还有很多元素要实现,但是这些基础元素,应该已经能够发挥很好的示范效果了。

印象里 OAM 的新闻稿里有一句话,OAM 和其他应用模型是不同的,它没有供应商锁定问题,因为它是构建在 Kubernetes 的基础之上的:Kubernetes 就是在锁定横行的环境下,利用更高层次的抽象来打破旧锁定,造就新锁定的。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts