KubeVela篇05:为kubevela开发terraform-mycloud Addon插件

原创 吴就业 166 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

实现terraform-mycloud插件:

实现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篇08:一个组件的输出作为另一个组件的输入案例及传递原理

kubevela安装一个Application的过程,就是执行工作流上的每个步骤的过程,并且当我们未配置工作流,kubevela会自动为组件的部署生成一个工作流步骤。

KubeVela篇07:terraform controller实现原理

erraform-controller是一个专门负责terraform一类的组件"安装"的Operator,通过打包成helm,再封装成kubevela的Addon,由kubevela安装到管控集群,为其它terraform provider插件提供模块定义支持。

KubeVela篇06:Kubevela Addon插件安装原理

terraform插件的安装过程;terraform provider插件的安装过程。

KubeVela篇04:KubeVela打通Terraform申请云资源

以使用阿里云的基础设施为例,理解KubeVela打通Terraform申请云资源。

KubeVela篇03:了解KubeVela安装一个应用的过程

以一个简单的first-vela-app应用在kubevela上部署为例,介绍应用安装流程。

KubeVela篇02:初识KubeVela,进一步理解OAM模型

KubeVela是面向混合云环境的应用交付控制面,不与任何云产商绑定。KubeVela通过提供插件扩展机制,打通了应用交付涉及的基础设施即代码-terraform等能力。编写一个符合OAM模型的application.yaml就能实现将应用部署起来,包括申请基础设施。实现了声明式部署,且一次编写,到处部署。