开发者社区> 凌云Cloud> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

基于 K8S 的云原生 PaaS 平台基础架构 - 基于 terraform 进行云资源的高效编排

简介: 基于 k8S 云原生基础架构系列
+关注继续查看

简介

HashiCorp Terraform 是一个IT基础架构自动化编排工具,可以用代码来管理维护 IT 资源。Terraform的命令行接口 (CLI) 提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储帐户和网络接口。


Terraform是一个高度可扩展的工具,通过 Provider 来支持新的基础架构。Terraform能够让您在云上轻松使用 简单模板语言 来定义、预览和部署云基础结构。您可以使用Terraform来创建、修改、删除ECS、VPC、RDS、SLB等多种资源。相比其他开源资源管理工具,Terraform具有如下优势:

  • 将基础结构部署到多个云
    Terraform适用于多云方案,将相类似的基础结构部署到阿里云、其他云提供商或者本地数据中心。开发人员能够使用相同的工具和相似的配置文件同时管理不同云提供商的资源。
  • 自动化管理基础结构
    Terraform能够创建配置文件的模板,以可重复、可预测的方式定义、预配和配置ECS资源,减少因人为因素导致的部署和管理错误。能够多次部署同一模板,创建相同的开发、测试和生产环境。
  • 基础架构即代码(Infrastructure as Code)
    可以用代码来管理维护资源。允许保存基础设施状态,从而使您能够跟踪对系统(基础设施即代码)中不同组件所做的更改,并与其他人共享这些配置 。
  • 降低开发成本
    您通过按需创建开发和部署环境来降低成本。并且,您可以在系统更改之前进行评估。


场景概述

本文介绍如何基于 Terraform 来实现对一个经典的云基础架构自动化编排创建。

该架构包含云服务器 ECS,负载均衡服务器 SLB,数据库实例 RDS,承载计算资源的网络资源 VPC、VSwitch和安全组,以及持久化存储 OSS。本文将通过已经开源的一个Module classic-load-balance 来实现改架构的一键创建。


架构图

image.png

资源清单

这里以阿里云的云资源为例

资源名称

说明

官网链接

alicloud_instance

创建 ECS 实例

https://www.terraform.io/docs/providers/alicloud/r/instance.html

alicloud_vpc

新建专有网络

https://www.terraform.io/docs/providers/alicloud/r/vpc.html

alicloud_vswitch

新建交换机

https://www.terraform.io/docs/providers/alicloud/r/vswitch.html

alicloud_slb

创建LoadBalancer

https://www.terraform.io/docs/providers/alicloud/r/slb.html

alicloud_slb_listener

创建负载均衡监听

https://www.terraform.io/docs/providers/alicloud/r/slb_listener.html

alicloud_slb_attachment

挂载 ECS 实例

https://www.terraform.io/docs/providers/alicloud/r/slb_attachment.html

alicloud_security_group

创建安全组

https://www.terraform.io/docs/providers/alicloud/r/security_group.html

alicloud_security_group_rule

创建安全组规则

https://www.terraform.io/docs/providers/alicloud/r/security_group_rule.html

alicloud_db_instance

创建数据库实例

https://www.terraform.io/docs/providers/alicloud/r/db_instance.html

alicloud_db_database

创建数据库

https://www.terraform.io/docs/providers/alicloud/r/db_database.html

alicloud_db_account

创建数据库账号

https://www.terraform.io/docs/providers/alicloud/r/db_account.html

alicloud_oss_bucket

创建 OSS bucket

https://www.terraform.io/docs/providers/alicloud/r/oss_bucket.html


最佳实践模板

根据模板,Terraform 将基于Module 提供的模板首先创建出计算资源所需要的网络环境VPC,VSwitch,SLB以及安全组,接着在该网络环境中创建ECS,RDS等计算资源,接下来将在SLB中增加监听并将ECS Instance挂载到SLB上,成为其的后端服务器。除此之外,需要给RDS实例创建数据库和数据库账号,以及创建OSS Bucket用于持久化数据。

// Images data source for image_id
data "alicloud_images" "default" {
  most_recent = true
  owners      = "system"
  name_regex  = "${var.image_name_regex}"
}

// Instance_types data source for instance_type
data "alicloud_instance_types" "default" {
  cpu_core_count = "${var.cpu_core_count}"
  memory_size    = "${var.memory_size}"
}

// Zones data source for availability_zone
data "alicloud_zones" "default" {
  available_instance_type     = "${data.alicloud_instance_types.default.instance_types.0.id}"
  available_resource_creation = "Rds"
}

// If there is not specifying vpc_id, the module will launch a new vpc
resource "alicloud_vpc" "vpc" {
  count      = "${var.vpc_id == "" ? 1 : 0}"
  cidr_block = "${var.vpc_cidr}"
  name       = "${var.vpc_name == "" ? var.resource_group_name : var.vpc_name}"
}

// According to the vswitch cidr blocks to launch several vswitches
resource "alicloud_vswitch" "vswitches" {
  count             = "${length(var.vswitch_ids) > 0 ? 0 : length(var.vswitch_cidrs)}"
  vpc_id            = "${var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id}"
  cidr_block        = "${element(var.vswitch_cidrs, count.index)}"
  availability_zone = "${lookup(data.alicloud_zones.default.zones[count.index], "id")}"
  name              = "${var.vswitch_name_prefix == "" ? format("%s-%s", var.resource_group_name, format(var.number_format, count.index+1)) : format("%s-%s", var.vswitch_name_prefix, format(var.number_format, count.index+1))}"
}

// Security Group Resource for Module
resource "alicloud_security_group" "default" {
  vpc_id = "${var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id}"
  name   = "${var.group_name == "" ? var.resource_group_name : var.group_name}"
}

// ECS Instance Resource for Web Tier
resource "alicloud_instance" "web" {
  count = "${var.number_of_web_instances}"

  image_id        = "${var.image_id == "" ? data.alicloud_images.default.images.0.id : var.image_id }"
  instance_type   = "${var.instance_type == "" ? data.alicloud_instance_types.default.instance_types.0.id : var.instance_type}"
  security_groups = ["${ alicloud_security_group.default.id }"]

  instance_name = "${var.number_of_web_instances < 2 ? var.web_instance_name : format("%s-%s", var.web_instance_name, format(var.number_format, count.index+1))}"
  host_name     = "${var.number_of_web_instances < 2 ? var.web_host_name : format("%s-%s", var.web_host_name, format(var.number_format, count.index+1))}"

  internet_charge_type       = "${var.internet_charge_type}"
  internet_max_bandwidth_out = "${var.internet_max_bandwidth_out}"

  instance_charge_type = "${var.instance_charge_type}"
  system_disk_category = "${var.system_category}"
  system_disk_size     = "${var.system_size}"

  password = "${var.ecs_password}"

  vswitch_id = "${length(var.vswitch_ids) > 0 ? element(split(",", join(",", var.vswitch_ids)), count.index%length(split(",", join(",", var.vswitch_ids)))) : length(var.vswitch_cidrs) < 1 ? "" : element(split(",", join(",", alicloud_vswitch.vswitches.*.id)), count.index%length(split(",", join(",", alicloud_vswitch.vswitches.*.id))))}"

  period      = "${var.period}"
  period_unit = "${var.period_unit}"
}

// ECS Instance Resource for app Tier
resource "alicloud_instance" "app" {
  count = "${var.number_of_app_instances}"

  image_id        = "${var.image_id == "" ? data.alicloud_images.default.images.0.id : var.image_id }"
  instance_type   = "${var.instance_type == "" ? data.alicloud_instance_types.default.instance_types.0.id : var.instance_type}"
  security_groups = ["${alicloud_security_group.default.id}"]

  instance_name = "${var.number_of_app_instances < 2 ? var.app_instance_name : format("%s-%s", var.app_instance_name, format(var.number_format, count.index+1))}"
  host_name     = "${var.number_of_app_instances < 2 ? var.app_host_name : format("%s-%s", var.app_host_name, format(var.number_format, count.index+1))}"

  internet_charge_type       = "${var.internet_charge_type}"
  internet_max_bandwidth_out = "${var.internet_max_bandwidth_out}"

  instance_charge_type = "${var.instance_charge_type}"
  system_disk_category = "${var.system_category}"
  system_disk_size     = "${var.system_size}"

  password = "${var.ecs_password}"

  vswitch_id = "${length(var.vswitch_ids) > 0 ? element(split(",", join(",", var.vswitch_ids)), count.index%length(split(",", join(",", var.vswitch_ids)))) : length(var.vswitch_cidrs) < 1 ? "" : element(split(",", join(",", alicloud_vswitch.vswitches.*.id)), count.index%length(split(",", join(",", alicloud_vswitch.vswitches.*.id))))}"

  period      = "${var.period}"
  period_unit = "${var.period_unit}"
}

// SLB Instance Resource for intranet
resource "alicloud_slb" "intranet" {
  internet = false
  name     = "${var.slb_intranet_name == "" ? var.resource_group_name : var.slb_intranet_name}"
}

resource "alicloud_slb_attachment" "intranet" {
  load_balancer_id = "${alicloud_slb.intranet.id}"
  instance_ids     = ["${alicloud_instance.web.*.id}", "${alicloud_instance.app.*.id}"]
}

// SLB Instance Resource for internet
resource "alicloud_slb" "internet" {
  internet  = true
  bandwidth = "${var.slb_max_bandwidth}"
  name      = "${var.slb_internet_name == "" ? var.resource_group_name : var.slb_internet_name}"
}

resource "alicloud_slb_attachment" "internet" {
  load_balancer_id = "${alicloud_slb.internet.id}"
  instance_ids     = ["${alicloud_instance.web.*.id}"]
}

// RDS Resource
resource "alicloud_db_instance" "default" {
  count            = "${var.number_of_rds_instances}"
  instance_name    = "${var.number_of_rds_instances < 2 ? var.rds_name_prefix : format("%s-%s", var.rds_name_prefix, format(var.number_format, count.index+1))}"
  engine           = "${var.engine}"
  engine_version   = "${var.engine_version}"
  instance_type    = "${var.db_instance_type}"
  instance_storage = "${var.storage}"
  vswitch_id       = "${length(var.vswitch_ids) > 0 ? element(split(",", join(",", var.vswitch_ids)), count.index%length(split(",", join(",", var.vswitch_ids)))) : length(var.vswitch_cidrs) < 1 ? "" : element(split(",", join(",", alicloud_vswitch.vswitches.*.id)), count.index%length(split(",", join(",", alicloud_vswitch.vswitches.*.id))))}"
  security_ips     = ["${alicloud_instance.app.*.private_ip}"]
}

resource "alicloud_db_account" "default" {
  count       = "${var.number_of_rds_instances}"
  instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"
  name        = "${var.rds_account_name_prefix}${count.index}"
  password    = "${var.rds_account_password}"
}

resource "alicloud_db_database" "default" {
  count       = "${var.number_of_rds_instances}"
  instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"
  name        = "${var.rds_database_name_prefix}_${count.index}"
}

// OSS Resource
resource "alicloud_oss_bucket" "default" {
  bucket = "${var.bucket_name == "" ? var.resource_group_name : var.bucket_name}"
  acl    = "${var.bucket_acl}"
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Kubernetes 资源观测利器:KubeWatch
KubeWatch 用于观测 Kubernetes 资源情况,并实时通知到各种协作软件/聊天软件,本文将为大家详细讲解 KubeWatch 的用法。
1157 0
Kubernetes 资源观测利器:KubeWatch
KubeWatch 用于观测 Kubernetes 资源情况,并实时通知到各种协作软件/聊天软件
2026 0
通过kubeadm在Ubuntu1604下构建k8s高可用集群
本文参考了https://github.com/cookeem/kubeadm-ha,https://kairen.github.io/2018/07/17/kubernetes/deploy/kubeadm-v1.11-ha/,以及 https://jamesdeng.github.io/2018/08/21/k8s-1.11-%E9%98%BF%E9%87%8C%E4%BA%91%E5%AE%89%E8%A3%85.html,特别是第三个方案,解决了我在阿里云部署K8s高可用集群的大问题。
2590 0
安装k8s Master高可用集群
安装k8s Master高可用集群 主机 角色 组件 172.18.6.101 K8S Master Kubelet,kubectl,cni,etcd 172.18.6.102 K8S Master Kubelet,kubectl,cni,etcd 172.
3228 0
K8S集群存储服务相关日志获取指南
阿里云K8S集群存储服务相关日志获取指南
2968 0
如何从k8s集群外的机器上调用k8s的API(可调用多个k8s的apiserver)
从k8s集群外的机器上调用k8s主节点的apiserver提供的API
3904 0
使用kubeadm安装k8s集群故障处理三则
最近在作安装k8s集群,测试了几种方法,最终觉得用kubeadm应该最规范。 限于公司特别的网络情况,其安装比网上不能访问google的情况还要艰难。 慢慢积累经验吧。 今天遇到的三则故障记下来作参考。
1459 0
k8s 集群基本概念
一、概述:   kubernetes是google开源的容器集群管理系统,提供应用部署、维护、扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母) 二、基本概念   Pod:若干相关容器的组合,Pod包含的容器运行在同一host上,这些容器使用相同的网络命令空间、IP地址和端口,相互之间能通过localhost来发现和通信。
1919 0
+关注
凌云Cloud
All in Cloud Native PaaS , Focus on Develop\Data middle-end
文章
问答
文章排行榜
最热
最新
相关电子书
更多
EDAS4.0 助力企业一站实现微服务架构转型与 K8s 容器化升级
立即下载
云迁移与云容灾-基于弹性裸金属(神龙)服务器K8S容器迁云最佳实践
立即下载
阿里云开源容器技术:K8S on 阿里云
立即下载