前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于kubevela和oam

关于kubevela和oam

作者头像
机械视角
发布于 2021-02-26 02:16:41
发布于 2021-02-26 02:16:41
1.7K00
代码可运行
举报
文章被收录于专栏:TensorbytesTensorbytes
运行总次数:0
代码可运行

kubevela 是 OAM 的实现,虽然是今年才发布的项目,但我们可以通过结合 kubevela 帮助我们更好地了解 OAM。

vela 安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ vela install
- Installing Vela Core Chart:
created namespace vela-system
install chart vela-core, version v0.3.0, desc : A Helm chart for Kube Vela core, contains 36 file
Automatically discover capabilities successfully ✅ Add(8) Update(0) Delete(0)
⠋ Waiting Capability ready to install ... 
TYPE       	CATEGORY	DESCRIPTION                                                                     
+task      	workload	Describes jobs that run code or a script to completion.                         
+webservice	workload	Describes long-running, scalable, containerized services that have a stable     
           	        	network endpoint to receive external network traffic from customers. If workload
           	        	type is skipped for any service defined in Appfile, it will be defaulted to     
           	        	`webservice` type.                                                              
+worker    	workload	Describes long-running, scalable, containerized services that running at        
           	        	backend. They do NOT have network endpoint to receive external network          
           	        	traffic.                                                                        
+autoscale 	trait   	Automatically scales workloads by resource utilization metrics or cron          
           	        	triggers.                                                                       
+metrics   	trait   	Configures monitoring metrics for your service.                                 
+rollout   	trait   	Configures Canary deployment strategy for your application.                     
+route     	trait   	Configures external access to your service.                                     
+scaler    	trait   	Configures replicas for your service.                                           

- Finished successfully.

可以看到kubevela提供了 8 种资源,workload类型的taskwebserviceworkertraint类型的autoscalemetricsrolloutroutescaler

这里出现了两个概念workloadtraint,这是 OAM 定义的资源概念:

  • workload 类似于 k8s 的自定义资源(CR)的概念,用于基础设施人员自定义资源
  • component 用于定义应用程序的基本组件,可以理解成一个job,一个db或一个deployment,一个 Component 中只能引用一个workload
  • taint 可以用于定义 component运维属性,比如路由,限流熔断策略,由最终的ApplicationConfiguration将其和 component 组装
  • ApplicationConfiguration 定义了一个应用程序的配置,通过componenttaint模板,定义一个具体的运行实例

可以看到 OAM 核心就是 组合和装配。

简单了解了 OAM 的几个概念之后,我们来看看 kubevela 提供哪些 workload:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get WorkloadDefinition
NAME         DEFINITION-NAME
task         jobs.batch
webservice   deployments.apps
worker       deployments.apps

vela 提供了三种 workload: task, webservice, worker。其中 task 对应 k8s 中的 job.batch,webservice 和 worker 都是 deployments, webservice 提供更多能力,比如端口,环境变量,config设置等,下面是 webservice 的 workloadDefinition 定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get WorkloadDefinition webservice -oyaml | yq r - spec.extension.template
output: {
	apiVersion: "apps/v1"
	kind:       "Deployment"
	spec: {
		selector: matchLabels: {
			"app.oam.dev/component": context.name
		}

		template: {
			metadata: labels: {
				"app.oam.dev/component": context.name
			}

			spec: {
				containers: [{
					name:  context.name
					image: parameter.image

					if parameter["cmd"] != _|_ {
						command: parameter.cmd
					}

					if parameter["env"] != _|_ {
						env: parameter.env
					}

					if context["config"] != _|_ {
						env: context.config
					}

					ports: [{
						containerPort: parameter.port
					}]

					if parameter["cpu"] != _|_ {
						resources: {
							limits:
								cpu: parameter.cpu
							requests:
								cpu: parameter.cpu
						}
					}
				}]
		}
		}
	}
}
parameter: {
	// +usage=Which image would you like to use for your service
	// +short=i
	image: string

	// +usage=Commands to run in the container
	cmd?: [...string]

	// +usage=Which port do you want customer traffic sent to
	// +short=p
	port: *80 | int
	// +usage=Define arguments by using environment variables
	env?: [...{
		// +usage=Environment variable name
		name: string
		// +usage=The value of the environment variable
		value?: string
		// +usage=Specifies a source the value of this var should come from
		valueFrom?: {
			// +usage=Selects a key of a secret in the pod's namespace
			secretKeyRef: {
				// +usage=The name of the secret in the pod's namespace to select from
				name: string
				// +usage=The key of the secret to select from. Must be a valid secret key
				key: string
			}
		}
	}]
	// +usage=Number of CPU units for the service, like `0.5` (0.5 CPU core), `1` (1 CPU core)
	cpu?: string
}

提供的traits:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get traitDefinitions
NAME        DEFINITION-NAME
autoscale   autoscalers.standard.oam.dev
metrics     metricstraits.standard.oam.dev
rollout     canaries.flagger.app
route       routes.standard.oam.dev
scaler      manualscalertraits.core.oam.dev

vela 提供了五种 trait,自动扩容,metrics指标,回滚,路由和手动扩容,以最常见的 route 为例,我们看看 traits 的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get traitDefinitions route -oyaml   | yq r - spec.extension.template
output: {
	apiVersion: "standard.oam.dev/v1alpha1"
	kind:       "Route"
	spec: {
		host: parameter.domain

		if parameter.issuer != "" {
			tls: {
				issuerName: parameter.issuer
			}
		}

		if parameter["rules"] != _|_ {
			rules: parameter.rules
		}

		provider: *"nginx" | parameter.provider
	}
}
parameter: {
	// +usage= Domain name
	domain: *"" | string

	issuer: *"" | string
	rules?: [...{
		path:          string
		rewriteTarget: *"" | string
	}]
	provider?: string
}

最后是 scopes, scopes 表示作用域,主要用于分组和管理,比如可以将一个 component 划归到多个 scopes,一个scopes 也可以包含多个 component,因为在日常中 scopes 概念用的比较,因为用的比较少,这里就不细讲了,vela 提供了一个 healthscopes :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get scopedefinitions
NAME                        DEFINITION-NAME
healthscopes.core.oam.dev   healthscopes.core.oam.dev

了解 OAM 应用的基本组成之后,我们基于 vela 来创建一个 Application ,并看他如何创建的。

vela 创建应用

我们构建一个webservice应用,这里就使用官方提供的案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat vela.yaml
name: first-vela-app
services:
  testsvc:
    type: webservice
    image: crccheck/hello-world
    port: 8000
    route:
      domain: testsvc.example.com
$ vela up -f vela.yaml
Parsing vela appfile ...
Load Template ...

Rendering configs for service (testsvc)...
Writing deploy config to (.vela/deploy.yaml)

Applying application ...
Checking if app has been deployed...
App has not been deployed, creating a new deployment...
✅ App has been deployed ???
    Port forward: vela port-forward first-vela-app
             SSH: vela exec first-vela-app
         Logging: vela logs first-vela-app
      App status: vela status first-vela-app
  Service status: vela status first-vela-app --svc testsvc

vela 会将 Appfile 渲染成 Application资源。

我们看看 website 的Application

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl get Application  first-vela-app -oyaml
apiVersion: core.oam.dev/v1alpha2
kind: Application
metadata:
  creationTimestamp: "2021-01-26T08:24:53Z"
  generation: 1
  name: first-vela-app
  namespace: default
  resourceVersion: "2662687"
  selfLink: /apis/core.oam.dev/v1alpha2/namespaces/default/applications/first-vela-app
  uid: a603e28a-b52a-4b5f-ae6c-be57de887c51
spec:
  components:
  - name: testsvc
    scopes:
      healthscopes.core.oam.dev: first-vela-app-default-health
    settings:
      image: crccheck/hello-world
      port: 8000
    traits:
    - name: route
      properties:
        domain: testsvc.example.com
    type: webservice

这个 Application 是 kubevela 的 appfile 服务端映射,其下层实现是由 ApplicationConfiguration 来做的。

我们可以看看ApplicationConfiguration

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
  creationTimestamp: "2021-01-26T04:23:03Z"
  finalizers:
  - scope.finalizer.core.oam.dev
  generation: 1
  labels:
    application.oam.dev: first-vela-app
  name: first-vela-app
  namespace: default
  ownerReferences:
  - apiVersion: core.oam.dev/v1alpha2
    controller: true
    kind: Application
    name: first-vela-app
    uid: 5b2c0284-0bd1-4c4c-a671-0fa8c7684b26
  resourceVersion: "39680262"
  selfLink: /apis/core.oam.dev/v1alpha2/namespaces/default/applicationconfigurations/first-vela-app
  uid: 00bc284d-c57f-4b52-a177-31753520c619
spec:
  components:
  - componentName: testsvc
    scopes:
    - scopeRef:
        apiVersion: core.oam.dev/v1alpha2
        kind: HealthScope
        name: first-vela-app-default-health
    traits:
    - trait:
        apiVersion: standard.oam.dev/v1alpha1
        kind: Route
        metadata:
          labels:
            trait.oam.dev/type: route
        spec:
          host: testsvc.example.com
          provider: nginx
status:
  conditions:
  - lastTransitionTime: "2021-01-31T22:49:03Z"
    reason: ReconcileSuccess
    status: "True"
    type: Synced
  dependency: {}
  observedGeneration: 1
  workloads:
  - componentName: testsvc
    componentRevisionName: testsvc-v3
    scopes:
    - scopeRef:
        apiVersion: core.oam.dev/v1alpha2
        kind: HealthScope
        name: first-vela-app-default-health
    traits:
    - traitRef:
        apiVersion: standard.oam.dev/v1alpha1
        kind: Route
        name: testsvc-route-c4575497d
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: testsvc

包含了一个 testsvc 的component,这个 component 包含了一个 scopes 和 traits。 application 会根据 type 配置从 workload模板 中创建一个 component,我们看看 testsvc 的 component:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl get components testsvc -oyaml
apiVersion: core.oam.dev/v1alpha2
kind: Component
metadata:
  creationTimestamp: "2021-01-26T08:24:55Z"
  generation: 1
  labels:
    application.oam.dev: first-vela-app
  name: testsvc
  namespace: default
  ownerReferences:
  - apiVersion: core.oam.dev/v1alpha2
    controller: true
    kind: Application
    name: first-vela-app
    uid: a603e28a-b52a-4b5f-ae6c-be57de887c51
  resourceVersion: "2662686"
  selfLink: /apis/core.oam.dev/v1alpha2/namespaces/default/components/testsvc
  uid: eb6a8f1a-c8e5-4140-b5e8-ad5864862c4b
spec:
  workload:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        workload.oam.dev/type: webservice
    spec:
      selector:
        matchLabels:
          app.oam.dev/component: testsvc
      template:
        metadata:
          labels:
            app.oam.dev/component: testsvc
        spec:
          containers:
          - image: crccheck/hello-world
            name: testsvc
            ports:
            - containerPort: 8000

我们可以看到ApplicationConfigurationComponent 这两个资源都有 ownerReferences,在 owner 资源被删除的时候,Kubernetes 垃圾收集器会自动将附属的资源清除。

小结

OAM 提供了三种核心的模板来创建一个应用, components,traits 和 scopes,components 一般定义一些和基础设施相关模板,由平台团队提供,traits 定义和基础运维相关模板,由运维人员定义,scopes 偏向于两者都关心的部分。通过将应用拆分成不同的层次,让各部分只关注自己的那个专注的那个点,而不用对全局的关注。

vela 算是 OAM 的一种落地实现,定义几种通用的资源(worker,webservices,routes…),再通过 Appfile 渲染生成 Application。本质上和基于 helm 开发一套符合 OAM 标准的模板依赖一样,不过 vela 是运行在集群内部,对应用会更强的控制,和 helm 这种从集群中退下来(v3去掉tiller)变成纯粹部署工具的理念还是有些区别的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5分钟带你快速入门和了解 OAM Kubernetes
OAM 的全称为开放应用模型(Open Application Model),由阿里巴巴宣布联合微软共同推出。
落跑架构师M
2020/07/15
1.4K0
5分钟带你快速入门和了解 OAM Kubernetes
以应用为中心:开放应用模型(OAM)初探
不久前,Kubernetes 也迎来了他 6 岁的生日,在这 6 年中,从孵化之初的三足鼎立,到后来的一统天下,Kubernetes 成为容器编排领域的事实标准已经有段时间了。在这期间,云原生的概念开始深入人心,越来越的公司组织和开发者开始接受、了解、实践云原生。如今,已有无数的应用以容器的形式运行在各种版本 Kubernetes 中了。
郭旭东
2020/12/30
2.1K0
以应用为中心:开放应用模型(OAM)初探
让云原生应用的交付变得更简单 | KubeVela v1.0 正式发布
郭旭东 云原生社区 OAM SIG Owner, 云原生社区管委会成员,上海站站长。
CNCF
2021/04/21
9650
Kubevela 下的多集群应用
需要区分几个角色: 开发、运维、运维开发。开发面向的是业务需求,运维面向的是业务稳定,运维开发面向的是效率。运维开发提供各种各样的工具,打通开发和运维之间的壁垒,既要快速满足业务上线。又要保障业务稳定。
陈少文
2021/09/19
1.3K0
Kubevela 下的多集群应用
KubeVela 基础入门
KubeVela 是一个开箱即用的现代化应用交付与管理平台,它使得应用在面向混合云环境中的交付更简单、快捷,是开放应用模型(OAM)的一个实现,所以我们需要先了解下 OAM。
我是阳明
2023/10/17
1.4K0
KubeVela 基础入门
OAM—云原生下的应用模型
OAM (Open Application Model)是一个专注于描述应用的标准规范,OAM的愿景是在应用的维护生命周期内,提供一种标准化的沟通方式。将应用开发者、应用运维人员和基础设施运维人员,以一种标准化的方式连接起来,并且强化了应用生命周期中各个角色的职责。
tunsuy
2023/09/09
6520
Rudr 初体验
OAM(开放应用模型) 是一次对应用运行及其支撑环境进行抽象的有意思的尝试,与之对应的控制器 Rudr 也在同一时间诞生。有了 Rudr,OAM 就不是一个简单的标准,而是一个可以尝试落地的原型了。官方仓库提供了很好的入门文档,借此文档的帮助,能够很好的理解规范中莫名其妙的概念。这里就按照官方教程走一通,看看这种方法让应用部署运行过程发生了什么变化。
崔秀龙
2019/12/10
1.1K0
基于 KubeVela 的 GitOps 交付
KubeVela 作为一个简单、易用、且高可扩展的云原生应用管理工具,能让开发人员方便快捷地在 Kubernetes 上定义与交付现代微服务应用,无需了解任何 Kubernetes 基础设施相关的细节。
CNCF
2021/10/13
6630
KubeVela 核心控制器原理浅析
在学习 KubeVela 的核心控制器之前,我们先简单了解一下 KubeVela 的相关知识。
我是阳明
2023/11/25
3460
KubeVela 核心控制器原理浅析
KubeVela 插件指南:轻松扩展你的平台专属能力
KubeVela 插件(addon)可以方便地扩展 KubeVela 的能力。正如我们所知,KubeVela 是一个微内核高度可扩展的平台,用户可以通过 模块定义(Definition)[1]扩展 KubeVela 的系统能力,而 KubeVela 插件正是方便将这些自定义扩展及其依赖打包并分发的核心功能。不仅如此,KubeVela 社区的插件中心也在逐渐壮大,如今已经有超过 50 款插件,涵盖可观测性、微服务、FinOps、云资源、安全等大量场景功能。
CNCF
2022/11/28
7740
KubeVela 插件指南:轻松扩展你的平台专属能力
基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
Kubernetes 生态本身的能力池固然是丰富的,但社区里并没有一个可扩展的、方便快捷的方式,能够帮助平台团队把这些能力快速“组装”成面向最终用户的功能(Feature)。因此,尽管大家都在基于 Kubernetes 构建上层应用平台,但这些平台本质上并不能与 Kubernetes 生态完全打通,而是变成一个个的垂直“烟囱”。
CNCF
2021/03/15
1.3K0
基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
美国西部时间 2020 年 11 月 18 日,在云原生技术“最高盛宴”的 KubeCon 北美峰会 2020 上,CNCF 应用交付领域小组(CNCF SIG App Delivery) 与 Open Application Model (OAM) 社区,以及来自阿里云、微软云的 OAM 项目维护者们在演讲中共同宣布了 KubeVela 开源项目的正式发布。
CNCF
2020/11/25
1K0
KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
使用rudr构建云原生应用程序
OAM是构建云原生应用程序的规范 专注于分离开发和运营需求,Open Application Model将模块化, 可扩展和可移植的设计引入到Kubernetes等平台上,以构建和交付应用程序。
有点技术
2020/07/14
9850
基于 KubeVela 的机器学习实践
在机器学习浪潮迸发的当下,AI 工程师除了需要训练、调试自己的模型之外,还需要将模型进行部署上线,从而验证模型的效果(当然,有的时候,这部分工作由 AI 系统工程师来完成)。这一部分工作对于 AI 工程师们来说是繁琐、且消耗额外精力的。
CNCF
2022/04/19
5600
基于 KubeVela 的机器学习实践
数据约束语言 CUE 是何方神圣?
CUE 是一门开源的数据约束语言,专门用于处理配置、结构、数据并执行它们。大多数人开始使用 CUE 是因为要做数据验证和生成配置。然后他们继续将 CUE 用于数据模板、运行时输入验证、代码生成、脚本、管道等等。首先你要明白 CUE 并不是一种通常意义的程序语言,它是图灵非完备的编程语言。
我是阳明
2022/05/22
1.1K0
数据约束语言 CUE 是何方神圣?
K8s应用为中心的封装Operator与OAM
与 Kustomize 和 Helm 不同的是,Operator不应当被称作是一种工具或者系统,它应该算是一种封装、部署和管理 Kubernetes 应用的方法,尤其是针对最复杂的有状态应用去封装运维能力的解决方案,最早是由 CoreOS 公司(于 2018 年被 RedHat 收购)的华人程序员邓洪超提出的。
燃192
2023/04/11
5680
K8s应用为中心的封装Operator与OAM
使用 Jenkins + KubeVela 完成应用的持续交付
KubeVela 打通了应用与基础设施之间的交付管控的壁垒,相较于原生的 Kubernetes 对象,KubeVela 的 Application 更好地简化抽象了开发者需要关心的配置,将复杂的基础设施能力及编排细节留给了平台工程师。而 KubeVela 的 apiserver 则是进一步为开发者提供了使用 HTTP Request 直接操纵 Application 的途径,使得开发者即使没有 Kubernetes 的使用经验与集群访问权限也可以轻松部署自己的应用。
CNCF
2021/09/17
1.1K0
kubevela版本上的一些问题及解决方案
由于 vela 官方 charts 使用的镜像是 latest 的,直接构建需要做版本管理,将镜像tag设置为对应版本,比如,在使用v0.3.2版本时候:
机械视角
2021/04/30
1K0
云原生|KubeVela
在互联网与云计算技术发展的日新月异过去五年中,应用研发人员对效率与敏捷的极致追求,终于把业界带进了一个崭新的云原生时代。而云原生理念的迅速普及,火了 Docker,红了 Kubernetes ,也间接让一个编程语言成为了如今服务端的“当家花旦”。不消多讲,这位在云原生领域里正红的发紫的“角儿”,就是 Golang。
heidsoft
2020/12/14
1.3K0
云原生|KubeVela
使用 Jenkins 与 KubeVela 实现应用的持续交付
KubeVela 打通了应用与基础设施之间的交付管控的壁垒,相较于原生的 Kubernetes 对象,KubeVela 的 Application 更好地简化抽象了开发者需要关心的配置,将复杂的基础设施能力及编排细节留给了平台工程师。而 KubeVela 的 apiserver 则是进一步为开发者提供了使用 HTTP Request 直接操纵 Application 的途径,使得开发者即使没有 Kubernetes 的使用经验与集群访问权限也可以轻松部署自己的应用。
我是阳明
2023/10/23
4460
使用 Jenkins 与 KubeVela 实现应用的持续交付
相关推荐
5分钟带你快速入门和了解 OAM Kubernetes
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文