infra/deploy_kubernetes_manifests.tf (111 lines of code) (raw):

/** * Copyright 2023 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. */ // This file deploys a Kubernetes Job to the config cluster. // That Job will deploy Kubernetes resources to all clusters. locals { k8s_deployer_namespace = "default" k8s_service_account_name = "k8s-manifests-deployer-service-account" google_service_account_id = "k8s-manifests-deployer${var.resource_name_suffix}" } // Kubernetes (K8s) Job inside the cluser that deploys K8s resources to all clusters. resource "kubernetes_job" "kubernetes_manifests_deployer_job" { metadata { name = "kubernetes-manifests-deployer-job" namespace = local.k8s_deployer_namespace } spec { backoff_limit = 6 completions = 1 template { metadata {} spec { service_account_name = local.k8s_service_account_name container { name = "kubernetes-manifests-deployer" image = "us-docker.pkg.dev/google-samples/containers/gke/kubernetes-manifests-deployer:v0.0.0.3" env { name = "PROJECT_ID" value = var.project_id } env { name = "RESOURCE_NAME_SUFFIX" value = var.resource_name_suffix } resources { limits = { cpu = "250m" memory = "128Mi" } requests = { cpu = "100m" memory = "64Mi" } } } restart_policy = "Never" } } } wait_for_completion = true timeouts { create = "900s" } depends_on = [ google_container_cluster.my_cluster_europe, google_container_cluster.my_cluster_usa, google_project_iam_member.google_service_account_is_kubernetes_admin, google_service_account_iam_member.allow_kubernetes_sa_to_impersonate_google_cloud_sa, kubernetes_service_account.kubernetes_manifests_deployer_service_account, module.enable_multi_cluster_google_apis, ] } // Kubernetes Service Account (different from the Google Cloud Service Account). resource "kubernetes_service_account" "kubernetes_manifests_deployer_service_account" { metadata { name = local.k8s_service_account_name namespace = local.k8s_deployer_namespace annotations = { "iam.gke.io/gcp-service-account" = google_service_account.kubernetes_manifests_deployer_service_account.email } } depends_on = [ google_container_cluster.my_cluster_config ] } // The Google Cloud Service Account. resource "google_service_account" "kubernetes_manifests_deployer_service_account" { project = var.project_id account_id = local.google_service_account_id display_name = "Kubernetes Manifests Deployer" depends_on = [ module.enable_base_google_apis ] } // The Google Cloud Service Account needs to administer Kubernetes resource in all clusters. resource "google_project_iam_member" "google_service_account_is_kubernetes_admin" { project = var.project_id role = "roles/container.admin" member = "serviceAccount:${google_service_account.kubernetes_manifests_deployer_service_account.email}" } // Allow the Kubernetes Service Account to impersonate the Google Cloud Service Account. resource "google_service_account_iam_member" "allow_kubernetes_sa_to_impersonate_google_cloud_sa" { service_account_id = google_service_account.kubernetes_manifests_deployer_service_account.name role = "roles/iam.workloadIdentityUser" member = "serviceAccount:${var.project_id}.svc.id.goog[${local.k8s_deployer_namespace}/${local.k8s_service_account_name}]" depends_on = [ kubernetes_service_account.kubernetes_manifests_deployer_service_account ] }