在上期云原生专栏文章中(没有addon的生态,是个不够开放的生态),我们初步探索了 KubeVela 中的 addon,了解到 KubeVela 中为什么需要 addon,并在最后以一个简单的小例子说明了如何自定义 addon。

那么在本期文章中,我们将回应在上期文末留下的悬念,带你继续深入了解 addon 在 KubeVela 中的应用——如何用 addon 拓展 KubeVela 模块。

一、什么是模块定义

1.1 为什么需要模块定义?

addon 部署应用的对象一般是一些只需要部署一次的应用,比如 KubeVela 的 UX,或者一些通用的中间件等。

但是在实际使用中,通常用户有着不一样的需求,比如:

  • 在部署服务 A 时,需要一个定制参数的中间件。
  • 在部署服务 B 时,需要不同的工作流节点。

在这种场景下,就可以通过 addon 带来模块定义,在部署应用的时候选择不同的组件类型,不同的工作流节点类型。

1.2 什么是模块定义?

KubeVela 模块定义,使用 CUE 交付完整的模块化功能,使得平台可以随着用户需求变化动态扩展功能,适应各类用户和场景,满足公司业务长期发展的迭代诉求。

以下面部署一个简单应用为例:

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:name: nginx-app
spec:components:- name: nginx-servertype: webserviceproperties:image: nginx:latestport: 80traits:- type: ingress-1-20properties:domain: dcone.digitalchina.comhttp:"/": 80

注意,这里使用了一个component(组件)的类型 webservice。

这就是组件定义(ComponentDefinition)。这种定义将任何类型的可部署制品封装成待交付的“组件”。

只要定义好之后,这种类型的组件就可以被用户在部署计划(Application)中引用、实例化并交付出去。

除此之外,还有下列定义可以在模块定义中查看相关信息:

  • 运维特征定义(TraitDefinition)
  • 应用策略定义(PolicyDefinition)
  • 工作流节点定义(WorkflowStepDefinition)

1.3 什么是模块定义?

模块定义可以通过 cue 或者 yaml 配置文件引入,同样也可以使用 addon 的方式引入,此外将其做成一个addon 还便于更多的用户使用。


那么接下来我们就尝试使用 addon 引入自己的模块定义


二、addon拓展模块

1.1 模块定义的引入步骤

Step 1:创建addon目录结构

根据官方文档中 addon 的说明,创建 addon 目录结构。

├── resources/├── definitions/
│   ├── myredis.cue
├── schemas/
│   ├── component-uischema-myredis.yaml
├── README.md
├── metadata.yaml
└── template.yaml

Step 2:编写元数据文件和应用模板

metadata.yaml

name: myredis
version: 1.0.0
description: Example adddon.
icon: icon/niu.jpeg
url: example.comtags:- only_exampledeployTo:runtimeCluster: false

template.yaml

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:name: redisnamespace: vela-system
spec:

这里我们并没有创建应用,所以不需要在组件资源 (resources) 目录中写配置文件,所以略过。

Step 3:编写模块定义文件

因为我们需要自定义我们自己的模块,所以需要在模块定义文件 (definitions) 目录下编写模块定义文件,这里我简单的用 cue 编写了一个 redis 的模块。

myredis.cue
import("encoding/base64"
)
"myredis": {annotations: {}attributes: workload: definition: {apiVersion: "apps/v1"kind: "Deployment"}description: "My Redis component."labels: {}type: "component"
}template: {output: {apiVersion: "v1"kind: "ConfigMap"metadata: {name: "redis-config"labels: app: context.name}data: {"redis.conf": """dir /dataport 6379bind 0.0.0.0appendonly yesprotected-mode nopidfile /data/redis-6379.pidrequirepass""" + " "  + parameter.redisPassword}}outputs: {redis: {apiVersion: "apps/v1"kind: "Deployment"metadata: {name: "redis"labels: app: context.name}spec: {replicas: 1selector: matchLabels: app: context.nametemplate: {metadata: labels: app: context.namespec: {containers: [{name: context.namecommand: ["sh", "-c", "redis-server /usr/local/etc/redis/redis.conf"]image: "redis:6.2.6"ports: [{containerPort: 6379}]volumeMounts: [{name:      "data"mountPath: "/data"}, {name:      "config"mountPath: "/usr/local/etc/redis/redis.conf"subPath:   "redis.conf"}]}]volumes: [{name: "data"hostPath: path: parameter.hostPath}, {name: "config"configMap: name: "redis-config"}]}}}}web: {apiVersion: "v1"kind:       "Service"metadata: {name: context.namelabels: app: context.name}spec: {ports: [{name: context.nameport: 6379targetPort: 6379}]selector: app: context.nametype: parameter.serviceType}}secret: {apiVersion: "v1"kind:       "Secret"metadata: {name: "myredis-secret"}type: "Opaque"data: {password: base64.Encode(null,parameter.redisPassword)ip: base64.Encode(null,context.name + "." + context.namespace + ".svc.cluster.local")port: base64.Encode(null,"6379")}}}parameter: {hostPath: *"/home/k8s/redis/data1" | stringserviceType: *"ClusterIP" | "NodePort"redisPassword: *"123456" | string}
}

说明:

  • 这里创建 secret 是为了部署 web 应用的时候,通过 kubevela 的 service-binding 将 redis 的 ip 和端口,通过环境变量的方式注入 web 容器
  • 因为 k8s 机制,secret 必须要 base64 编码,所以引入了 "encoding/base64" 包。
  • CUE 有很多 internal packages 可以被 KubeVela 使用,这样可以满足更多的开发需求。

看到这里就有读者一脑子问号了,这cue文件好麻烦啊,没有用过怎么办,有点学习成本啊。

什么是CUE

其实 cue 就是 Json 的超集,并且内置了 golang 的一些包。

具体的可以参考 cue,其最后也是会将 cue 文件转换为 yaml 文件执行,也就是说定义模块的时候,使用 yaml 也是可以的。

但是 yaml 文件不能做到参数的自定义化,比如定义一个变量,写一个判断语句等,而 cue 可以。特别是用户在使用一个模块的时候,会根据不同的需求去定义不同的配置,所以一般会使用较为灵活的 cue。

诶说了这么多 cue 的优点,但是看着这长长的文件还是有点头疼,有没有一个快速生成模块定义模板的方法呢?

还真有!

1.2 模块定义“速成法”

考虑到维护人员不熟悉 cue 的情况下,KubeVela CLI 提供了vela def init 这个命令,其可以将一个 yaml 文件转换成一个模块定义的 cue 文件。

一个实例

比如这里我有一个 yaml 文件,其内容就是一个 K8S 的manifest:

apiVersion: "apps/v1"
kind: "Deployment"
spec:selector:matchLabels:"app.oam.dev/component": "name"template:metadata:labels:"app.oam.dev/component": "name"spec:containers: - name: "name"image: "image"

使用下方命令:

vela def init stateless -t component --template-yaml ./stateless.yaml -o stateless.cue

将其变成一个 ComponentDefinition 模板:

stateless: {annotations: {}attributes: workload: definition: {apiVersion: "<change me> apps/v1"kind:       "<change me> Deployment"}description: ""labels: {}type: "component"
}template: {output: {spec: {selector: matchLabels: "app.oam.dev/component": "name"template: {metadata: labels: "app.oam.dev/component": "name"spec: containers: [{name:  "name"image: "image"}]}}apiVersion: "apps/v1"kind:       "Deployment"}outputs: {}parameters: {}
}

这样就有一个模板,在此基础上进行修改。

修改完成后可以用 vela def vet 做一下格式检查和校验,这样一个模块定义的文件就完成了。

1.3 相关说明

  • 对schemas目录的说明

在 addon 目录结构中还有一个模版参数展示增强文件 (schemas) 目录,其用于存放 X-Definitions 所对应的 UI-schema 文件,用于在 UX 中展示 X-Definitions 所需要填写参数时增强显示效果。

  • 对myredis.cue文件中相关参数显示的说明

在上面的 myredis.cue 文件中,有一些自定的变量参数parameter:

hostPath、serviceType、redisPassword。

这些是给用户在使用这个组件时传入的值。如果希望用户能够在 UX 中看到这些值,则需要配置对应的 yaml 文件。

只有正确配置组件中所有的 parameter 字段,才能够在 UX 中看到自定义的组件。

component-uischema-myredis.yaml

- jsonKey: hostPathlable: hostPathsort: 1
- jsonKey: serviceTypelable: Service Typesort: 2
- jsonkey: redisPasswordlable: Redis Passwordsort: 3

说明:

这个文件的文件名不重要,重要的是其内容中的 jsonKey 的值必须要与 cue 中 parameter 中定义的变量名一致。


这样就完成了一个简单的模块,

接下来我们就尝试将其安装在我们的KubeVela中


三、启动Addon使用新的模块

3.1 启动Addon

在 CentOS7 上使用命令安装这个 addon:

# 将项目clone到本地
$ cd /home
$ git clone http://xxxxx# 进入代码根目录,使用CLI 启用插件
$ cd /home/kubevela-addon
$ vela addon enable .

使用vela addon ls 查看插件:

使用 vela component 查看组件,可以看到我们自定义的组件:

3.2 部署应用、添加模块

Step1:相关文件准备

deploy.yaml

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:name: redis-demonamespace: default
spec:components:- name: redistype: myredisproperties:serviceType: NodePort- name: webtype: webserviceproperties:image: harbor.dev.wh.digitalchina.com/kubevela/kubevela-demo:latestport: 8080traits:- type: service-bindingproperties:envMappings:REDIS_PASSWORD:secret: myredis-secretkey: passwordREDIS_IP:secret: myredis-secretkey: ipREDIS_PORT:secret: myredis-secretkey: port- name: servicetype: k8s-objectsproperties:objects:- apiVersion: v1kind: Servicemetadata:name: weblabels:app: webspec:type: NodePortports:- name: webport: 8080targetPort: 8080nodePort: 30080selector:app.oam.dev/component: web

说明:

  • 这里的第一个 component 选择的 type 就是我们自定义的 myredis,并且设定 serviceType 值为 NodePort,这个值写在 myredis.cue 中,表示启动 redis 后,创建的 service 类型是 NodePort。
  • 这里的 webservice 应用使用的镜像,是一个标准的 SpringBoot 项目,内部引入了 Redisson 客户端访问 redis。

如下是 SpringBoot 配置文件:

spring:
...redis:redisson:config: |singleServerConfig:...password: ${REDIS_PASSWORD}address: 'redis://${REDIS_IP}:${REDIS_PORT}'...

我们使用环境变量的方式访问 reids。

Step2:应用部署

使用命令部署 application:

$ vela up -f deploy.yaml

使用 vela ls查看部署的应用:

应用正常启动,下面使用 kubectl 工具查看 k8s 资源:

成功创建资源,和我们在 myredis.cue 中定义的资源一样。

最后我们访问项目,看看其能不能通过 service-binding 访问到 redis:

通过接口测试,项目正常访问 redis。


那么以上就是如何用 addon

拓展 KubeVela 模块的故事了,

相信你对 addon 的应用又有了更加深入的了解~

拓展KubeVela模块,看addon如何助力开放生态相关推荐

  1. 基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS

    作者 | 孙健波(天元) 来源 | 阿里巴巴云原生公众号 如今,围绕 Kubernetes 构建应用交付平台已经逐渐成为共识. Kubernetes 生态本身的能力池固然是丰富的,但社区里并没有一个可 ...

  2. ​rsync应用拓展多模块同步13

    rsync应用拓展多模块同步13说明:本文来自来自北京老男孩linux运维实战培训中心-运维就业课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog.51cto. ...

  3. A10:怎么利用容器技术,助力开放银行建设

    近几年,随着金融市场改革与金融科技兴起,国内不少银行积极探索,逐步向开放银行转型,打造"平台+生态"的新型商业模式.例如,浦发银行2018年7月向外发布了"API Ban ...

  4. 腾讯汤道生:产业互联网开放生态已初步形成,2021加大SaaS生态建设|CEO说

    关注ITValue,看企业级最新鲜.最价值报道! 钛媒体APP注:日前,腾讯公司高级执行副总裁.腾讯云与智慧产业事业群总裁汤道生在2021腾讯云启产业生态年会上,发表<云启生态 共建未来> ...

  5. 重磅 | 华为发布绝杀计算战略!投15亿美元打造开放生态,全球最快AI训练集群Atlas 900,绝了!...

          戳蓝字"CSDN云计算"关注我们哦! 文 | 阿晶.丹丹.王银发于上海华为HC大会现场 出品 | CSDN云计算(ID:CSDNcloud) 科技的不断发展正逐步加速智 ...

  6. 从RTE2022大会 看声网实时互动生态的未来

    "一人智谋短,众人智谋长." 在一个企业里,团队合作可以更高效地拿到结果,而在一个产业中,行业交流平台是推进产业发展的重要力量,尤其是在需要高速发展的新兴垂直行业里,行业交流显得尤 ...

  7. 绿色消费积分,共建开放生态,让消费变投资

    随着市场的逐渐饱和,不断推出新产品.开拓推广渠道.增加客户量是商家想要实现可持续发展的生存之道.商家为了刺激消费,可以说是无所不用,但还是面临着缺少新用户,推广难,客户活跃度低,复购率低等痛点. 商家 ...

  8. 对话MOV | DeFi2020——如何从开放应用走向开放生态?

    3月30日,MOV正式上线. MOV是什么? 下一代去中心跨链Layer2价值交换协议? 一个异构融合的多样性资产价值交换协作生态? MOV想给谁用? 怎么玩转MOV? 团队为什么要做MOV? ... ...

  9. 人工智能交互暗战迭起,开放生态成竞争赛点

    作为早于人工智能大潮出现的产品形态,AI助手某种程度上并不是什么新奇事物,但随着人工智能的日趋火热,围绕智能终端的AI助手之争又再度成为焦点. 一直以来,各大巨头,无论新旧对此领域都非常关注,前赴后继 ...

最新文章

  1. [转] PuTTY + Xming 远程使用 Linux GUI
  2. CICC科普栏目|神经网络浅讲:从神经元到深度学习
  3. 皮一皮:所以说女生的好奇心不能太大...
  4. javascript rsa java,用javascript与java执行 RSA加密与解密
  5. 证券一哥炼成记——郭树清
  6. POD – Proof of Delivery
  7. 【机器学习基础】前置知识(五):30分钟掌握常用Matplotlib用法
  8. Jaxb对xml报文头的小修小改
  9. HH SaaS电商系统的跨境商品展示、下单、清关、出库全流程设计
  10. 2011年的MVP礼包
  11. php默认语法,php基本语法
  12. 中国平安云桌面的地址
  13. OpenCV-Sobel边缘检测
  14. python写的crf训练代码
  15. (字符串)ZigZag Conversion
  16. java 汉字占几个字节_Java中一个汉字占用几个字节
  17. ⚡自组织映射(SOM)神经网络⚡Python实现 |Python技能树征题
  18. c 语言ifelse语句的用法,C 语言 if...else 语句
  19. GEE|影像可视化|导出分类结果图像
  20. windows桌面动态主题_学习Windows 7:桌面主题和背景

热门文章

  1. MYSQL下载后的使用方法
  2. 谷歌浏览器如何安装插件
  3. 水井坊VS舍得酒业,谁是A股川酒“老三“?
  4. Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】...
  5. vue-cli2.x旧版本卸载不掉的问题解决方案(亲测+踩坑)附Vue脚手架安装教程
  6. “牵一发而动全身”——我用观察者模式简单模拟吃鸡
  7. 相忘江湖不如相濡以沫(III)
  8. 【CSS】背景样式(颜色、图片、平铺、附着和位置)
  9. b站视频详情数据抓取,自动打包并发送到指定邮箱(单个或者群发)
  10. windows 剪贴板监控