跳到主要内容

7.terraform多云管理平台

传统多云管理平台

在大多数企业不锁定供应商的前提下,引入多个云计算厂商已经成为了一种正常的情况。因此,人们自然而然地认为多云统一管理是必不可少的,但事实上,在绝大多数情况下,这是一个伪命题。或者说,真正解决多云管理的方法并不是所谓的多云管理平台。

在多云环境中,云厂商的产品种类繁多,API 复杂且不一致,导致多云管理平台无法实现真正的统一管理。即使有一些多云管理平台能够集成云厂商提供的 API,但由于 API 的不一致性和更新速度,这些平台也无法保证所谓的“统一管理”真正实现。因此,多云管理平台解决的是一个永远无法解决的问题。

由于云厂商本身的升级维护变更,多云管理平台的更新维护成本巨大。为了保持与云厂商API的兼容性,多云管理平台需要不断更新自己的代码以适应云厂商的变更。这使得多云管理平台的更新和维护成本变得很高。但是,多云管理平台带来的价值却很有限。企业不会为多云管理支付高昂的费用,因为这只是一种运维价值。此外,多云管理平台无法解决多云环境下的成本和资源管理混乱的问题。

这类平台要么就是停止维护,要么就是维护少的可怜的云厂商和其产品,我们可以看看下面两个产品:

mist.io

使用 python开发的多云管理平台,于2022年7月31日停止维护

华夏云网

其产品前身为 easyCloud,我们可以看见其支持的云厂商只有2个,产品寥寥无几。

现代化多云管理平台

docker 和 k8s 是解决软件运行环境不一致问题的行业标准,颠覆了应用部署方式,解除了云厂商之间的锁定。我们现在已经很难看到应用直接以二进制的方式部署在云主机。基础平台要为应用服务,所以我们必须转变思维,从原来管理cvm,网络,存储中解放出来,转而搭建基于 k8s 的现代化多云管理平台。

以 Kubernetes(通常简称为 K8s)为核心的多云管理平台,是一个能够管理、部署和扩展跨多个云环境(如Amazon Web Services, Microsoft Azure, Google Cloud等)的容器化应用程序的系统。使用Kubernetes作为多云管理的核心,可以帮助组织实现应用程序的一致性部署、扩展和管理。包括但不局限于 CI/CD,渐进部署,监控,应用市场,cloudIDE,混沌测试...

现代化多云管理平台大体可以分为三个部分

  • 在多个云厂商能一键部署 k8s
  • 能够在 k8s 上一键部署应用
  • 能够监控应用,持续迭代应用

笔者这里举例几个云平台,相信你一定听说过:kubesphere,rainbow,rancher,kubevela..

terraform 在现代化多云管理平台能做什么?

1.一键部署 k8s

我想一键部署 k8s 应该是 terraform 最擅长做的事,笔者实践了下使用 terraform 在腾讯云一键启动 k8s集群,使用了 腾讯云的节点池来创建 cvm 并绑定 k8s,使用节点池,你能够添加后备节点类型,防止 cvm 库存不足的尴尬局面。

以下是我的配置,你只需要填写自己的腾讯云 secretKey 和 secretID 和 节点类型 就可以一键启动腾讯云 k8s 集群:

terraform {
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
}
}
}

# Configure the TencentCloud Provider
provider "tencentcloud" {
region = "ap-shanghai"
secret_id = "****"
secret_key = "****"
}


resource "tencentcloud_vpc" "foo" {
name = "vpc-sandload-terraform-test"
cidr_block = "10.0.0.0/16"
dns_servers = ["183.60.83.19", "183.60.82.98"]
is_multicast = false
tags = {
"test" = "testassdd"
}
}

resource "tencentcloud_subnet" "foo" {
vpc_id = tencentcloud_vpc.foo.id
availability_zone = "ap-shanghai-4"
name = "vpc-sandload-terraform-test"
cidr_block = "10.0.1.0/24"
}



resource "tencentcloud_kubernetes_cluster" "managed_cluster" {
vpc_id = tencentcloud_vpc.foo.id
cluster_cidr = "172.16.0.0/20"
cluster_max_pod_num = 32
cluster_name = "terraform-test"
cluster_desc = "terraform-test desc"
cluster_max_service_num = 512
cluster_version = "1.24.4"
# managed_cluster_internet_security_policies = ["3.3.3.3", "1.1.1.1"]
cluster_deploy_type = "MANAGED_CLUSTER"
container_runtime = "containerd"
# cluster_os = "tlinux2.4x86_64"


labels = {
"test1" = "test1",
"test2" = "test2",
}
}



variable "default_instance_type" {
default = "SA2.MEDIUM4"
}

variable "default_backup_instance_types" {
default = ["S6.MEDIUM4"]
}

//this is one example of managing node using node pool
resource "tencentcloud_kubernetes_node_pool" "mynodepool" {
name = "mynodepool"
cluster_id = tencentcloud_kubernetes_cluster.managed_cluster.id
max_size = 2
min_size = 2
vpc_id = tencentcloud_vpc.foo.id
subnet_ids = [tencentcloud_subnet.foo.id]
retry_policy = "INCREMENTAL_INTERVALS"
desired_capacity = 2
enable_auto_scale = false
multi_zone_subnet_policy = "EQUALITY"

auto_scaling_config {
instance_type = var.default_instance_type
backup_instance_types = var.default_backup_instance_types
system_disk_type = "CLOUD_PREMIUM"
system_disk_size = "50"
security_group_ids = ["sg-gwxssjvq"]

data_disk {
disk_type = "CLOUD_PREMIUM"
disk_size = 50
}

internet_charge_type = "TRAFFIC_POSTPAID_BY_HOUR"
internet_max_bandwidth_out = 10
public_ip_assigned = true
password = "test123#"
enhanced_security_service = false
enhanced_monitor_service = false
host_name = "12.123.0.0"
host_name_style = "ORIGINAL"
}
}

2.提供一些常用云资源购买

这里我们来介绍下 bilibili 内部多云管理平台ARSE

整体采用分层架构,最顶层面向用户,提供用户的统一入口,用户通过统一前端完成资源的整个生命周期的管理,同时也提供接口;

中间层为业务逻辑层,主要功能分为项目管理、资产管理、用户管理、资源编排和成本管理,涵盖云资源的增删改查等操作以及生命周期的管理,同时也管理了多云的账单以及云上的用户账号;

  • 项目管理:主要是管理ARSE项目元信息,围绕项目管理多云资源、账号和账单;
  • 资产管理:主要是管理资源的资产信息,通过标准化,统一多云资产管理,消除多云的差异;
  • 用户管理:主要是全生命周期管理云上用户账号;
  • 资源编排:通过资源编排能力,帮助用户既可以自动部署单个资源,又可以处理复杂的联动资源的部署需求;
  • 成本管理:主要是对云上账单进行分析处理,提供成本可视化和用量数据,为平台运营提供成本优化的数据支持。

底层是引擎层,主要是通过IaC和api结合的形式对接各云厂商,完成所有上层动作的最终执行。

用户可以根据业务场景和资源选型,配置云服务器、RDS以及Redis等资源的参数配置,比如云服务器的镜像、机型,RDS和Redis的版本和规格等,如图所示,预先配置这些参数可以在资源申请阶段,不必在云厂商提供的少则几十种,多则上百种选项中筛选目标配置。优化了用户体验,提高了资源申请的效率,以云服务器的镜像和机型举例可以看出前后数量对比。

我们接下来讲解ARES如何利用Terraform的能力,经过优化来支持B站的云资源编排和管理,主要分为三个方面。

多云统一:

Terraform虽然可以使用代码管理基础设施,但是面对公有云,Terraform并没有解决多云异构的问题,还是需要每家厂商提供完善的Provider,需要用户针对不同的Provider去写tf文件,所以对于用户还是没有屏蔽多云的差异,ARSE从业务层去解决了多云统一的问题。主要思路为:

  • 对于第三节介绍的产品标准化和属性标准化,把经过标准化后的属性作为变量名,前端按照变量名对产品属性进行定义,对于多个厂商只需要定义一次,所有前端用户选择的value对于不同的厂商赋值给相同一份变量

  • 前端赋值后经过后端接口根据云厂商的不同,根据映射的对应云厂商的terraform的字段进行赋值,调用实际的厂商的Provider插件进行资源请求的执行

如图以云主机为例,不管选择的账号,ARES需要用户填写的label都是一致的,不因多云而改变,提供一致的用户体验。

参数模板:

每一次用户提交需求,前端变量值映射到后端的tf文件都需要重新生成一份tf文件,这里有两种方案:

  • 根据Terraform的语法规则,自动生成对应产品的resource

  • 本地化配置产品的Terraform模板,按照模板生产Terraform文件

考虑到基于语法自动生成Terraform相关文件有一定的难度,我们选择第二种方案,我们利用Terraform的variable关键字,定义多云下每个产品的模板,比如main_alicloud_template.tf文件,所有变量的value引用variable进行填充,这里有两个关键点:

value为多云统一后的变量名,比如云主机的机器名均为var.hostname

每个变量名按照variable文件的格式生成对应的变量声明和定义

做到如上两点,每当用户提交需求的时候会自动生成含有每个变量声明和定义的variable.tf文件,同时实例化一份模板文件main.tf,组成一份可执行的完整tf环境

3.管理k8s

terraform 官方提供了 k8s provider ,想来是想帮助我们简化 k8s 的使用,不过笔者认为这方面用处不大,因为 k8s 本身就是声明式配置。