GKEからCloudSQLへプライベート接続する

GKEとCloudSQLをプライベート接続する。

スニペット

引数はしたみたいな感じで使う。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
variable "project" {}

variable "cluster_name" {}

variable "region" {}

variable "location" {}

variable "primary_node_count" {
  default = "3"
}

variable "machine_type" {
  default = "n1-standard-1"
}

variable "min_master_version" {
  default = "1.14.10-gke.37"
}

variable "node_version" {
  default = "1.14.10-gke.37"
}

ネットワークとアドレス範囲を定義する。 purpose, address_type は大事。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 自分たちのサービスで使うネットワーク
resource "google_compute_network" "private_network" {
  name = var.cluster_name
}

# アドレス範囲
resource "google_compute_global_address" "private_service" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.private_network.self_link
}

# プライベート接続定義
resource "google_service_networking_connection" "private_vpc_connection" {
  provider = google-beta

  network                 = google_compute_network.private_network.self_link
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_service.name]
}

GKEクラスタを作る。 ip_allocation_policy ブロックがあるのでクラウドネイティブになる。 前述定義のアドレス範囲とぶつけない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ネットワークを指定している
resource "google_container_cluster" "main" {
  name     = "primary-${var.cluster_name}"
  location = var.location

  remove_default_node_pool = true
  initial_node_count       = 1

  network = google_compute_network.private_network.self_link

  ip_allocation_policy {
    cluster_ipv4_cidr_block  = "${cidrsubnet("192.168.0.0/16", 4, 1)}"
    services_ipv4_cidr_block = "${cidrsubnet("192.168.0.0/16", 4, 2)}"
  }

  min_master_version = var.min_master_version
  node_version       = var.node_version

  master_auth {
    username = ""
    password = ""

    client_certificate_config {
      issue_client_certificate = false
    }
  }
}
# ちゃんとノードプールも定義する

繋げたいデータベースも定義する。ネットワークを指定してネットワーク接続への依存を明記する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
resource "google_sql_database" "app_core" {
  name     = "app_core"
  instance = google_sql_database_instance.instance.name
}

resource "google_sql_database_instance" "main" {
  name   = "pg-${var.cluster_name}"
  database_version = "POSTGRES_11"
  region = var.region

  depends_on = [google_service_networking_connection.private_vpc_connection]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      ipv4_enabled    = false
      private_network = google_compute_network.private_network.self_link
    }
  }
}

resource "google_sql_user" "app" {
  name     = "app"
  instance = google_sql_database_instance.instance.name
  password = "ppap"
}

CloudProxyのためのユーザを準備する。

1
2
3
4
5
6
7
8
9
resource "google_service_account" "cloudproxy" {
  account_id   = "proxy-${var.cluster_name}"
  display_name = "Cloud Proxy(${var.cluster_name})"
}

resource "google_project_iam_member" "cloudproxy-iam" {
  role = "roles/cloudsql.client"
  member = "serviceAccount:${google_service_account.cloudproxy.email}"
}

したみたいなコンテナ定義を追加してCloudProxyをサイドカーで載せる。kustomizeとかを使ってよしなに頑張った。 クレデンシャルは data を使ったりでよしなに取り出す。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
      - name: cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.14
        command: ["/cloud_sql_proxy",
                  "-instances=app_core:us-west1:pg-apple_cluster=tcp:5432",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        securityContext:
          runAsUser: 2  # non-root user
          allowPrivilegeEscalation: false
        volumeMounts:
          - name: cloudsql-instance-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials

ref.

しょっちゅう読みに行く資料

comments powered by Disqus