やりたいこと
コンテナをGoogle CloudのGCEで動かしたい。
ついでにTerraformで管理したい。
使うもの
- Artifact Registry
- GCE
- Cloud Build(任意)
公式ドキュメント
この辺に書いてある。
https://cloud.google.com/compute/docs/containers/deploying-containers
費用
GCEのVMとネットワークとディスクの費用
https://cloud.google.com/compute/all-pricing
無料枠あり。
https://cloud.google.com/free/docs/gcp-free-tier/#compute
Artifact Registryにイメージを置いておく保存容量と下り(外向き)ネットワークの費用
https://cloud.google.com/artifact-registry/pricing
保存容量は0.5GBまで無料枠あり。
下り(外向き)ネットワークは移動範囲が狭ければ無料枠あり。
※いずれも2021年6月時点
外部IPが必要なら、その費用
https://cloud.google.com/compute/network-pricing/?hl=ja#ipaddress
やること
コンテナイメージをArtifact Registryで管理する
リポジトリ作成
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.70.0"
}
google-beta = {
source = "hashicorp/google-beta"
version = "3.70.0"
}
}
}
resource "google_artifact_registry_repository" "my_repository" {
provider = google-beta
location = "asia"
repository_id = "my-repository"
description = "example docker repository"
format = "DOCKER"
}
※2021年6月時点ではgoogle-betaのproviderを使う必要あり。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/artifact_registry_repository
リポジトリにイメージを追加
Dockerfileを用意してgcloud builds submit
を実行する。
docker tag
とdocker push
を使う方法でも可。
repository_name
は前述で指定したrepository_id
に読み替える。
image_name
は任意の名前を指定する。
gcloud builds submit --tag asia-docker.pkg.dev/<project_id>/<repository_name>/<image_name> --project=<project_id>
VMを作ってコンテナを動かす
コンテナの定義はTerraform Google Container VM Metadata Moduleを使って記述し、
google_compute_instance
リソースで利用する。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance
イメージの指定はタグも可。
ログとモニタリングはVMのメタデータで有効にする。
https://cloud.google.com/container-optimized-os/docs/how-to/logging?hl=ja#creating_a_new_instance_with_the_logging_agent_enabled
https://cloud.google.com/container-optimized-os/docs/how-to/monitoring?hl=ja#metadata
module "gce-container" {
source = "terraform-google-modules/container-vm/google"
version = "~> 2.0"
cos_image_family = "stable"
restart_policy = "Always"
container = {
image = "asia-docker.pkg.dev/<project_id>/<repository_name>/<image_name>"
}
}
resource "google_compute_instance" "my_vm" {
name = "my-vm"
machine_type = "f1-micro"
zone = "asia-northeast1-b"
boot_disk {
initialize_params {
type = "pd-standard"
size = 10
image = module.gce-container.source_image
}
}
network_interface {
subnetwork = "default"
}
scheduling {
preemptible = false
automatic_restart = true
on_host_maintenance = "MIGRATE"
}
service_account {
scopes = ["logging-write", "monitoring-write", "trace-append", "storage-ro", "service-control", "service-management"]
}
metadata = {
gce-container-declaration = module.gce-container.metadata_value
google-logging-enabled = "true"
google-monitoring-enabled = "true"
}
}
ログ
コンテナのログは以下の場所に出力される。
resource.type="gce_instance"
log_name="projects/<project_id>/logs/cos_containers"
モニタリング
COS上のコンテナの指標はcompute.googleapis.com/guest
で取れる。
保守時の話
VM再起動時に再度イメージを取りに行くので、タグ無指定やlatest指定だとVM再起動により最新のイメージで動かせる。