This tutorial is intended for cloud architects and operations administrators interested in deploying a web application to a Google Kubernetes Engine (GKE) cluster and exposing it with an HTTPS load balancer.
Create a GKE cluster
The following Terraform file creates a GKE cluster:
The following Terraform file creates a global IP address and Cloud DNS zone:
Initialize Terraform:
terraform init
View the infrastructure changes:
terraform plan
When prompted, enter your domain, such as
my-domain.net
.Apply the Terraform configuration:
terraform apply --auto-approve
When prompted, enter your domain, such as
my-domain.net
.The output is similar to the following:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: cluster_name = "networking-cluster" region = "us-central1"
Create an external Application Load Balancer
The following manifest describes a ManagedCertificate, FrontendConfig, Deployment, Service, and Ingress:
Replace
DOMAIN_NAME
with your domain name, such asmy-domain.net
.This manifest has the following properties:
networking.gke.io/managed-certificates
: the name of the ManagedCertificate.networking.gke.io/v1beta1.FrontendConfig
: the name of the FrontendConfig resource.kubernetes.io/ingress.global-static-ip-name
: the name of the IP address.kubernetes.io/ingress.class
: instructs the GKE Ingress controller to create an external Application Load Balancer.
Apply the manifest to your cluster:
kubectl apply -f kubernetes-manifests.yaml
Verify the Ingress was created:
kubectl describe ingress frontend
The output is similar to the following:
... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 2m loadbalancer-controller default/frontend Normal CREATE 1m loadbalancer-controller ip: 203.0.113.2 ...
It might take several minutes for the Ingress to provision.
Test application
Check the status of the SSL certificate:
kubectl get managedcertificates.networking.gke.io networking-managed-cert
The SSL certificate might take up to 30 minutes to provision. The following output indicates the SSL certificate is ready:
NAME AGE STATUS networking-managed-cert 28m Active
Run a
curl
command:curl -Lv https://DOMAIN_NAME
The output is similar to the following:
* Trying 34.160.115.33:443... * Connected to DOMAIN_NAME (34.160.115.33) port 443 (#0) ... * TLSv1.3 (IN), TLS handshake, Certificate (11): ... * Server certificate: * subject: CN=DOMAIN_NAME ... > Host: DOMAIN_NAME