terraform/modules/autoscaler-gke/main.tf (158 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.
*/
terraform {
provider_meta "google" {
module_name = "cloud-solutions/memorystore-cluster-autoscaler-deploy-gke-v3.0.0" // x-release-please-version
}
}
locals {
poller_sa_name = element(split("@", var.poller_sa_email), 0)
scaler_sa_name = element(split("@", var.scaler_sa_email), 0)
}
resource "google_service_account" "otel_collector_service_account" {
project = var.project_id
account_id = var.otel_collector_sa_name
display_name = "Memorystore Cluster Autoscaler - SA for OpenTelemetry Collector in ${var.name}"
}
resource "google_project_iam_member" "metrics_publisher_otel_collector" {
project = var.project_id
role = "roles/monitoring.metricWriter"
member = "serviceAccount:${google_service_account.otel_collector_service_account.email}"
}
resource "google_service_account" "gke_cluster_service_account" {
project = var.project_id
account_id = "cluster-sa"
display_name = "Memorystore Cluster Autoscaler - cluster SA for ${var.name}"
}
resource "google_project_iam_member" "cluster_iam_logginglogwriter" {
project = var.project_id
role = "roles/logging.logWriter"
member = "serviceAccount:${google_service_account.gke_cluster_service_account.email}"
}
resource "google_project_iam_member" "cluster_iam_monitoringmetricwriter" {
project = var.project_id
role = "roles/monitoring.metricWriter"
member = "serviceAccount:${google_service_account.gke_cluster_service_account.email}"
}
resource "google_project_iam_member" "cluster_iam_monitoringviewer" {
project = var.project_id
role = "roles/monitoring.viewer"
member = "serviceAccount:${google_service_account.gke_cluster_service_account.email}"
}
resource "google_project_iam_member" "cluster_iam_resourcemetadatawriter" {
project = var.project_id
role = "roles/stackdriver.resourceMetadata.writer"
member = "serviceAccount:${google_service_account.gke_cluster_service_account.email}"
}
resource "google_project_iam_member" "cluster_iam_artifactregistryreader" {
project = var.project_id
role = "roles/artifactregistry.reader"
member = "serviceAccount:${google_service_account.gke_cluster_service_account.email}"
}
resource "google_artifact_registry_repository" "autoscaler_artifact_repo" {
location = var.region
repository_id = "memorystore-cluster-autoscaler"
description = "Image registry for Memorystore Cluster Autoscaler"
format = "DOCKER"
}
data "google_client_config" "default" {}
provider "kubernetes" {
host = "https://${module.autoscaler-gke.endpoint}"
token = data.google_client_config.default.access_token
cluster_ca_certificate = base64decode(module.autoscaler-gke.ca_certificate)
}
resource "kubernetes_namespace" "autoscaler_namespace" {
metadata {
name = var.namespace
}
}
module "workload_identity_poller" {
count = var.unified_components ? 0 : 1
source = "terraform-google-modules/kubernetes-engine/google//modules/workload-identity"
version = "36.0.2"
project_id = var.project_id
namespace = var.namespace
use_existing_k8s_sa = false
use_existing_gcp_sa = true
name = local.poller_sa_name
depends_on = [kubernetes_namespace.autoscaler_namespace, var.poller_sa_email]
}
module "workload_identity_scaler" {
source = "terraform-google-modules/kubernetes-engine/google//modules/workload-identity"
version = "36.0.2"
project_id = var.project_id
namespace = var.namespace
use_existing_k8s_sa = false
use_existing_gcp_sa = true
name = local.scaler_sa_name
depends_on = [kubernetes_namespace.autoscaler_namespace, var.scaler_sa_email]
}
module "workload_identity_otel_collector" {
source = "terraform-google-modules/kubernetes-engine/google//modules/workload-identity"
version = "36.0.2"
project_id = var.project_id
namespace = var.namespace
use_existing_k8s_sa = false
use_existing_gcp_sa = true
name = var.otel_collector_sa_name
depends_on = [kubernetes_namespace.autoscaler_namespace, google_service_account.otel_collector_service_account]
}
module "autoscaler-gke" {
source = "terraform-google-modules/kubernetes-engine/google//modules/private-cluster"
version = "36.0.2"
project_id = var.project_id
name = var.name
region = var.region
network = var.network
subnetwork = var.subnetwork
release_channel = var.release_channel
master_ipv4_cidr_block = var.ip_range_master
ip_range_pods = var.ip_range_pods
ip_range_services = var.ip_range_services
enable_private_nodes = true
enable_shielded_nodes = true
network_policy = true
regional = true
create_service_account = false
service_account = google_service_account.gke_cluster_service_account.email
node_metadata = "GKE_METADATA"
remove_default_node_pool = true
initial_node_count = 1
deletion_protection = false
master_authorized_networks = [
{
cidr_block = "0.0.0.0/0"
display_name = "Public"
},
]
node_pools = [
{
name = "autoscaler-pool"
machine_type = var.machine_type
min_count = var.minimum_node_pool_instances
max_count = var.maximum_node_pool_instances
auto_upgrade = true
auto_repair = true
enable_secure_boot = true
service_account = google_service_account.gke_cluster_service_account.email
},
]
node_pools_oauth_scopes = {
all = [
"https://www.googleapis.com/auth/cloud-platform",
]
}
}