---
title: Building Production Topology with Google Cloud - Part 5
type: article
date: 2019-03-17
source: website
original_url: "https://navveenbalani.dev/index.php/articles/building-production-topology-with-google-cloud-part-5/"
topics: ["cloud"]
legacy_categories: ["cloud-computing-articles"]
tags: ["google-cloud"]
summary: In this chapter, we would deploy Nginx Ingress Controller instead of GCE. NGINX, by default, provides a lot of additional capabilities as compared to the default GKE Ingress controller like URL rewriting, whitelisting, load balancing over HTTPS and websocket and advanced…
draft: false
---

In
this chapter, we would deploy Nginx Ingress Controller instead of GCE.

NGINX, by default, provides a lot of additional
capabilities as compared to the default GKE Ingress controller like URL
rewriting, whitelisting, load balancing over HTTPS and websocket and advanced
features through Nginx Plus. For details, refer to <https://www.nginx.com/products/nginx/>.

It is assumed that you have executed Step 1 - 7 as per the previous article.

## Install Nginx Ingress

The first step is to install Nginx Ingress in our
cluster. Navigate to Cloud Console - > Kubernetes Engine -> Cluster.
Click on the connect button for backend-cluster. This will launch the cloud
shell as shown below. Click ok to Run in cloud shell to connect to the
backend-cluster.

*Figure 35:  Cloud Shell*

Next, we will install Helm which allows us to install and manage Kubernetes applications and resources effectively. Helm has two parts: a client (helm) which runs on cloud shell and a server
(tiller) which runs inside of the kubernetes cluster and manages the
installation.

Install the latest version of Helm by running the
following command:

> curl -o get\_helm.sh
https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get

> chmod +x get\_helm.sh

> ./get\_helm.sh

Next, we would Install Tiller. Run the following
commands to install the server-side tiller to the Kubernetes cluster. The below
command creates a service account and the cluster-admin role to manage the
cluster.

> kubectl create
serviceaccount --namespace kube-system tiller

> kubectl create
clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin
--serviceaccount=kube-system:tiller

> helm init --service-account
tiller

The following image shows the command
interactions and output at the google cloud shell.

*Figure 36:  Cloud Shell -> Installation of Helm*

Next, we will install the Nginx Ingress through
Helm. Installing Nginx Ingress will configure a Service type of LoadBalancer in
our cluster which will route all the incoming requests as per the rules you
define in the deployment file (we will look at this later while deploying the
ingress.yaml file).

LoadBalancer should listen over an IP. The IP can
be automatically assigned by the network system or you can create a static IP
address and use the ip address while installing Nginx. We will create a static IP
address since this IP address can then be mapped to your domain name where you
want to expose the service for public consumption (i.e. similar to domain like api.naveenbalani.dev
that we went through in Solution 1). SSL certificate can also be installed on
the domain, so you can receive HTTPS requests.

Create a static IP address of type Regional and
select the region (select the same region as that of your VPN). Please note
that Global Type would not work with Nginx Ingress LoadBalancer. Following
image shows the configuration.

*Figure 37:  Create Static IP*

Create the IP and note the IP address.

Next, go back to cloud shell and install
Nginx Ingress by running the following command. Replace 35.231.11.11 by the IP
from the earlier step.

> helm install --name
nginx-ingress stable/nginx-ingress \

      --set
controller.service.loadBalancerIP=35.231.11.11\

      --set rbac.create=true \

      --set
controller.publishService.enabled=true

The above command would create a Nginx
Ingress Controller of type HTTP Load Balancer at 35.231.11.11.

You can also enable SSL while installing
Nginx Ingress. If you have an SSL certificate for your domain, you can enable
SSL while installing Nginx ingress.

First, you need to create the secret
based on your domain certificate and private key.

> kubectl create secret tls
backend-api-ssl-secret \

 
--cert /Users/navveenbalani/<domain.com>/certificate.crt --key
/Users/navveenbalani/<domain.com>/private.key

Next, you need to reference the
backend-api-ssl-secret while installing Nginx Ingress. Use the following
command to enable SSL during installation:

helm install --name nginx-ingress
stable/nginx-ingress \

      --set
controller.service.loadBalancerIP=35.231.11.11\

       --set rbac.create=true \

      --set
controller.publishService.enabled=true \

      --set controller.extraArgs.default-ssl-

 
      certificate=default/backend-ssl-secret

After running the command, you should get the following
message on the console:

*The nginx-ingress controller has been installed.*

*It may take a few minutes for the LoadBalancer IP
to be available.*

To see the status of the Nginx Ingress
controller, run the following command:

> kubectl --namespace default
get services -o wide -w nginx-ingress-controller

If you see an external IP (the one that we
provided earlier), that implies the Nginx Controller is listening on the
configured external IP.

*Figure 38:  Nginx Ingress Status*

If you navigate to Kubernetes Engine ->
Service & Ingress, you will see nginx-ingress-controller listening on the
ip address that we configured earlier as shown in the figure below. You would
also see a service named “nginx-ingress-default-backend”. The nginx-ingress-default-backend
service provides default backend which handles all URL paths and hosts the nginx controller doesn't
understand (i.e., all the requests that are not mapped with an Ingress).
Basically, a default backend exposes two URLs: - /healthz that returns 200 and / that return 404.  You can use the Nginx default backend service
for the health check instead of providing your own heath check service implementation,
that we discussed earlier in Solution 1.

*Figure 39:  Nginx Ingress Status in Cloud Console*

With the Ingress controller setup, we would
execute the deployment scripts.

[Click here for next section.](/articles/building-production-topology-with-google-cloud-part-6)