DEV Community

Jasper Rodda
Jasper Rodda

Posted on • Updated on

Install Ingress on Kubernetes and Minikube

Kubernetes ingress was introduced to overcome short comings of services. Another version of Kubernetes such as Openshift created similar ingress such as Routes.

Kubernetes Service - Drawbacks

  1. Missing Enterprise Grade Load Bancing Capabilities.
  2. Driving Cloud Cost - for Public IP Address

Kubernetes service [svc] of type=[LoadBalancer] does not support enterprise grade Loadbancing capabilities but rather simple round robin fashion.

To Solve this problem Kubernetes have asked Enterprise Load Balancers such as (F5, NGINX, Ambassador, HA Proxy to name a few) to create Ingress Controllers and user to create a Ingress resources. Its user's responsibilities

Enterprise Load Balancer Offers Advanced Capabilities

  • Ratio Based Routing
  • Sticky Session Routing
  • Host Based
  • Path Based
  • Domain Based
  • White listing IP Addresses
  • Black Listing IP Addresses

1. Install NGINX controller in Kubernetes.

  • minikube addons enable ingressto install on Minikube
  • Verify Ingress Controller installed or not
$minikube addons enable ingress
* ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
  - Using image registry.k8s.io/ingress-nginx/controller:v1.8.1
  - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407
  - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407
* Verifying ingress addon...
* The 'ingress' addon is enabled
Enter fullscreen mode Exit fullscreen mode
  • verify by following command kubectl get pods -A | grep nginx
PS C:\Users\Jasper\OneDrive\Documents\CodeRepo\kubernetes\d38_ingress_ctrl> kubectl get pods -A
NAMESPACE       NAME                                        READY   STATUS      RESTARTS       AGE
default         sample-python-deployment-5787bd6b9f-656fn   1/1     Running     1 (16h ago)    20h
default         sample-python-deployment-5787bd6b9f-t9ttj   1/1     Running     1 (16h ago)    20h
ingress-nginx   ingress-nginx-admission-create-vcq7w        0/1     Completed   0              132m
ingress-nginx   ingress-nginx-admission-patch-g6szm         0/1     Completed   1              132m
ingress-nginx   ingress-nginx-controller-7799c6795f-qc9w5   1/1     Running     0              132m
kube-system     coredns-5d78c9869d-nscfc                    1/1     Running     3 (16h ago)    12d
kube-system     etcd-minikube                               1/1     Running     3 (16h ago)    12d
kube-system     kube-apiserver-minikube                     1/1     Running     3 (16h ago)    12d
kube-system     kube-controller-manager-minikube            1/1     Running     3 (16h ago)    12d
kube-system     kube-proxy-gzk52                            1/1     Running     3 (16h ago)    12d
kube-system     kube-scheduler-minikube                     1/1     Running     3 (16h ago)    12d
kube-system     storage-provisioner                         1/1     Running     12 (69m ago)   12d
Enter fullscreen mode Exit fullscreen mode

2. Create Ingress Resource in Kubernetes.

  • Route foo.bar.com to IP Addresses -- _(To mock it in local, in real time - we do not need to mock is as IP address is mapped to Domain Name by DNS) _
  • Below ingress.yml file is to route foo.bar.com to Service sample-python-service
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-python-service-ingress
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: sample-python-service
            port:
              number: 80
Enter fullscreen mode Exit fullscreen mode
  • Create Ingress resource kubectl apply -f ingress.yml
  • Notice: Nothing happens if you don't install kubernetes controller. Controller will watch for this resource to be created and they applies the logic.
$ kubectl apply -f ingress.yml
ingress.networking.k8s.io/sample-python-service-ingress created
Enter fullscreen mode Exit fullscreen mode

3. Verify Ingress Resource in Kubernetes.

  • Run command kubectl get ingress to view ingress resource
kubectl get ingress
NAME                            CLASS   HOSTS         ADDRESS          PORTS   AGE
sample-python-service-ingress   nginx   foo.bar.com   192.168.59.105   80      6m35s
Enter fullscreen mode Exit fullscreen mode

3. Route domain to Ingress

  • Locate Hosts File and update config to point domain name foo.bar.com to created ingress-service --> which points to service
  • Where is the Hosts File Located?

The location of the hosts file will differ by operating system. The typical locations are noted below.

Windows 10 - "C:\Windows\System32\drivers\etc\hosts"
Linux - "/etc/hosts"
Mac OS X - "/private/etc/hosts"
Enter fullscreen mode Exit fullscreen mode

4. Verify domain is routed to Application (Ingress-> Service-> App)

Image description

Credits:-
Thanks to Abhishek Veeramalla

Top comments (0)