中国开源软件网

当前位置: 首页 > 智能硬件 >

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload

时间:2020-06-29 21:19来源:互联网 作者:小狐

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload(图1)

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

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

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

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

示例准备

kind: Deployment

metadata:

name: food-trucks-deployment

labels:

app: food-trucks

spec:

selector:

matchLabels:

app: food-trucks

template:

metadata:

labels:

app: food-trucks

spec:

containers:

- name: food-trucks-web

env:

- name: discovery.type

value: single-node

ports:

- name: es

ports:

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

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload(图2)

定义 Component 与 Workload

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

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload(图3)

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

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload(图4)

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

部署这个应用

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

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:

Reason: Encountered an error during resource reconciliation

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

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

kind: ClusterRole

metadata:

name: deployment-clusterrole-poc

rules:

- apiGroups:

- apps

resources:

- deployments

verbs:

- “*”

---

kind: ClusterRoleBinding

metadata:

name: oam-food-trucks

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: deployment-clusterrole-poc

subjects:

- kind: ServiceAccount

namespace: crossplane-system

name: crossplane

✗ 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

使用,OAM,的内置工作负载来定义和管理云原生应用,Kubernetes,内置,Workload(图5)

什么时候使用 Deployment ?

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

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

反之,如果你的用户对 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 五年起,具体看实际能力。

工作地点: 国内:北京,杭州,深圳;海外:旧湾区、西雅图

岗位包含:架构师、技术专家、全栈工程师等。

课程推荐

本文相关词条概念解析:

负载

负载是指连接在电路中的电源两端的电子元件。电路中不应没有负载而直接把电源两极相连,此连接称为短路。常用的负载有电阻、引擎和灯泡等可消耗功率的元件。把电能转换成其他形式的能的装置叫做负载。电动机能把电能转换成机械能,电阻能把电能转换成热能,电灯泡能把电能转换成热能和光能,扬声器能把电能转换成声能。电动机、电阻、电灯泡、扬声器等都叫做负载。晶体三极管对于前面的信号源来说,也可以看作是负载。对负载最基本的要求是阻抗匹配和所能承受的功率。

网友评论

相关文章