共计 4607 个字符,预计需要花费 12 分钟才能阅读完成。
引言
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 环境:
- 创立新的 GCP 我的项目或应用已有的我的项目(Project)。
- 为您的我的项目启用所需的 API(Compute Engine API)。
- 为 Terraform 创立具备所需权限的服务账户。倡议应用 Compute Engine Admin 角色。
- 下载 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}"
]
}
}
配置负载平衡
在下面的示例中:
- 创立了一个 google_compute_http_health_check 资源,用于配置衰弱状态查看。
- 创立了一个 google_compute_target_pool 资源,它援用了实例组和衰弱状态查看。
- 创立了一个 google_compute_forwarding_rule 资源,它设置了转发规定,将 1883 端口的入站流量路由到指标池。
- 还能够为其它端口(“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 init
terraform plan
terraform apply
利用胜利后,将输入以下内容:
Outputs:
loadbalancer_ip = ${loadbalancer_ip}
tls_ca = <sensitive>
tls_cert = <sensitive>
tls_key = <sensitive>
您当初能够通过相应的端口拜访不同的服务了。
Dashboard: ${loadbalancer_ip}:18083
MQTT: ${loadbalancer_ip}:1883
MQTTS: ${loadbalancer_ip}:8883
WS: ${loadbalancer_public_ip}:8083
WSS: ${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