ロード バランシングされた VM

アーキテクチャ

ロード バランシングされた VM は、VM のクラスタを設定し、VM にパブリック ルートを公開するようにロードバランサを構成するインフラストラクチャ構築スクリプトです。

  • コンピューティング - VM - Compute Engine
  • コンピューティング - クラスタ - マネージド インスタンス グループ
  • コンピューティング - マシン テンプレート - インスタンス テンプレート
  • ネットワーキング - ロード バランシング - Cloud ロードバランサ

このサンプル アプリケーションでは、NGINX を使用してシンプルな静的 HTML サイトを設定し、クラスタ間でロード バランシングを行います。


使ってみる

Cloud Shell でソースコードのコピーへの次のリンクをクリックします。その後、1 つのコマンドでプロジェクト内のアプリケーションの作業コピーがスピンアップされます。

Cloud Shell で開く

GitHub でソースコードを見る


ロード バランシングされた VM コンポーネント

ロード バランシングされた VM アーキテクチャでは、いくつかのプロダクトを使用しています。 以下に、関連動画、プロダクト ドキュメント、インタラクティブ チュートリアルへのリンクを含めた、コンポーネントの詳細を示します。
動画 ドキュメント チュートリアル
Compute Engine Compute Engine は Google Cloud の仮想技術です。VM のさまざまな構成を起動して、どのようなコンピューティング ニーズにも対応できます。
Cloud Load Balancing Google Cloud のロードバランサを使用すると、ストレージ バケットの前にロードバランサを配置して、SSL 証明書、Logging、Monitoring を使用できるようになります。

スクリプト

インストール スクリプトでは、go と Terraform CLI ツールで記述された実行ファイルを使用して、空のプロジェクトを作成し、そこにアプリケーションをインストールします。出力は、機能するアプリケーションとロード バランシング IP アドレスの URL になります。

./main.tf

サービスを有効化する

Google Cloud サービスは、デフォルトではプロジェクトで無効になっています。 次の必要なサービスを有効にします。

  • Compute Engine - 仮想マシンとネットワーク サービス(ロードバランサなど)
variable "gcp_service_list" {
  description = "The list of apis necessary for the project"
  type        = list(string)
  default = [
      "compute.googleapis.com",
  ]
}

resource "google_project_service" "all" {
  for_each                   = toset(var.gcp_service_list)
  project                    = var.project_number
  service                    = each.key
  disable_dependent_services = false
  disable_on_destroy         = false
}

マネージド VM の基になるインスタンス エグザンプラを作成する

次のコマンドでは、VM を作成し、必要なソフトウェアを VM にインストールしてコードをデプロイします。

resource "google_compute_instance" "exemplar" {
    name         = "${var.basename}-exemplar"
    machine_type = "n1-standard-1"
    zone         = var.zone
    project      = var.project_id

    tags                    = ["http-server"]
    metadata_startup_script = "apt-get update -y \n apt-get install nginx -y \n  printf '${data.local_file.index.content}'  | tee /var/www/html/index.html \n chgrp root /var/www/html/index.html \n chown root /var/www/html/index.html \n chmod +r /var/www/html/index.html"

    boot_disk {
        auto_delete = true
        device_name = "${var.basename}-exemplar"
        initialize_params {
        image = "family/debian-10"
        size  = 200
        type  = "pd-standard"
        }
    }

    network_interface {
        network = "default"
        access_config {
        // Ephemeral public IP
        }
    }

    depends_on = [google_project_service.all]
}

スナップショットとディスク イメージを作成する

次のコマンドでは、VM を使用してスナップショットを作成します。次に、スナップショットを使用してディスク イメージを作成します。 クラスタ内のすべての VM は、このイメージに基づいています。

resource "google_compute_snapshot" "snapshot" {
    project           = var.project_id
    name              = "${var.basename}-snapshot"
    source_disk       = google_compute_instance.exemplar.boot_disk[0].source
    zone              = var.zone
    storage_locations = ["${var.region}"]
    depends_on        = [time_sleep.startup_completion]
}

resource "google_compute_image" "exemplar" {
    project         = var.project_id
    name            = "${var.basename}-latest"
    family          = var.basename
    source_snapshot = google_compute_snapshot.snapshot.self_link
    depends_on      = [google_compute_snapshot.snapshot]
}

インスタンス テンプレートを作成。

次のコマンドは、クラスタ内のすべての VM の設定と構成を含むテンプレートを作成します。前のコマンドで作成したディスク イメージを使用します。

このコマンドには、クラスタ内の VM によって提供される HTML をカスタマイズする起動スクリプトが含まれています。

 resource "google_compute_instance_template" "default" {
    project     = var.project_id
    name        = "${var.basename}-template"
    description = "This template is used to create app server instances."
    tags        = ["httpserver"]

    metadata_startup_script = "sed -i.bak \"s/\{\{NODENAME\}\}/$HOSTNAME/\" /var/www/html/index.html"

    instance_description = "BasicLB node"
    machine_type         = "n1-standard-1"
    can_ip_forward       = false

    // Create a new boot disk from an image
    disk {
        source_image = google_compute_image.exemplar.self_link
        auto_delete  = true
        boot         = true
    }

    network_interface {
        network = "default"
    }

    depends_on = [google_compute_image.exemplar]
}

マネージド インスタンス グループを作成

インスタンス テンプレートの N 台のマシンを、このグループの一部として管理するようリクエストします。

resource "google_compute_instance_group_manager" "default" {
    project            = var.project_id
    name               = "${var.basename}-mig"
    zone               = var.zone
    target_size        = var.nodes
    base_instance_name = "${var.basename}-mig"

    version {
        instance_template = google_compute_instance_template.default.id
    }

    named_port {
        name = "http"
        port = "80"
    }

    depends_on = [google_compute_instance_template.default]
}

外部 IP アドレスを作成する

ホストをドメイン名にバインドし、一般的にインターネット上で通信する必要があります。

resource "google_compute_global_address" "default" {
    project    = var.project_id
    name       = "${var.basename}-ip"
    ip_version = "IPV4"
}

ロードバランサを作成

次のコマンドはロードバランサを作成し、ヘルスチェックとバックエンド サービスを実装します。これにより、インスタンス グループに接続するようにロードバランサが構成されます。

resource "google_compute_health_check" "http" {
    project = var.project_id
    name    = "${var.basename}-health-chk"

    tcp_health_check {
        port = "80"
    }
}

resource "google_compute_firewall" "allow-health-check" {
    project       = var.project_id
    name          = "allow-health-check"
    network       = local.defaultnetwork
    source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]

    allow {
        protocol = "tcp"
        ports    = ["80"]
    }
}

resource "google_compute_backend_service" "default" {
    project               = var.project_id
    name                  = "${var.basename}-service"
    load_balancing_scheme = "EXTERNAL"
    protocol              = "HTTP"
    port_name             = "http"
    backend {
        group = google_compute_instance_group_manager.default.instance_group
    }

    health_checks = [google_compute_health_check.http.id]
    }

    resource "google_compute_url_map" "lb" {
    project         = var.project_id
    name            = "${var.basename}-lb"
    default_service = google_compute_backend_service.default.id
}

HTTP を有効にする

次のコマンドは、ロードバランサのポート 80 がサービスを指すネットワーク ルールを構成します。

resource "google_compute_target_http_proxy" "default" {
    project = var.project_id
    name    = "${var.basename}-lb-proxy"
    url_map = google_compute_url_map.lb.id
}

resource "google_compute_forwarding_rule" "google_compute_forwarding_rule" {
    project               = var.project_id
    name                  = "${var.basename}-http-lb-forwarding-rule"
    provider              = google-beta
    region                = "none"
    load_balancing_scheme = "EXTERNAL"
    port_range            = "80"
    target                = google_compute_target_http_proxy.default.id
    ip_address            = google_compute_global_address.default.id
}

まとめ

これで、複数の Compute Engine インスタンスでシンプルなウェブサイトが実行され、プロジェクト内のロードバランサが前面に配置されました。さらに、環境に合わせてソリューションを変更または拡張するためのコードもすべて用意されています。