a3/terraform/modules/cluster/gke-beta/main.tf (242 lines of code) (raw):

/** * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ locals { gke_master_version = var.gke_version != null ? var.gke_version : data.google_container_engine_versions.gkeversion.latest_master_version node_service_account = var.node_service_account == null ? data.google_compute_default_service_account.account.email : var.node_service_account gke_endpoint_value = var.gke_endpoint == null ? "https://container.googleapis.com/" : var.gke_endpoint oauth_scopes = [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/dataaccessauditlogging", ] kubernetes_setup_config = var.kubernetes_setup_config != null ? var.kubernetes_setup_config : { kubernetes_service_account_name = "aiinfra-gke-sa" kubernetes_service_account_namespace = "default" } } data "google_compute_default_service_account" "account" { project = var.project_id } data "google_client_config" "current" {} data "google_container_engine_versions" "gkeversion" { location = var.region project = var.project_id } module "network" { source = "../../common/network" nic0_existing = { network_name = "default" subnetwork_name = "default" } project_id = var.project_id region = var.region resource_prefix = var.resource_prefix } module "resource_policy" { source = "../../common/resource_policy" for_each = { for idx, node_pool in var.node_pools : idx => node_pool } project_id = var.project_id new_resource_policy_name = each.value.existing_resource_policy_name == null ? "${var.resource_prefix}-${each.key}" : null existing_resource_policy_name = each.value.existing_resource_policy_name == null ? null : each.value.existing_resource_policy_name region = var.region } resource "null_resource" "gke-cluster-command" { triggers = { project_id = var.project_id cluster_name = var.resource_prefix region = var.region gke_version = local.gke_master_version gke_endpoint = local.gke_endpoint_value network_name = module.network.network_names[0] subnetwork_name = module.network.subnetwork_names[0] } provisioner "local-exec" { when = create interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/gke_cluster.sh create \ ${self.triggers.project_id} \ ${self.triggers.cluster_name} \ ${self.triggers.region} \ ${self.triggers.gke_version} \ ${self.triggers.network_name} \ ${self.triggers.subnetwork_name} EOT environment = { CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER = "${self.triggers.gke_endpoint}" } on_failure = fail } provisioner "local-exec" { when = destroy interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/gke_cluster.sh destroy \ ${self.triggers.project_id} \ ${self.triggers.cluster_name} \ ${self.triggers.region} \ ${self.triggers.gke_version} \ ${self.triggers.network_name} \ ${self.triggers.subnetwork_name} EOT environment = { CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER = "${self.triggers.gke_endpoint}" } on_failure = fail } depends_on = [module.resource_policy] } resource "null_resource" "gke-node-pool-command" { for_each = { for idx, node_pool in var.node_pools : idx => node_pool } triggers = { project_id = var.project_id prefix = var.resource_prefix cluster_name = var.resource_prefix node_pool_name = "np-${each.key}" zone = each.value.zone region = var.region node_count = each.value.node_count machine_type = each.value.machine_type resource_policy = module.resource_policy[tonumber(each.key)].resource_name gke_endpoint = local.gke_endpoint_value network_1 = "network=${module.network.network_names[1]},subnetwork=${module.network.subnetwork_names[1]}" network_2 = "network=${module.network.network_names[2]},subnetwork=${module.network.subnetwork_names[2]}" network_3 = "network=${module.network.network_names[3]},subnetwork=${module.network.subnetwork_names[3]}" network_4 = "network=${module.network.network_names[4]},subnetwork=${module.network.subnetwork_names[4]}" } provisioner "local-exec" { when = create interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/gke_node_pool.sh create \ ${self.triggers.project_id} \ ${self.triggers.cluster_name} \ ${self.triggers.node_pool_name} \ ${self.triggers.zone} \ ${self.triggers.region} \ ${self.triggers.node_count} \ ${self.triggers.machine_type} \ ${self.triggers.prefix} \ ${self.triggers.resource_policy} \ ${self.triggers.network_1} \ ${self.triggers.network_2} \ ${self.triggers.network_3} \ ${self.triggers.network_4} EOT environment = { CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER = "${self.triggers.gke_endpoint}" } on_failure = fail } provisioner "local-exec" { when = destroy interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/gke_node_pool.sh destroy \ ${self.triggers.project_id} \ ${self.triggers.cluster_name} \ ${self.triggers.node_pool_name} \ ${self.triggers.zone} \ ${self.triggers.region} \ ${self.triggers.node_count} \ ${self.triggers.machine_type} \ ${self.triggers.prefix} \ ${self.triggers.resource_policy} \ ${self.triggers.network_1} \ ${self.triggers.network_2} \ ${self.triggers.network_3} \ ${self.triggers.network_4} EOT environment = { CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER = "${self.triggers.gke_endpoint}" } on_failure = fail } depends_on = [null_resource.gke-cluster-command, module.network] } resource "null_resource" "gke-node-pool-resize-command" { for_each = { for idx, rnc in var.resize_node_counts : idx => rnc } triggers = { project_id = var.project_id cluster_name = var.resource_prefix node_pool_name = "np-${each.key}" region = var.region node_count = each.value gke_endpoint = local.gke_endpoint_value } provisioner "local-exec" { when = create interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/gke_node_pool_resize.sh \ ${self.triggers.project_id} \ ${self.triggers.cluster_name} \ ${self.triggers.node_pool_name} \ ${self.triggers.region} \ ${self.triggers.node_count} EOT environment = { CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER = "${self.triggers.gke_endpoint}" } on_failure = fail } depends_on = [null_resource.gke-node-pool-command] } output "gke-cluster-name" { value = null_resource.gke-cluster-command.triggers.cluster_name } resource "google_project_iam_member" "node_service_account_logWriter" { project = var.project_id role = "roles/logging.logWriter" member = "serviceAccount:${local.node_service_account}" } resource "google_project_iam_member" "node_service_account_metricWriter" { project = var.project_id role = "roles/monitoring.metricWriter" member = "serviceAccount:${local.node_service_account}" } resource "google_project_iam_member" "node_service_account_monitoringViewer" { project = var.project_id role = "roles/monitoring.viewer" member = "serviceAccount:${local.node_service_account}" } resource "null_resource" "kubernetes-setup-command" { triggers = { project_id = var.project_id prefix = var.resource_prefix gsa_name = local.node_service_account ksa_name = local.kubernetes_setup_config.kubernetes_service_account_name ksa_namespace = local.kubernetes_setup_config.kubernetes_service_account_namespace } provisioner "local-exec" { when = create interpreter = ["/bin/bash", "-c"] command = <<-EOT ${path.module}/scripts/kubernetes-setup.sh \ ${self.triggers.project_id} \ ${self.triggers.gsa_name} \ ${self.triggers.ksa_name} \ ${self.triggers.ksa_namespace} EOT on_failure = fail } depends_on = [null_resource.gke-cluster-command] }