External Load Balancing
This section continues from the previous section - make sure you do the tutorial in sequence.
ServiceThere are primarily 2 ways to expose a Kubernetes Service on the public internet:
Type | Protocol | Locality | When to use? |
TCP/UDP | Regional | Non-HTTP requests, or no need for a global load balancer. Connection to the Load Balancer is routed by public Internet to region of the load balancer. | |
HTTP(s) | Global | HTTP requests. GCP's L7 Load Balancer is a global load balancer - a single IP address can automatically route traffic to the nearest region within the GCP network. |
External Network Load Balancer
Service YAML
To create an external network load balancer, simply change Kubernetes Service's type from clusterip
to loadbalancer
. Modify the k8s/service.yaml
:
Deploy
Use kubectl
command line to deploy the YAML file:
To verify the application is deployed, run :
You should see that the Service has a Cluster IP address, but also the External IP address with the initial value of <pending>
. This is because, behind the scenes, Kubernetes Engine is provisioning a Google Cloud Network Load Balancer.
Connect
Continuously check the External IP address, until an IP address is assigned. Once the IP Address is assigned, you can connect to the External IP address, and it'll be load balanced to the helloworld
service backend pods.
Static IP Address
You can assign a static IP address to the Network Load Balancer.
Reserve a regional static IP address:
See the reserved IP address:
Update the k8s/service.yaml
to pin the Load Balancer IP address:
External HTTP Load Balancer
You can configure an external HTTP load balancer using Kubernetes Ingress. In order for the HTTP Load Balancer to find the backends, it's recommended to use container-native load balancing on Google Cloud.
Service YAML
In the k8s/service.yaml
, use the cloud.google.com/neg
annotation to enable Network Endpoint Group (NEG) in order to use container-native load balancing:
Ingress YAML
Create a Kubernetes Ingress configuration that will create the HTTP Load Balancer. Create a k8s/ingress.yaml
:
Deploy
Use kubectl
command line to deploy the YAML files:
To verify the Ingress is deployed:
You should see that the Ingress has an IP address provisioned:
Many Google Cloud components are being configured behind the scenes to enable global load balancing. It'll take a few minutes before the address is accessible. Use kubectl describe
to see the current status:
Initially, you may see:
When the annotation value of ingress.kubernetes.io/backends
is Unknown
, it means that the backend is not yet accessible.
Re-check the status until the backend becomes HEALTHY
.
Connect
You can then use the IP address to connect:
Static IP Address
By default, the Ingress IP address is ephemeral - it'll change if you ever delete and recreate the Ingress. You can associate the Ingress with a static IP address instead.
Global Static IP Address
Reserve a global static IP address:
See the static IP address you reserved:
Configurations
In k8s/ingress.yaml
, use the kubernetes.io/ingress.global-static-ip-name
annotation to specify the IP name:
Deploy
Deploy the Ingress:
Continuously check the IP address to be updated. It'll take several minutes for the IP address to update:
SSL Certificate
In order to use a SSL certificate to serve HTTPs traffic, you must use a real fully qualified domain name and configure it to point to the IP address. If you don't have a real domain, then you can use xip.io.
You can provision the External HTTP(s) Load Balancer using Ingress with a Managed Certificate, or you can provide your own Self-Managed Certificate.
Managed Certificate
Google Cloud can automatically provision a certificate for your domain name when using the External HTTP(s) Load Balancer.
Create a new k8s/certificate.yaml
:
In k8s/ingress.yaml
, use the networking.gke.io/managed-certificates
annotation to associate the certificate:
Deploy both files:
It may take several minutes to provision the certificate. Check the Managed Certificate status:
Wait until the Certificate Status becomes ACTIVE
:
You can then use HTTPs to connect:
See Using Google-managed SSL certificates for more details.
Self-Managed Certificate
You can configure the Ingress to serve with your own SSL certificate. Usually you would already have a certificate/key pair.
If you don't already have one, you can provision a self-signed certificate for non-production use.
Create a Kubernetes Secret to hold the certificate/key pair:
Update the Ingress to refer to the secret for TLS certificate/key pair:
Deploy the configurations:
It will take several minutes for the new configuration to take effect.
You can then use HTTPs to connect. However, if you used a self-signed certificate, you will need to ignore certificate validation errors:
See Using multiple SSL certificates in HTTP(s) load balancing with Ingress for more details.
Last updated