Golang 下的微服务 - 第 7 部分 - Terraform a Cloud

zhangyang9 · 2018-04-14 17:29:03 · 3577 次点击 · 预计阅读时间 6 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-04-14 17:29:03 的文章,其中的信息可能已经有所发展或是发生改变。

在之前的文章中,我们简要介绍了用户界面和Web客户端以及如何使用微工具包rpc代理与我们新创建的rpc服务进行交互。

本文将讨论如何创建云环境来托管我们的服务。 我们将使用 Terraform 在 Google Cloud 平台上构建我们的云群集。这应该是一篇相当短的文章,但它也很重要。

为什么选择 Terraform?

我已经使用了几种不同的云供应解决方案,但对我而言,Hashicorps Terraform 感觉最容易使用并且得到最好的支持。近年来出现了一个术语:'基础设施作为代码'。为什么你想要你的基础设施作为代码?那么,基础设施很复杂,它描述了很多移动部件。跟踪基础架构的变更和版本控制变更也很重要。

Terraform 完美地做到了这一点。他们实际上已经创建了自己的DSL(域特定语言),它允许您描述您的基础设施应该是什么样子。

Terraform 还允许您进行原子更改。所以在出现失败的情况下,它会将所有东西都退回来,并将其恢复到原来的状态。 Terraform 甚至允许您通过执行转出计划来预览更改。这将准确描述您的更改将对您的基础架构做什么。这给了你很多的信心,曾经是一个可怕的前景。

所以让我们开始吧!

创建您的云计划

转到 Google Cloud 并创建一个新项目。 如果您之前没有使用过它,您可能会发现您有300英镑的免费试用版。太好了! 无论如何,你应该看到一个空白的新项目。 现在在你的左边,你应该看到一个IAM&Admin tabb,然后在那里创建一个新的服务密钥。 确保选择“提供新密钥”,然后确保您选择了json类型。 安全保管,我们稍后需要。 这允许程序代表您执行对 Google Cloud API 的更改。 现在我们应该掌握一切我们需要开始的事情。 所以创建一个新的回购。 我称之为我的 shippy-infrastructure。

描述我们的基础设施

创建一个名为 variables.tf 的新文件。 这将包含关于我们项目的基本信息。 在这里,我们有我们的项目 ID,我们的地区,我们的项目名称和我们的平台名称。 该地区是我们希望集群运行的数据中心。 该区域是该区域内的可用区域。 项目名称是我们Google项目的项目ID,最后,平台名称是我们的群集的名称。

variable "gcloud-region"    { default = "europe-west2" }
variable "gcloud-zone"      { default = "europe-west2-a" }
variable "gcloud-project"   { default = "shippy-freight" }
variable "platform-name"    { default = "shippy-platform" }

创建一个名为 providers.tf 的新文件,这是 Google 特定的部分:

provider "google" {
    credentials = "${file("google-cred.json")}"
    project     = "${var.gcloud-project}"
    region      = "${var.gcloud-region}"
}

现在让我们创建一个名为 global.tf 的文件。 这里是我们设置的一部分:

# Creates a network layer
resource "google_compute_network" "shippy-network" {
    name = "${var.platform-name}"
}

# Creates a firewall with some sane defaults, allowing ports 22, 80 and 443 to be open
# This is ssh, http and https.
resource "google_compute_firewall" "ssh" {
    name    = "${var.platform-name}-ssh"
    network = "${google_compute_network.shippy-network.name}"

    allow {
        protocol = "icmp"
    }

    allow {
        protocol = "tcp"
        ports    = ["22", "80", "443"]
    }

     source_ranges = ["0.0.0.0/0"]
}

# Creates a new DNS zone
resource "google_dns_managed_zone" "shippy-freight" {
    name        = "shippyfreight-com"
    dns_name    = "shippyfreight.com."
    description = "shippyfreight.com DNS zone"
}

# Creates a new subnet for our platform within our selected region
resource "google_compute_subnetwork" "shippy-freight" {
    name          = "dev-${var.platform-name}-${var.gcloud-region}"
    ip_cidr_range = "10.1.2.0/24"
    network       = "${google_compute_network.shippy-network.self_link}"
    region        = "${var.gcloud-region}"
}

# Creates a container cluster called 'shippy-freight-cluster'
# Attaches new cluster to our network and our subnet,
# Ensures at least one instance is running
resource "google_container_cluster" "shippy-freight-cluster" {
    name = "shippy-freight-cluster"
    network = "${google_compute_network.shippy-network.name}"
    subnetwork = "${google_compute_subnetwork.shippy-freight.name}"
    zone = "${var.gcloud-zone}"

    initial_node_count = 1

    master_auth {
        username = <redacted>
        password = <redacted>
    }

    node_config {

        # Defines the type/size instance to use
        # Standard is a sensible starting point
        machine_type = "n1-standard-1"

        # Grants OAuth access to the following API's within the cluster
        oauth_scopes = [
            "https://www.googleapis.com/auth/projecthosting",
            "https://www.googleapis.com/auth/devstorage.full_control",
            "https://www.googleapis.com/auth/monitoring",
            "https://www.googleapis.com/auth/logging.write",
            "https://www.googleapis.com/auth/compute",
            "https://www.googleapis.com/auth/cloud-platform"
        ]
    }
}

# Creates a new DNS range for cluster
resource "google_dns_record_set" "dev-k8s-endpoint-shippy-freight" {
    name  = "k8s.dev.${google_dns_managed_zone.shippy-freight.dns_name}"
    type  = "A"
    ttl   = 300

    managed_zone = "${google_dns_managed_zone.shippy-freight.name}"

    rrdatas = ["${google_container_cluster.shippy-freight-cluster.endpoint}"]
}

现在将您之前创建的密钥移至此项目的根目录并将其命名为 google-cred.json。

你现在应该拥有一切你需要创建一个新的集群! 但是,我们不要发疯,你应该先进行测试,并检查一切是否正常。

运行 $ terraform init - 这将下载任何缺少的提供 providers/plugins。 这会发现我们正在使用 Google Cloud 模块并自动获取这些依赖关系。

现在,如果您运行 $ terraform 计划,它会向您显示它将做出的更改。 这几乎就像在你的整个基础设施上做 $ git diff。 现在很酷!

浏览部署计划后,我认为很好。

$ terraform apply

注意:您可能会被要求启用一些 API 以完成此操作,没关系,单击链接,确保启用它们并重新运行 $ terraform apply。 如果您想节省时间,请转到 Google 云端控制台中的 API 部分,并启用 DNS,Kubernetes 和计算引擎 API。

这可能需要一段时间,但那是因为发生了很多事情。 但是一旦完成,如果您转到Google云端控制台右侧菜单中的 Kubernetes 引擎或计算引擎细分,则应该能够看到您的新群集。

注意:如果你没有使用免费试用期,这将立即开始花费你的钱。 请务必查看实例定价列表。 哦,而且我在开展这些职位的工作之间已经开动了我的力量。 这不会产生费用,因为这些费用是根据资源使用情况收取的。

而已! 我们有一个完全正常运行的cluster / vm,准备好让我们开始部署我们的容器。 本系列的下一部分将介绍Kubernetes,以及如何设置和部署容器到Kubernetes。

如果你发现这个系列有用,并且你使用了一个广告拦截器(谁可以责怪你)。 请考虑为我的时间和努力捐赠几块钱。 干杯! https://monzo.me/ewanvalentine


via: https://ewanvalentine.io/microservices-in-golang-part-7/

作者:Ewan Valentine  译者:zhangyang9  校对:polaris1119

本文由 GCTT 原创编译,Go语言中文网 荣誉推出


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3577 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传