作者 | 周正喜  阿里云技术专家  爱好云原生,深度参与 OAM 社区

大家都知道,应用开放模型 Open Application Model(OAM) 将应用的工作负载(Workload)分为三种 —— 核心型、标准型和扩展型,这三者的主要区别在于一个 OAM 平台对于具体某一类工作负载进行实现的自由度不同。其中,OAM 社区中目前唯一一个核心工作负载是 Containerized Workload,它用来描述一个基于容器的工作负载,可以理解为是 Kubernetes Deployment 的简化版(去掉了 PodSecurityPolicy 等大量与业务研发无关的字段)。

不过,很多读者可能会有疑问:对于 Kubernetes 内置的工作负载 OAM 是否还能直接支持呢?

答案当然是肯定的,而且这是 OAM 作为 Kubernetes 原生的应用定义模型的默认能力。

下面,本文就以 Deployment 为例,介绍如何使用 OAM 基于 Kubernetes 的内置工作负载来定义和管理云原生应用。

示例准备

基于 GitHub FoodTrucks (旧金山美味街边小吃地图应用)项目,构建镜像  zzxwill/foodtrucks-web:0.1.1,加上依赖的 Elasticsearch 镜像,在默认情况下,它的 Deployment 描述文件  food-truck-deployment.yaml 如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:name: food-trucks-deploymentlabels:app: food-trucks
spec:selector:matchLabels:app: food-truckstemplate:metadata:labels:app: food-trucksspec:containers:- name: food-trucks-webimage: zzxwill/foodtrucks-web:0.1.1env:- name: discovery.typevalue: single-nodeports:- containerPort: 5000- name: esimage: docker.elastic.co/elasticsearch/elasticsearch:6.3.2ports:- containerPort: 9200- containerPort: 9300

如果将上述 yaml 文件提交到 Kubernetes 集群,通过 port-forward 可以通过浏览器查看效果:

定义 Component 与 Workload

在 OAM 中, 一个应用是由多个 Component(组件)构成的,而一个 Component 里的核心字段,就是 Workload(工作负载)。

所以说,像 Kubernetes Deployment、StatefulSet 等内置的工作负载,其实天生就可以被定义为 OAM Component 中的 Workload。比如下面这个 sample-deployment-component.yaml 文件,可以看到,.spec.workload 的内容,就是一个 Deployment,也就是 food-truck-deployment.yaml 里定义的 Deployment。

接下来,我们就将上述 OAM  Component 提交到 Kubernetes 集群验证一下。

部署这个应用

在 OAM 中,我们需要编写一个应用配置 ApplicationConfiguration 来组织所有的 OAM Component。由于只有一个 Component,本例中的 sample-applicationconfiguration.yaml 非常简单,如下所示:

apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:name: example-deployment-appconfig
spec:components:- componentName: example-deployment

提交 OAM Component 和 ApplicationConfiguration YAML 文件给 Kubernetes:

✗ kubectl apply -f sample-deployment-component.yaml
component.core.oam.dev/example-deployment created
✗ kubectl apply -f sample-applicationconfiguration.yaml
applicationconfiguration.core.oam.dev/example-deployment-appconfig created

不过,如果这个时候你查看 example-deployment-appconfig 的执行情况,会发现如下报错:

✗ kubectl describe applicationconfiguration example-deployment-appconfig
Name:         example-deployment-appconfig
...
Status:Conditions:Message:               cannot apply components: cannot apply workload "food-trucks-deployment": cannot get object: deployments.apps "food-trucks-deployment" is forbidden: User "system:serviceaccount:crossplane-system:crossplane" cannot get resource "deployments" in API group "apps" in the namespace "default"Reason:                Encountered an error during resource reconciliation...

这是因为 OAM 的 Kubernetes 插件权限不足导致的,所以不要忘记设置合理的 ClusterRole 和 ClusterRoleBinding。

提交如下的授权文件 rbac.yaml,ApplicationConfiguration 可以执行成功。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: deployment-clusterrole-poc
rules:
- apiGroups:- appsresources:- deploymentsverbs:- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: oam-food-trucks
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: deployment-clusterrole-poc
subjects:- kind: ServiceAccountnamespace: crossplane-systemname: crossplane

继续查看 deployments,并设置端口转发:

✗ kubectl get deployments
NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
food-trucks-deployment           1/1     1            1           2m20s
✗ kubectl port-forward deployment/food-trucks-deployment 5000:5000
Forwarding from 127.0.0.1:5000 -> 5000
Forwarding from [::1]:5000 -> 5000
Handling connection for 5000
Handling connection for 5000

通过 http://127.0.0.1:5000 就可以在旧金山美味街边小吃地图里找到汉堡包的店了:

什么时候使用 Deployment ?

看到这里,大家可能会有另一个疑问,那么我什么时候该使用 Deployment、什么时候该使用 ContainerizedWorkload 来作为 OAM 的工作负载呢?

其实,Deployment 和 ContainerizedWorkload 的主要区别,在于抽象程度不同

简单说,如果你的用户希望看到一个极简的、没有一些”乱七八糟“字段的 Deployment 的话;或者,你希望对你的用户屏蔽掉 Deployment 里面与用户无关的字段(比如:不想允许研发自行设置 PodSecurityPolicy),那你就应该给用户暴露 ContainerizedWorkload。这时候,这个工作负载需要的运维操作和策略,则是由另一个 OAM 对象 Traits(运维特征) 来定义的,比如 ManualScalerTrait。这种“关注点分离”的做法,也是 OAM 提倡的最佳实践。

反之,如果你的用户对 Deployment 里的各种运维、安全相关的字段并不排斥,你也不需要对用户屏蔽掉这些字段,那你大可以直接暴露 Deployment 出去。这个工作负载需要的其他运维能力,依然可以通过 OAM Traits 来提供。

为什么使用 OAM Component 来定义应用?

你有可能还有另外一个疑问,既然 OAM Component 里面的 Workload 就是 Kubernetes 里的各种 API 对象,那么使用 OAM 模型来定义应用又有哪些好处呢?

这就要说到 OAM 带来的好处了,相信大家在基于 Kubernetes 构建应用平台的时候,一定遇到过一系列的难题,比如依赖管理、版本控制、灰度发布等等,另一方面,应用平台为了跟云资源结合起来,纯粹使用 K8s 原生的 Workload 是做不到的。

而通过 OAM ,你不仅可以将云资源与应用统一描述,OAM 实现框架还将帮你解决了依赖管理、版本控制、灰度发布等一系列难题。这些我们将在后续的文章中为大家介绍。

了解更多和贡献

除了 Deployment 之外,OAM 社区还有很多 Kubernetes 内置工作负载(比如 StatefulSet)以及阿里巴巴开源工作负载 OpenKruise 的各种实例,欢迎查阅和贡献。

为了深入参与 OAM 贡献,也非常欢迎加入阿里巴巴云原生应用平台团队。

  • 工作职位:Kubernetes/Serverless/PaaS/应用交付等领域专家( P7-P8 )。
  • 工作年限:建议 P7 三年起,P8 五年起,具体看实际能力。
  • 工作地点: 国内:北京,杭州,深圳;海外:旧金山湾区、西雅图
  • 岗位包含:架构师、技术专家、全栈工程师等。

简历立刻回复,2~3 周出结果,简历投递:jianbo.sjb AT alibaba-inc.com

课程推荐

为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。

点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

OAM深入解读:使用OAM定义与管理Kubernetes内置Workload相关推荐

  1. OAM 深入解读:使用 OAM 定义与管理 Kubernetes 内置 Workload

    作者 | 周正喜  阿里云技术专家  爱好云原生,深度参与 OAM 社区 大家都知道,应用开放模型 Open Application Model(OAM) 将应用的工作负载(Workload)分为三种 ...

  2. vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件

    昔登铜井望法华,葱茏螺黛浮蒹葭.今登法华望铜井,湖水迷茫烟色瞑.-- <登法华寺山顶> Proxy是什么 Proxy是JS标准内置对象中的一个对象.用于创建一个对象的代理.从而实现对对象操 ...

  3. unity android 宏定义,Unity各平台内置宏定义

    属性 方法 UNITY_EDITOR #define directive for calling Unity Editor scripts from your game code. UNITY_EDI ...

  4. python内置函数调用_Python中函数的基本定义与调用及内置函数详解

    前言 函数function是python编程核心内容之一,也是比较重要的一块.首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有 ...

  5. python函数定义及调用-Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

  6. 【杂记】(input获取焦点失去焦点、获取input中输入的值、 键盘事件、js事件、Math 属性、手机自适应meta定义、 去掉input内置阴影、图片居中、去蓝色默认背景、点击去掉默认边框)

    1. input获取焦点失去焦点 input:focus{border:1px red solid:} 获取焦点 .focus()失去焦点.blur() 2. 获取input中输入的值 <inp ...

  7. c语言编译器自带宏定义,C/C++中内置的宏定义

    (1)跨平台的使用 C++:编写跨平台程序的关键,C/C++中的内置宏定义 分两部分: 操作系统判定: Windows: WIN32 Linux: linux Solaris: __sun 编译器判定 ...

  8. OAM 深入解读:OAM 为云原生应用带来哪些价值?

    导读:OAM 是阿里巴巴联合微软在社区推出的一款用于构建和交付云原生应用的标准规范,旨在通过全新的应用定义.运维.分发与交付模型,推动应用管理技术向"轻运维"的方向迈进,全力开启下 ...

  9. python定义fmax_Python标准库:内置函数max(iterable, *[, key, default])说明

    max(arg1, arg2, *args[, key]) 本函数是迭代对象iterable进行比较,找出最大值返回.当key参数不为空时,就以key的函数对象为判断的标准. 例子: #max() a ...

最新文章

  1. golang error类型详解
  2. yii2.0框架中自定义接口,实现类的多继承
  3. 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别
  4. Makefile的伪目标
  5. ros安装-Ubuntu14.04
  6. 黄健翔让赛场上出现大个中文字
  7. multipartfile前端怎么传_前端那些事如何更好管理 Api 接口
  8. 测试Live Writer 发表博客
  9. Python笔记-相关性分析(连续变量和分类变量)
  10. parallelstudio license 位置_卫生间这3个位置95%装修没用好
  11. pythonsupermro_Python高级编程之继承问题详解(super与mro)
  12. PathAnimation
  13. 【python】获取http响应
  14. react native+typescript创建移动端项目-(慕课网喜马拉雅项目笔记)-(一,项目的初始化配置)
  15. 安装centos 6.5 在惠普 ...pro(有惠普增霸卡)上的诸些问题
  16. 结构力学用计算机算的优势和不足,计算结构力学
  17. java查询城市区号_城市查区号示例代码
  18. 展开操作符:一家人就这么被拆散了
  19. 分页符怎么删除,word不要的页面删不掉
  20. 在idea中如何设置项目编码为UTF-8?

热门文章

  1. lstm原文_LSTM模型与水文模型在径流模拟中的比较
  2. word公式插件_如何快速输入复杂的数学公式?这里有 3 个实用技巧
  3. qt多线程服务器_常见网络服务器并发模型
  4. 安装python环境与运行_linux下怎么安装python的运行环境
  5. C语言入门经验:零基础如何学习C语言?
  6. 【学习笔记】第二章——进程的控制、通信
  7. 【学习笔记】传输层:TCP协议(报文段、连接管理{握手}、可靠传输、流量控制、拥塞控制)
  8. java递归分苹果_递归较难题——分苹果问题
  9. 服务器内存会显示ecc么,服务器内存ecc
  10. 钱老,外国人能搞的,今天中国人也能搞了!