terraform/modules/fleet/mcg.tf (186 lines of code) (raw):

/** * Copyright 2024 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. */ data "google_project" "fleet_project" { project_id = var.fleet_project } // Hydrate locals{ whereami_openapi_spec = <<-EOT swagger: "2.0" info: description: "Cloud Endpoints DNS" title: "Cloud Endpoints DNS" version: "1.0.0" paths: {} host: "whereami.endpoints.${var.fleet_project}.cloud.goog" x-google-endpoints: - name: "whereami.endpoints.${var.fleet_project}.cloud.goog" target: ${google_compute_global_address.whereami_ip.address} EOT inference_openapi_spec = <<-EOT swagger: "2.0" info: description: "Cloud Endpoints DNS" title: "Cloud Endpoints DNS" version: "1.0.0" paths: {} host: "inference.endpoints.${var.fleet_project}.cloud.goog" x-google-endpoints: - name: "inference.endpoints.${var.fleet_project}.cloud.goog" target: ${google_compute_global_address.inference_ip.address} EOT } // Public IP & endpoint for whereami app resource "google_compute_global_address" "whereami_ip" { name = "whereami-ip" project = var.fleet_project } resource "google_endpoints_service" "whereami_service" { service_name = "whereami.endpoints.${var.fleet_project}.cloud.goog" project = var.fleet_project openapi_config = local.whereami_openapi_spec depends_on = [ resource.google_compute_global_address.whereami_ip, module.enabled_service_project_apis, ] } // Public IP for inference app resource "google_compute_global_address" "inference_ip" { name = "inference-ip" project = var.fleet_project } resource "google_endpoints_service" "inference_service" { service_name = "inference.endpoints.${var.fleet_project}.cloud.goog" project = var.fleet_project openapi_config = local.inference_openapi_spec depends_on = [ resource.google_compute_global_address.inference_ip, module.enabled_service_project_apis, ] } resource "google_certificate_manager_certificate_map" "mcg_certificate_map" { name = "mcg-cert-map" description = "My acceptance test certificate map" } resource "google_certificate_manager_certificate_map_entry" "mcg_cert_map_entry" { name = "mcg-cert-map-entry" description = "My acceptance test certificate map entry" map = google_certificate_manager_certificate_map.mcg_certificate_map.name certificates = [google_certificate_manager_certificate.mcg_certificate.id] hostname = "whereami.endpoints.${var.fleet_project}.cloud.goog" } resource "google_certificate_manager_certificate" "mcg_certificate" { name = "mcg-cert" scope = "DEFAULT" managed { domains = [ "whereami.endpoints.${var.fleet_project}.cloud.goog" ] } } // https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-ingress-setup#shared_vpc_deployment module "firewall_rules" { source = "terraform-google-modules/network/google//modules/firewall-rules" project_id = var.vpc_project_id network_name = var.vpc_name rules = [{ name = "allow-glcb-backend-ingress" description = null direction = "INGRESS" priority = null ranges = ["130.211.0.0/22", "35.191.0.0/16"] source_tags = null source_service_accounts = null target_tags = null target_service_accounts = null allow = [{ protocol = "tcp" ports = ["0-65535"] }] deny = [] log_config = { metadata = "INCLUDE_ALL_METADATA" } }] } // enable Multi-cluster service discovery resource "google_gke_hub_feature" "mcs" { name = "multiclusterservicediscovery" location = "global" project = var.fleet_project provider = google-beta depends_on = [module.enabled_service_project_apis] } // enable Multi-cluster Ingress(also gateway) project wide resource "google_gke_hub_feature" "mci" { name = "multiclusteringress" location = "global" project = var.fleet_project spec { multiclusteringress { config_membership = "projects/${var.project_id}/locations/us-central1/memberships/gke-ap-admin-cp-00" } } depends_on = [ google_gke_hub_feature.mcs, google_container_cluster.admin, ] } // Create IAM binding granting the fleet host project's GKE Hub service account the GKE Service Agent role for cluster project - ONLY NEEDED IF CLUSTER IS IN NOT IN THE FLEET HOST PROJECT and needs to be done for every cluster project resource "google_project_iam_binding" "serviceagent-fleet-member-hubagent" { role = "roles/gkehub.serviceAgent" project = var.project_id members = [ "serviceAccount:service-${data.google_project.fleet_project.number}@gcp-sa-mcsd.iam.gserviceaccount.com", ] depends_on = [google_gke_hub_feature.mcs] } // Create IAM binding granting the fleet host project's MCS service account the MCS Service Agent role for cluster project - this needs to be done for every cluster project resource "google_project_iam_binding" "serviceagent-fleet-member-mcsagent" { role = "roles/multiclusterservicediscovery.serviceAgent" project = var.project_id members = [ "serviceAccount:service-${data.google_project.fleet_project.number}@gcp-sa-mcsd.iam.gserviceaccount.com", ] depends_on = [google_gke_hub_feature.mcs] } // Create IAM binding granting the fleet host project MCS service account the MCS Service Agent role on the Shared VPC host project resource "google_project_iam_binding" "serviceagent-fleet-host" { role = "roles/multiclusterservicediscovery.serviceAgent" project = var.shared_vpc ? var.vpc_project_id : var.project_id members = [ "serviceAccount:service-${data.google_project.fleet_project.number}@gcp-sa-mcsd.iam.gserviceaccount.com", ] depends_on = [google_gke_hub_feature.mcs] } // Create IAM binding granting the fleet host project MCS service account the MCS Service Agent role on the Shared VPC host project resource "google_project_iam_binding" "network-viewer-fleet-host" { role = "roles/compute.networkViewer" project = var.shared_vpc ? var.vpc_project_id : var.project_id members = [ "serviceAccount:${var.fleet_project}.svc.id.goog[gke-mcs/gke-mcs-importer]", ] depends_on = [google_gke_hub_feature.mcs] } // Create IAM binding granting the fleet host project MCS service account the MCS Service Agent role on the Shared VPC host project resource "google_project_iam_binding" "network-viewer-member" { role = "roles/compute.networkViewer" project = var.fleet_project members = [ "serviceAccount:${var.fleet_project}.svc.id.goog[gke-mcs/gke-mcs-importer]", ] depends_on = [google_gke_hub_feature.mcs] }