terraform/modules/admin-lb/main.tf (58 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.
resource "google_compute_global_address" "admin-service-address" {
name = var.external_address_name
}
resource "kubernetes_manifest" "admin-server-cert" {
manifest = {
apiVersion = "networking.gke.io/v1"
kind = "ManagedCertificate"
metadata = {
name = var.admin_server_cert_id
namespace = var.deployment_namespace
}
spec = {
domains = ["${var.admin_domain_prefix}.${var.admin_domain}", "${var.mqtt_domain_prefix}.${var.admin_domain}"]
}
}
}
resource "null_resource" "wait_for_server_cert_creation" {
provisioner "local-exec" {
interpreter = ["/bin/sh", "-c"]
command = <<-EOT
. ../common.sh
wait_for_state kubectl "describe managedcertificate ${var.admin_server_cert_id} --namespace=${var.deployment_namespace}" 'certificate name' 'The managed server certificate was not created, please ensure that the managed certificate with ID ${var.admin_server_cert_id} is present on your GKE cluster before proceeding with the deployment.' 15 50
EOT
}
depends_on = [
kubernetes_manifest.admin-server-cert
]
}
data "kubernetes_resource" "managed_certificate" {
api_version = kubernetes_manifest.admin-server-cert.manifest.apiVersion
kind = kubernetes_manifest.admin-server-cert.manifest.kind
metadata {
name = kubernetes_manifest.admin-server-cert.manifest.metadata.name
namespace = kubernetes_manifest.admin-server-cert.manifest.metadata.namespace
}
depends_on = [null_resource.wait_for_server_cert_creation]
}
resource "kubernetes_ingress_v1" "admin-ingress" {
metadata {
name = var.admin_ingress_name
namespace = var.deployment_namespace
annotations = {
"kubernetes.io/ingress.global-static-ip-name" = google_compute_global_address.admin-service-address.name
"networking.gke.io/managed-certificates" = kubernetes_manifest.admin-server-cert.manifest.metadata.name
"kubernetes.io/ingress.class" = "gce"
}
}
spec {
default_backend {
service {
name = var.admin_k8s_service_name
port {
number = var.admin_k8s_service_port
}
}
}
}
}