原创 吴就业 155 0 2023-07-23
本文为博主原创文章,未经博主允许不得转载。
本文链接:https://wujiuye.com/article/94eeec057df54421b70c981dadfee18e
作者:吴就业
链接:https://wujiuye.com/article/94eeec057df54421b70c981dadfee18e
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。
通过前面的章节,我们已经学习了解terraform,并通过vpc资源例子,为私有云/混合云开发了terraform provider,这一节介绍如何将我们开发的mycloud terraform provider整合到kubevela控制平台上,以通过在application中声明一个kubevela组件的方式去申请基础设施资源。
我们需要将mycloud terraform provider包装成kubevela可安装的Addon插件,并且通过提供私有云基础设施资源对应的terraform module,用来生成kubevela中的组件定义,这样我们才能够在application部署描述文件中,通过为应用添加组件的方式,声明使用我们的基础设施资源。
为前面我们自己实现的mycloud terraform provider编写kubevela terraform provider插件:terraform-mycloud。
在kubevela中,一个Addon插件,主要包含:
├── resources/
│ ├── xxx.cue
│ └── xxx.yaml
│ ├── parameter.cue
├── definitions/
│ ├── xxx.yaml
│ ├── xxx.cue
├── schemas/
│ ├── xxx.yaml
├── config-templates/
│ ├── xxx.cue
├── README.md
├── metadata.yaml
├── parameter.cue
└── template.yaml
└── NOTES.cue
插件配置信息:metadata.yaml(必须的)
name:插件名称
version:插件版本
description:插件描述
icon:插件图标,图标将在 VelaUX 的插件页面展示
url:插件所包含项目的官网地址
tags:标签
dependencies:依赖的其他插件
system:部署环境版本要求
deployTo:
needNamespace:数组,如果不存在需要创建的namespace
annotations:注解,map类型
Application模版文件:template.yaml或template.cue(非必需)
插件说明/使用文档:README.md(非必需)
模块定义:definitions(非必需)
UI扩展,主要用于VelaUX展示模块定义:schemas(非必需)
插件应用描述:resources(非必须)
配置模版:config-templates(非必需)
安装插件时需要配置的参数:
NOTES.cue:安装插件时,缺少参数的提示文件(非必需)
实现terraform-mycloud插件:
其中template.yaml、readme.md、schemes这些文件不做解释。
metadata.yaml
name: terraform-mycloud
version: 1.0.0
description: Kubernetes Terraform Controller for wujiuye-Mycloud
tags:
- Terraform Provider
- Cloud Resource
deployTo:
control_plane: true
runtime_cluster: false
dependencies:
- name: terraform
system:
vela: ">=v1.6.0-alpha.6"
metadata文件声明了插件名为terraform-mycloud,版本为1.0.0,只部署到管控集群,依赖terraform插件,要求kubevela版本>=v1.6.0。
为什么需要依赖terraform插件?官方文档写到:“如果一个插件声明了模块定义,即提供模块化能力(definition),那么这个插件的背后一定是有一个Operator支持实现功能的”。因为我们需要为每种云资源生成组件,所以terraform-mycloud需要terraform插件背后的terraforn-controller这个Operator的支持。
模块定义(definitions),terraform-mycloud是一个terraform provider插件,所以模块定义主要是生成terraform类型的组件资源对象,以mycloud-vpc为例:
terraform-mycloud-vpc.yaml
apiVersion: core.oam.dev/v1beta1
kind: ComponentDefinition
metadata:
annotations:
definition.oam.dev/description: Terraform configuration for Mycloud VPC
creationTimestamp: null
labels:
type: terraform
name: mycloud-vpc
namespace: vela-system
spec:
schematic:
terraform:
configuration: |
terraform {
required_providers {
irock = {
source = "registry.terraform.io/wujiuye/mycloud"
}
}
}
variable "name" {
type = string
default = ""
validation {
condition = var.name != ""
error_message = "VPC name Required."
}
}
variable "ip_capacity" {
type = number
default = 0
validation {
condition = var.ip_capacity != 0
error_message = "Required."
}
}
resource "mycloud_vpc" "example" {
name = var.name
ip_capacity = var.ip_capacity
}
output "id" {
value = mycloud_vpc.example.id
}
workload:
definition:
apiVersion: terraform.core.oam.dev/v1beta2
kind: Configuration
status: {}
到目前为止,一个只提供mycloud-vpc组件的terraform-mycloud插件已经开发完成,已经可以用vela addon enable命令安装。
由于我们没有开发为mycloud-vpc生成scheme,如果在VelaUX上看这个mycloud-vpc组件,可能并不友好。
另外,我们还创建了一个配置模版,在config-templates目录下,用的是CUE语言(类似terraform的HCL,是一种描述型语言)。
import "strings"
metadata: {
name: "terraform-mycloud"
alias: "Terraform Provider for Mycloud"
description: "Terraform Provider for Mycloud"
sensitive: true
scope: "system"
}
template: {
outputs: {
"provider": {
apiVersion: "terraform.core.oam.dev/v1beta1"
kind: "Provider"
metadata: {
name: parameter.name
namespace: "default"
labels: l
}
spec: {
provider: "custom"
credentials: {
source: "Secret"
secretRef: {
namespace: context.namespace
name: context.name
key: "credentials"
}
}
}
}}
output: {
apiVersion: "v1"
kind: "Secret"
metadata: {
name: context.name
namespace: context.namespace
labels: l
}
type: "Opaque"
stringData: credentials: strings.Join([creds1, creds2, creds3, creds4], "\n")
}
creds1: "ENDPOINT: " + parameter.MYCLOUD_ENNDPOINT
creds2: "TOKEN: " + parameter.MYCLOUD_TOKEN
l: {
"config.oam.dev/catalog": "velacore-config"
"config.oam.dev/type": "terraform-provider"
"config.oam.dev/provider": "terraform-mycloud"
}
parameter: {
//+usage=The name of Terraform Provider for IRock
name: string
ENDPOINT: string
TOKEN: string
}
}
前面案例中,我们给alibaba-vpc组件配置了providerRef,并使用vela config create命令创建了Provider资源,其实就是使用了terraform-alibaba插件提供的配置模版创建Provider资源。
此配置模版名称为terraform-mycloud,并且要求输入参数包括:name、ENDPOINT、TOKEN几个参数,然后kubevela会创建出一个Provider资源对象以及Provider资源对象引用的Secret资源对象。这样就不需要我们手动自己先去创建一个Secret资源对象、再创建Provider资源对象,方便使用。
声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。
kubevela安装一个Application的过程,就是执行工作流上的每个步骤的过程,并且当我们未配置工作流,kubevela会自动为组件的部署生成一个工作流步骤。
erraform-controller是一个专门负责terraform一类的组件"安装"的Operator,通过打包成helm,再封装成kubevela的Addon,由kubevela安装到管控集群,为其它terraform provider插件提供模块定义支持。
KubeVela是面向混合云环境的应用交付控制面,不与任何云产商绑定。KubeVela通过提供插件扩展机制,打通了应用交付涉及的基础设施即代码-terraform等能力。编写一个符合OAM模型的application.yaml就能实现将应用部署起来,包括申请基础设施。实现了声明式部署,且一次编写,到处部署。
订阅
订阅新文章发布通知吧,不错过精彩内容!
输入邮箱,提交后我们会给您发送一封邮件,您需点击邮件中的链接完成订阅设置。