什么是 OAM?

OAM 的全称为开放应用模型(Open Application Model),由阿里巴巴宣布联合微软共同推出。

OAM 解决了什么问题?

OAM 本质是为了解耦K8S中现存的形形色色的资源,让每个角色的关注点更为集中和专注。

举个例子,我们在生产环境中部署了Deployment资源,其中容器的image,健康检查,资源请求开发人员一般会了然于胸,但涉及到Pod副本数、PV、PVC、网络带宽、网络策略、对外负载配置等,一般的开发人员根本无从下手。

为什么会无从下手?原因很简单,正常的开发人员根本不会有这些内容的权限,而且绝大部分开发人员没有公司资源的监控数据,无法对应用所使用的资源进行平衡。最简单的情况,如果开放了CPU、内存、共享存储大小、网络带宽的上限配置,我相信很多人一上来就设置为8C,16GB,100GB,100MB这样奢侈配置,实际的集群资源能支持几个这样的应用呢?

所以这类的事情更适合应用运维人员去做,当然应用运维的人员也需要一定的水准。应用运维人员可以根据监控和告警按需的对CPU、内存、共享存储、网络等资源进行弹性伸缩,甚至可以从监控数据中发现一定的规律配置自动的程序来进行自动扩缩容,例如HPA、CronHPA。

OAM 是如何解决这些问题的?

在 OAM 体系中大致分了三个角色,分别为:

  • 基础设施运维人员

    负责开发、安装和维护各种 Kubernetes 级别的功能。具体工作包括但不限于维护大规模的 K8s 集群、实现控制器/Operator,以及开发各种 K8s 插件。在公司内部,我们通常被称为“平台团队(Platform Builder)
  • 业务研发人员

    以代码形式传递业务价值。大多数业务研发都对基础设施或 K8s 不甚了解,他们与 PaaS 和 CI 流水线交互以管理其应用程序。业务研发人员的生产效率对公司而言价值巨大。
  • 应用运维人员

    为业务研发人员提供有关集群容量、稳定性和性能的专业知识,帮助业务研发人员大规模配置、部署和运行应用程序(例如,更新、扩展、恢复)。请注意,尽管应用运维人员对 K8s 的 API 和功能具有一定了解,但他们并不直接在 K8s 上工作。在大多数情况下,他们利用 PaaS 系统为业务研发人员提供基础 K8s 功能。在这种情况下,许多应用运维人员实际上也是 PaaS 工程人员。

各个角色之间的服务关系为:基础设施运维人员 < 应用运维人员 < 业务研发人员。

与角色对应的也同样的有三个核心内容,分别为:

  • Component(组件)

    由业务开发人员输出,它可能包含微服务集合、数据库和云负载均衡器。
  • Trait(运维特征)

    由应用运维人员管理,例如:弹性伸缩、日志、监控、告警和 Ingress 等功能。
  • Application Configuration(应用配置)

    组合Component和Trait等内容描述应用最终能力的配置文件。

OAM 从资源角度上就隔离了不同角色所关心的内容,而不再将这些内容混杂在一起。

整体示意图如下:



更详细的内容可以阅读:《深度解读!阿里统一应用管理架构升级的教训与实践

OAM 社区生态现况

由于OAM是一个新的概念,所以社区的文档目前比较混乱,下面列出还在活动并在维护的几个仓库。

OAM标准规范

截至目前的版本

  • 1.0.0-alpha1
  • 1.0.0-alpha2

https://github.com/oam-dev/spec

基于Crossplane的OAM 核心运行时实现

支持的OAM规范:1.0.0-alpha2

https://github.com/crossplane/oam-kubernetes-runtime

OAM工作负载、特征、范围集合

可以理解为非OAM Runtime必须实现的OAM插件和扩展

https://github.com/oam-dev/catalog

该库提供了以下内容:

  • Workloads

    • Containerized
    • StatefulSet
    • Deployment
    • AdvancedStatefulSet
    • CloneSet
  • Traits
    • ManualScaler(手动伸缩器)
    • trait-injector(资源注入器)
    • ServiceExpose(服务导出)
    • IngressTrait(Ingress)
    • HPATrait(自动伸缩)
    • CronHPATrait(基于Cron表达式的定时伸缩)
    • MetricHPATrait(基于指标的自动伸缩)
    • SimpleRolloutTrait(简单的滚动更新)
    • ServiceMonitor(服务监控器,还在PR中)
  • Scopes
    • HealthScope

不维护或过时的仓库

这边列出一些容易被误导的仓库,大家遇到了可以跳过查阅,避免绕弯路。

Rudr

实现了 OAM 规范 1.0.0-alpha1

https://github.com/oam-dev/rudr

addon-oam-kubernetes-local

被 oam-kubernetes-runtime 替代

https://github.com/crossplane/addon-oam-kubernetes-local

快速入门

先决条件

安装

helm repo add oam https://github.com/oam-dev/crossplane-oam-sample/tree/master/archives/
kubectl create namespace oam-system
helm install crossplane --namespace oam-system oam/crossplane-oam

尝试一个应用配置样本

# sample_application_config.yaml

apiVersion: core.oam.dev/v1alpha2
kind: Component
metadata:
name: example-component
spec:
workload:
apiVersion: core.oam.dev/v1alpha2
kind: ContainerizedWorkload
spec:
containers:
- name: my-nginx
image: nginx:1.16.1
resources:
limits:
memory: "200Mi"
ports:
- containerPort: 4848
protocol: "TCP"
env:
- name: WORDPRESS_DB_PASSWORD
value: ""
parameters:
- name: instance-name
required: true
fieldPaths:
- metadata.name
- name: image
fieldPaths:
- spec.containers[0].image
---
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
parameterValues:
- name: instance-name
value: example-appconfig-workload
- name: image
value: nginx:latest
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
metadata:
name: example-appconfig-trait
spec:
replicaCount: 3
$ kubectl apply -f samples/sample_application_config.yaml
component.core.oam.dev/example-component created
applicationconfiguration.core.oam.dev/example-appconfig created
$ kubectl get manualscalertraits.core.oam.dev
NAME AGE
example-appconfig-trait 4s
$ kubectl get containerizedworkloads.core.oam.dev
NAME AGE
example-appconfig-workload 58s
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
example-appconfig-workload-deployment 3/3 3 3 114s

可以看到,通过Component和Trait、ApplicationConfiguration的抽象,开发人员和运维人员所关心的内容不再混合在一起,变得更为清晰。

最后

受限于篇幅的原因,本文简单介绍了 OAM 概念并实践了一个简单的基于 OAM 概念的应用程序样本,还没有完全发挥 OAM 的能力。

下一节将会详解如何一步一步使用kubebuilder为OAM添加一个基于Cron表达式定时伸缩的Train。

小伙伴们可以前往:https://github.com/oam-dev/catalog/pull/44 查看该 Train 的 PR 情况。

CronHPATrain 目前已被 oam-dev catalog 接收并合并。

5分钟带你快速入门和了解 OAM Kubernetes的更多相关文章

  1. 30分钟带你快速入门MySQL教程

    这是一篇真正适合初学者的MySQL数据库入门文章,哪怕你从来没有接触过数据库,或者说你从来没有听说过有数据库这东西,请一定要相信我,我当时就是这么过来的. 如果你刚开始接触MySQL数据库,或者你需要 ...

  2. 【转】C#单元测试,带你快速入门

    [转]C#单元测试,带你快速入门 注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.1 ...

  3. C#单元测试,带你快速入门

    注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...

  4. 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手

    Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎.它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支 ...

  5. 手把手带你快速入门jQuery(视频|资料,建议收藏!)

    jQuery是什么? jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架). jQuery设计的宗旨是 ...

  6. Zara带你快速入门WPF(4)---Command与功能区控件

    前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...

  7. Zara带你快速入门WPF(3)---触发器篇

    一.前言 使用触发器,可以动态的改变控件的外观,因为一些事件或属性改变了,把鼠标移动到按钮上,按钮就会改变其外观.通常这些必须写在C#代码中,使用WPF也可以使用XAMl实现,而这只会影响UI. 属性 ...

  8. Zara带你快速入门WPF(2)---布局篇

    一.章节目标 这几章节我们会创建一个完整的Window程序,包括使用DataGrid空间,数据绑定是把.NET类中的数据提供给用户界面的一个重要概念,还允许修改数据,包括.NET4.5新增的INoti ...

  9. 5分钟带你快速理解Http协议

    HTTP协议 什么是HTTP协议 HTTP(Hyper Text Transfer Protocol)协议又叫超文本传输协议,是建立在TCP/IP协议之上的用来传递数据的协议.它不涉及数据包的传递,主 ...

随机推荐

  1. 破解版BrupSuite安装及其问题解决及环境部署

    一 下载 BrupSuite_pro_v1.7.37的压缩包百度网盘链接: https://pan.baidu.com/s/1KkuseybjpuHo-6V4_wh9vw 提取码: 3vcs 说明一下 ...

  2. vc6.0代码转vs2017相关问题

    vc6.0代码转vs2017相关问题 命令行 error D8016: “/ZI”和“/Gy-”命令行选项不兼容fatal error C1083: 无法打开包括文件: “WinSock2.h”: N ...

  3. vc++如何知道cppdlg所关联的对话框?

    vc++ 6.0如何知道cppdlg所关联的对话框? 找a.cpp对应的a.h头文件里面找. https://blog.csdn.net/txwtech/article/details/1020824 ...

  4. Jmeter接口测试,往MySQL数据库写数据时,中文显示???

    调Jmeter接口测试,请求字段输入中文,查看数据库插入情况, 发现数据库显示    ???

  5. 线程基础9-quene讲解

    在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走. ...

  6. vue环境配置脚手架搭建,生命周期,钩子

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  7. 如果人生也能存档——C#中的备忘录模式

    大家好,老胡又和大家见面了.首先承认今天的博客有点标题党了,人生是没有存档,也没有后悔药的.有存档和后悔药的,那是游戏,不知道这是不是游戏让人格外放松的原因之一. 今天恰逢端午放假,就让我们来试着做一 ...

  8. NPM 配置文件修改

    NPM 配置文件修改 几乎每一门语言都有配套的包管理器,比如 Ruby 有 RubyGems,Go 有 go modules,npm 作为 node 的包管理器,你有想过全局安装的 node 包都放在 ...

  9. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

  10. Spring — 循环依赖

    读完这篇文章你将会收获到 Spring 循环依赖可以分为哪两种 Spring 如何解决 setter 循环依赖 Spring 为何是三级缓存 , 二级不行 ? Spring 为啥不能解决构造器循环依赖 ...