什么是 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. Python基础002---基础知识

    一.标识符 标识符是自己定义的,是开发人员在程序中自己定义的一些符号和名称,如变量名.函数名等.在 Python 里,标识符由字母(区分大小写).数字.下划线组成,且数字不能开头.常用的命名方法有小驼 ...

  2. 3.kubernetes的CNI网络插件-Flannel

    目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...

  3. OS_页面置换算法:C++实现

    一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...

  4. Windows 安装RabbitMQ后,启动服务就自动停止

    在做SpringCloud消息总线的时候,需要用到RabbitMQ,于是在windows上下载安装了一个,erlang的安装包不是官网下载的,而是朋友分享给我的,没注意它的版本(9.3). 安装完成后 ...

  5. hystrix信号量和线程池的区别

  6. 写给.NET开发者的Python教程(一):引言

    距离上一篇博文已过去8个月了,这段时间发生了很多事情导致没能持续更新博客.这段时间除了工作繁忙,业余时间都投入到AI技术的学习中,后面一段时间将会给大家分享我作为一个.NET开发人员在深度学习领域学习 ...

  7. Eclipse配置maven环境1

    一.什么是maven? Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个 ...

  8. Github中添加SSH key

    1-创建密钥,在终端输入下面的命令 ssh-keygen -t rsa -b -C "你的邮箱" //双引号不能去 要求输入密码,建议回车使用空密码方便以后的每次连接,此时会生成一 ...

  9. Nginx 从入门到放弃(一)

    Nginx nginx的使用场景 静态资源服务 通过本地文件系统提供服务 反向代理服务 nginx的强大性能 缓存 负载均衡 API服务 OpenResty nginx优点 高并发.高性能 可扩展性好 ...

  10. crm项目开发之架构设计

    CRM customer relationship management 客户管理系统 1. 干什么用的? 管理客户 维护客户关系 2. 谁去使用? 销售 班主任 项目经理 3. 需求: 1. 登录 ...