How to Setup NGINX Ingress Controller in Kubernetes

Ingress is one of the important concepts in Kubernetes, which allows external users to access containerized application using FQDN (fully qualified domain name). Though Ingress is not enabled and installed by default in Kubernetes cluster. We must enable to this core concept using third party ingress controllers like Nginx, Traefik, HAProxy and Istio etc.

In this tutorial we will demonstrate how we can enable and use NGINX Ingress controller in Kubernetes Cluster.

NGINX-Ingress-Controller-Kubernetes

As above picture, external users are accessing applications using NGINX Ingress Controller via FQDN and internal ingress controller routes the request to service and then service routes the request to backend end points or pods.

Enable NGINX Ingress Controller in Minikube

Minikube is a single node Kubernetes cluster, we can easily enable nginx ingress controller in minikube by running “minikube addons” command.

Run below command to verify the status of ingress controller,

# minikube addons list

Minikube-addons-status-linux

Run following minikube command to enable ingress controller,

[root@linuxtechi ~]# minikube addons enable ingress
* The 'ingress' addon is enabled
[root@linuxtechi ~]#

If we re-run “minikube addons list” command, this time we must see the status of ingress is enabled.

Run following kubectl command to verify whether ingress controller’s pod is running or not.

[root@linuxtechi ~]# kubectl get pods --all-namespaces | grep -i nginx-controller
kube-system      ingress-nginx-controller-7bb4c67d67-gkjj5    1/1     Running            0          20m
[root@linuxtechi ~]#

Above output confirms that nginx-controller has been enabled and started its pod successfully under kube-system namespace.

Setup NGINX Ingress Controller in multi-node Kubernetes cluster

Note: I am assuming Kubernetes cluster is up and running.

Go to master node or control plane node and execute following kubectl command,

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml

We will get the following output,

Kubectl-Deploy-NGINX-Ingress-Controller-Kubernetes

Run following kubectl command to verify the status of nginx-ingress controller pods,

pkumar@k8s-master:~$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-v7ftn        0/1     Completed   0          6m12s
ingress-nginx-admission-patch-njdnf         0/1     Completed   0          6m12s
ingress-nginx-controller-75f84dfcd7-p5dct   1/1     Running     0          6m23s
pkumar@k8s-master:~$

Perfect, above output confirms that NGINX Ingress Controller has been deployed successfully and it’s pod is currently running.

Test Ingress Controller

To test Ingress controller, we will create two applications based on httpd and nginx container and will expose these applications via their respective services and then will create ingress resource which will allow external users to access these applications using their respective urls.

Deploy httpd based deployment and its service with NodePort type listening on the port 80, Create the following yaml file which includes deployment and service section,

[root@linuxtechi ~]# vi httpd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: httpd-deployment
  template:
    metadata:
      labels:
        run: httpd-deployment
    spec:
      containers:
      - image: httpd
        name: httpd-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  type: NodePort
  selector:
    run: httpd-deployment
  ports:
    - port: 80

Save and close the file.

Run kubectl command to deploy above httpd based deployment and its service,

[root@linuxtechi ~]# kubectl create -f httpd-deployment.yaml
deployment.apps/httpd-deployment created
service/httpd-service created
[root@linuxtechi ~]#

Deploy our next NGINX based deployment and its service with NodePort as its type and port as 80, Content of yaml file listed below,

[root@linuxtechi ~]# vi nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-deployment
  template:
    metadata:
      labels:
        run: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    run: nginx-deployment
  ports:
    - port: 80

Save and exit the file

Now run following kubectl command to deploy above nginx based deployment and its service,

[root@linuxtechi ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
[root@linuxtechi ~]#

Run below command to verify the status of both deployments and their services

[root@linuxtechi ~]# kubectl get deployments.apps httpd-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
httpd-deployment   1/1     1            1           19m
[root@linuxtechi ~]#
[root@linuxtechi ~]# kubectl get deployments.apps nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           24m
[root@linuxtechi ~]#
[root@linuxtechi ~]# kubectl get service nginx-service httpd-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.103.75.91 <none> 80:30042/TCP 78m
httpd-service NodePort 10.98.6.131 <none> 80:31770/TCP 73m
[root@linuxtechi ~]#

Create and Deploy Ingress Resource

Create the following ingress resource yaml file which will route the request to the respective service based url or path. In our example we be using url or fqdn.

[root@linuxtechi ~]# vim myweb-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-based-virtualhost-ingress
spec:
  rules:
  - host: httpd.example.com
    http:
      paths:
      - backend:
          serviceName: httpd-service
          servicePort: 80

  - host: nginx.example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80

save and close the file.

Execute beneath kubectl command to create above ingress resource,

[root@linuxtechi ~]# kubectl create -f myweb-ingress.yaml
ingress.networking.k8s.io/name-based-virtualhost-ingress created
[root@linuxtechi ~]#

Run following to verify the status of above created ingress resource

[root@linuxtechi ~]# kubectl get ingress name-based-virtualhost-ingress
[root@linuxtechi ~]# kubectl describe ingress name-based-virtualhost-ingress

Ingress-describe-example-linux

Perfect, above output confirms that ingress resources have been created successfully.

Before accessing these urls from outside of the cluster please make sure to add the following entries in hosts file of your system from where you intended to access these.

192.168.1.190                httpd.example.com
192.168.1.190                nginx.example.com

Now try to access these URLs from web browser, type

https://ift.tt/31TbMUw

https://ift.tt/2BFjs27

httpd-ingress-hosts-linux nginx-ingress-hosts-linux

Great, above confirms that we have successfully deployed and setup nginx ingress controller in Kubernetes. Please do share your valuable feedback and comments.



from Linuxtechi https://ift.tt/2AIPxFI

Post a Comment

0 Comments