modules/tfc-agent-gke/main.tf (209 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. */ locals { network_name = var.create_network ? google_compute_network.tfc_agent_network[0].name : var.network_name subnet_name = var.create_network ? google_compute_subnetwork.tfc_agent_subnetwork[0].name : var.subnet_name service_account_email = var.create_service_account ? google_service_account.tfc_agent_service_account[0].email : var.service_account_email tfc_agent_name = "${var.tfc_agent_name_prefix}-${random_string.suffix.result}" } resource "random_string" "suffix" { length = 4 special = false upper = false } /***************************************** Optional Network *****************************************/ resource "google_compute_network" "tfc_agent_network" { count = var.create_network ? 1 : 0 name = var.network_name project = var.project_id auto_create_subnetworks = false } resource "google_compute_subnetwork" "tfc_agent_subnetwork" { count = var.create_network ? 1 : 0 project = var.project_id name = var.subnet_name ip_cidr_range = var.subnet_ip region = var.region network = google_compute_network.tfc_agent_network[0].name secondary_ip_range { range_name = var.ip_range_pods_name ip_cidr_range = var.ip_range_pods_cidr } secondary_ip_range { range_name = var.ip_range_services_name ip_cidr_range = var.ip_range_services_cider } } /***************************************** IAM Bindings GKE *****************************************/ resource "google_service_account" "tfc_agent_service_account" { count = var.create_service_account ? 1 : 0 project = var.project_id account_id = "tfc-agent-gke" display_name = "Terraform Cloud agent GKE Service Account" } /***************************************** TFC agent GKE *****************************************/ module "tfc_agent_cluster" { source = "terraform-google-modules/kubernetes-engine/google//modules/beta-public-cluster/" version = "~> 34.0" project_id = var.project_id region = var.region zones = var.zones network = local.network_name name = local.tfc_agent_name subnetwork = local.subnet_name service_account = local.service_account_email network_project_id = var.network_project_id != "" ? var.network_project_id : var.project_id ip_range_pods = var.ip_range_pods_name ip_range_services = var.ip_range_services_name logging_service = "logging.googleapis.com/kubernetes" monitoring_service = "monitoring.googleapis.com/kubernetes" remove_default_node_pool = true regional = false gce_pd_csi_driver = true deletion_protection = false node_pools = [ { name = "tfc-agent-pool" min_count = var.min_node_count max_count = var.max_node_count auto_upgrade = true machine_type = var.machine_type } ] } /***************************************** K8S resources for configuring TFC agent *****************************************/ data "google_client_config" "default" { } resource "kubernetes_secret" "tfc_agent_secrets" { metadata { name = var.tfc_agent_k8s_secrets } data = { tfc_agent_address = var.tfc_agent_address tfc_agent_token = var.tfc_agent_token tfc_agent_single = var.tfc_agent_single tfc_agent_auto_update = var.tfc_agent_auto_update tfc_agent_name = local.tfc_agent_name } } # Deploy the agent resource "kubernetes_deployment" "tfc_agent_deployment" { metadata { name = "${local.tfc_agent_name}-deployment" } spec { selector { match_labels = { app = local.tfc_agent_name } } replicas = var.tfc_agent_min_replicas template { metadata { labels = { app = local.tfc_agent_name } } spec { container { name = local.tfc_agent_name image = var.tfc_agent_image env { name = "TFC_ADDRESS" value_from { secret_key_ref { name = var.tfc_agent_k8s_secrets key = "tfc_agent_address" } } } env { name = "TFC_AGENT_TOKEN" value_from { secret_key_ref { name = var.tfc_agent_k8s_secrets key = "tfc_agent_token" } } } env { name = "TFC_AGENT_NAME" value_from { secret_key_ref { name = var.tfc_agent_k8s_secrets key = "tfc_agent_name" } } } env { name = "TFC_AGENT_SINGLE" value_from { secret_key_ref { name = var.tfc_agent_k8s_secrets key = "tfc_agent_single" } } } env { name = "TFC_AGENT_AUTO_UPDATE" value_from { secret_key_ref { name = var.tfc_agent_k8s_secrets key = "tfc_agent_auto_update" } } } # https://developer.hashicorp.com/terraform/cloud-docs/agents/requirements resources { requests = { memory = var.tfc_agent_memory_request cpu = var.tfc_agent_cpu_request } } } } } } } # Deploy a horizontal pod autoscaler for the agent resource "kubernetes_horizontal_pod_autoscaler_v2" "tfc_agent_hpa" { metadata { name = "${local.tfc_agent_name}-deployment-hpa" } spec { scale_target_ref { kind = "Deployment" name = "${local.tfc_agent_name}-deployment" } min_replicas = var.tfc_agent_min_replicas max_replicas = var.tfc_agent_max_replicas metric { type = "Resource" resource { name = "cpu" target { type = "Utilization" average_utilization = 50 } } } } }