引言

MQTT 是一种轻量级的消息传递协定,实用于物联网利用实现设施间通信。 作为一款支流的开源 MQTT Broker,EMQX 可能提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。

借助广泛应用的基础设施即代码(IaC)工具 Terraform,您能够轻松在 GCP 上主动部署 EMQX MQTT Broker,从而简化和标准 MQTT 基础设施的设置和治理。

本文将领导您如何设置 GCP 我的项目、创立服务账户、编写 Terraform 配置文件,实现轻松部署 EMQX MQTT Broker。

筹备工作

在开始之前,请做好以下筹备:

  • 注册 Google Cloud Platform 账户
  • 在您的本地机器上装置 Google Cloud SDK
  • 在您的本地机器上装置 Terraform
  • 对 GCP、Terraform 和 MQTT 有根本的理解

配置 GCP 环境

依照以下步骤配置 GCP 环境:

  1. 创立新的 GCP 我的项目或应用已有的我的项目(Project)。
  2. 为您的我的项目启用所需的 API(Compute Engine API)。
  3. 为 Terraform 创立具备所需权限的服务账户。倡议应用 Compute Engine Admin 角色。
  4. 下载 JSON 密钥文件。

应用 Terraform 在 GCP 上部署 EMQX

配置 Terraform

在您的 Terraform 代码中配置 GCP Provider,并应用服务账户密钥文件进行认证。

provider "google" {  credentials = file("<PATH-TO-KEY-FILE>")  project     = "<PROJECT-ID>"  region     = "<REGION>"  zone       = "<ZONE>"}

配置网络

这一步须要理解 GCP 相干的三个根本术语:我的项目、VPC 和子网(Subnet)。这些术语的定义如下:

  • 我的项目是 GCP 中的顶层组织单元,蕴含所有的资源。
  • VPC 是在 GCP 我的项目内定义的公有网络,容许您创立和治理 IP 地址、子网和路由表。
  • 子网是将 VPC 网络划分为更小、更易于治理的局部的一种形式。它们能够为特定的资源分配 IP 地址,并定义不同的网络段。

它们之间的关系能够用下图来阐明:

创立 VPC 网络

咱们须要创立一个 VPC 网络,为您的网络相干资源提供连贯,其中包含:

  • Compute Engine 虚拟机实例
  • Container Engine 容器
  • App Engine Flex 服务
  • 其余网络相干资源
resource "google_compute_network" "vnet" {  project                 = "<PROJECT>"  name                    = "<NAME>"  auto_create_subnetworks = false}

在 VPC 中创立子网

每个 VPC 网络都被划分为若干子网,这里咱们创立一个子网。

resource "google_compute_subnetwork" "sn" {  name          = "<NAME>"  ip_cidr_range = cidrsubnet(var.address_space, 8, 1)  region  = var.region  network = google_compute_network.vnet.id}

创立防火墙规定

每个网络都有本人的防火墙,管制着实例之间以及实例与内部的拜访。除非创立防火墙规定容许拜访实例,否则所有到实例的流量,包含来自其余实例的流量,都会被防火墙阻止。

“ports” 定义了一些与 MQTT 相干的端口,例如 “1883”、“8883”、“8083”、“8084”。

resource "google_compute_firewall" "fw" {  name          = "<NAME>"  network       = google_compute_network.vnet.name  source_ranges = ["0.0.0.0/0"]  allow {    protocol = "icmp"  }  allow {    protocol = "tcp"    ports    = "<PORTS>"  }}

配置 EMQX 集群

为每个 EMQX 节点创立虚拟机实例

虚拟机实例能够用于部署利用、运行服务或执行计算工作。

在上面的示例中,咱们创立了一个名为 example-instance 的 google_compute_instance 资源,并指定了 name、machine_type、boot_disk、network_interface 属性。

resource "google_compute_instance" "example" {  name         = "example-instance"  machine_type = "n1-standard-1"  boot_disk {    initialize_params {      image = ""ubuntu-os-cloud/ubuntu-2004-lts""    }  }  network_interface {    network = google_compute_network.example.name    subnetwork = google_compute_subnetwork.example.name    access_config {      // Ephemeral external IP    }  }}

启动 EMQX 节点

创立虚拟机实例后,须要初始化每个 EMQX 节点。首先,您必须初始化并复制 init.sh 到每个节点。而后下载 EMQX 包并在每个节点上执行方才复制的 init.sh。最初,别离启动 EMQX。

resource "null_resource" "init" {  depends_on = [google_compute_instance.example]  count = "<INSTANCE-COUNT>"  connection {    type        = "ssh"    host        = "<HOST-LIST>"    user        = "ubuntu"    private_key = "<YOUR-PRIVATE-KEY>"  }  # config init script  provisioner "file" {    content = templatefile("${path.module}/scripts/init.sh", { local_ip = <PRIVATE-IPS>[count.index],      emqx_lic = <EMQX-LICENSE>, emqx_ca = <EMQX-CA> emqx_cert = <EMQX-CERT>, emqx_key = <PRIVATE-KEY> })    destination = "/tmp/init.sh"  }  # download EMQX package  provisioner "remote-exec" {    inline = [      "curl -L --max-redirs -1 -o /tmp/emqx.zip <EMQX-PACKAGE-URL>"    ]  }  # init system  provisioner "remote-exec" {    inline = [      "chmod +x /tmp/init.sh",      "/tmp/init.sh",      "sudo mv /tmp/emqx <HOME>",    ]  }  # start EMQX   provisioner "remote-exec" {    inline = [      "sudo <HOME>/bin/emqx start"    ]  }}

将 EMQX 节点退出集群

随机抉择 EMQX 集群中的一个节点,而后一一将其余节点退出该节点。

resource "null_resource" "emqx_cluster" {  depends_on = [null_resource.init]  count = "<INSTANCE-COUNT>-1"  connection {    type        = "ssh"    host        = <OTHERS>[count.index % <OTHERS>]    user        = "ubuntu"    private_key = "<YOUR-PRIVATE-KEY>"  }  provisioner "remote-exec" {    inline = [      "/home/ubuntu/emqx/bin/emqx_ctl cluster join emqx@${local.another_emqx}"    ]  }}

配置负载平衡

在下面的示例中:

  1. 创立了一个 google_compute_http_health_check 资源,用于配置衰弱状态查看。
  2. 创立了一个 google_compute_target_pool 资源,它援用了实例组和衰弱状态查看。
  3. 创立了一个 google_compute_forwarding_rule 资源,它设置了转发规定,将 1883 端口的入站流量路由到指标池。
  4. 还能够为其它端口(“8883”、“8083”、“8084”、“18083”)增加更多的 google_compute_forwarding_rule。
resource "google_compute_http_health_check" "example" {  name               = "example-health-check"  check_interval_sec = 30  timeout_sec        = 5  port         = 8081  request_path = "/status"}resource "google_compute_target_pool" "example" {  name = "example-target-pool"  instances = [    google_compute_instance_group.example.self_link  ]  health_checks = [    google_compute_http_health_check.example.name  ]}resource "google_compute_forwarding_rule" "example-1883" {  name       = "example-forwarding-rule"  target     = google_compute_target_pool.example.self_link  port_range = "1883"  ip_protocol = "TCP"}resource "google_compute_forwarding_rule" "example-8883" {  ...}

初始化并利用 Terraform

terraform initterraform planterraform apply

利用胜利后,将输入以下内容:

Outputs:loadbalancer_ip = ${loadbalancer_ip}tls_ca = <sensitive>tls_cert = <sensitive>tls_key = <sensitive>

您当初能够通过相应的端口拜访不同的服务了。

Dashboard: ${loadbalancer_ip}:18083MQTT: ${loadbalancer_ip}:1883MQTTS: ${loadbalancer_ip}:8883WS: ${loadbalancer_public_ip}:8083WSS: ${loadbalancer_public_ip}:8084

结语

应用 Terraform 在 GCP 上部署 EMQX,能够让您轻松治理物联网基础设施,专一于创造物联网利用。依照本文的指引,您能够在 GCP 上疾速搭建出具备弱小扩展性和高可靠性的 MQTT Broker,为您的物联网我的项目提供反对。

版权申明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/one-click-deploying-emqx-mqtt-broker-on-gcp-using-terraform