kubevela 的 terraform addon 插件是通过 controllor和 crd(Provider,Configuration)来实现和 terraform 一样的功能。
其核心原理在于terraform controllor通过监控Provider、Configuration 的变更来实现具体的操作。
在上面的 controller 架构图中我们可以看到,在整个 terraform controllor 中一共对两个资源进行了监控即:
实现了两个 controllor ,即:
如果希望实现 terraform 对特定云上资源的控制,首先需要保证 terraform controllor 中支持对应的云Provider,否则需要添加对于特定云的 Provider 的支持。
那么又该如何添加 Provider 对于特定云资源的支持呢?
具体的修改可以参照 controllors/provider 中的一些其他云的代码进行修改。
然后在同目录中的credentials文件中的GetProviderCredentials 函数中,添加对应的云的凭证的解析的调用,否则在 Provider controllor 进行 reconcile 调用时(检验参数即是否支持对应的云资源调用)会报错。
当配置了 Configuration 时,Configuration controllor 会生成 job,通过 job 来生成一个基于 terraform 镜像的 pod,然后将配置放到对应的 pod 中进行执行。
所以如果需要生成对对应的云的上资源的创建等操作,还有一个隐性的条件就是 terraform 本身支持对应的云的操作,可以通过 terraform 的网站进行查询 terraform 是否支持了对应的云运营商。
当需要进行一些针对于华为云的指定资源操作(不仅限于 cce 集群)时,可以提前编写对应的华为云的provider的addon,然后在其中编写对应的 configuration 的文件。
其中的具体内容支持在集群的 configMap 中存储也可以放在 GitHub 的库中的文件中存储存储。
华为云文档:
https://support.huaweicloud.com/usermanual-terraform/terraform_0015.html
terraform对于华为云支持的文档:
https://registry.terraform.io/providers/huaweicloud/huaweicloud/latest/docs/resources/cce_addon
Step 1: 启动组件
Step 2: 创建华为云 provider
创建应用并将主组件设置为华为的 terraform:
填入对应的华为云账号的 ak,sk,以及要控制的资源的 region(地区)例如:cn-north-4,北京4
Step 3:创建要控制的资源
可以选择 cce 相关内容的资源包括 vpc,cce 集群或将已存在 node 加入集群等。
如下例创建的为华为 vpc:
deleteresource选项:当kubevela中删除这个application时,对应的删除对应的华为云资源。
区域:选择需要控制的资源所在区域。
provider ref:为之前创建的 provide 的名称和命名空间名称,选择上一步创建的 provide 的名称和部署的命名空间。
Step 4:创建并部署
最后一步是创建并部署,kubevela 会在对应的华为云账号的对应区域下创建一个 vpc 资源。
如果需要根据自己的需求创建云资源,可以更改对应的 terraform huawei 的 definitions 下的对应的componentDefinition,将其中的 configuration 的内容改为对应资源的创建的 HCL 语句。
由上图看出 terraform 通过编写 HCL 语句来控制云资源。
HCL 语句会通过特定的 provider 来进行解析,可以将 provider 理解为驱动的概念,provider 中通过解析 HCL 语法来调用华为云的特定网络接口,并通过 ak/sk 来认证,以此创建操作对应的云资源。
terraform 控制资源在逻辑上可以分为两部分,其一是terraform core,另一部分则是terraform plugins:
从以上我们可以知道 terraform 分为了两部分:
其中core部分支持提供一种通用的方式来声明 resource,即 HCL 语法。
但是实际的创建不同云的资源,实际是由 provider 中,通过不同的云的 sdk 来对 HCL 中声明的资源,来进行创建和更新。
所以如果我们拥有了某个云的 sdk 或者 API,我们则可以通过实现 provider 的方式,来将特定的云集成到 terraform 中。
我们可以直接通过 HCL 来创建特定的云的资源,同时针对这种架构方式,我们不仅可以集成云资源,同样的我们也可以使用这种声明的方式来操作一些提供了API或sdk的组件,例如k8s,consul等(terraform已经支持了k8s等provider)。
#1:
首先 main.go 文件启动了一个由 terraform sdk 封装的 server,来启动一个 grpc 服务。
#2:
随后通过 provider 函数来生成一 Provider 对象。
通过 provider 对象中的字段可以观察到这对应的就是 HCL 语句中声明的一些资源。
所以 HCL 语句中声明的资源会映射到对应的字段中例如 resource 类型的 cce cluster,会被抽象为 sdk 中的 Resource 对象,其中这个对象包含了这个资源应该如何去创建读取更新和删除的函数。
#3:
我们观察对应的创建函数,可以看到首先获取了一个抽象的 cceclient ,即从 sdk 中继承的 providerclient,其中包含了url 和鉴权信息等。
然后构造出对应的创建 option,并将 HCL 中的一些参数加入进去。
然后通过 sdk 中的 create 函数来进行创建,实际则是通过调用 OpenAPI 即华为公网网络接口来进行创建。
但是私有云 cce 服务并没有办法通过华为云的公有云接口去控制,并且 terraform 也不支持直接控制cce,所以 terrafrom 无法对私有云的 cce 进行操作。
但是如果希望实现 terraform 对私有云 cce 的支持,则需要有对应的私有云 cce 的 API 或 sdk 提供来自己实现 provider。
同理对于灵雀云的 cnp 等亦是同样的方式,如果我们有了对应的 API, 我们则可以通过实现 terraform provider的方式来将对应的云资源控制集成到terraform 中。