Set up Ingress on Minikube with the NGINX Ingress Controller

    This page shows you how to set up a simple Ingress which routes requests to Service web or web2 depending on the HTTP URI.

    You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes that are not acting as control plane hosts. If you do not already have a cluster, you can create one by using or you can use one of these Kubernetes playgrounds:

    Your Kubernetes server must be at or later than version 1.19. To check the version, enter . If you are using an older Kubernetes version, switch to the documentation for that version.

    Using Katacoda

    Locally

    If you already locally, run minikube start to create a cluster.

    Enable the Ingress controller

    1. To enable the NGINX Ingress controller, run the following command:

    2. Verify that the NGINX Ingress controller is running

      1. kubectl get pods -n ingress-nginx

      Note: It can take up to a minute before you see these pods running OK.

      The output is similar to:

      1. NAME READY STATUS RESTARTS AGE
      2. ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m
      3. ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m
      4. ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
      1. kubectl get pods -n kube-system

      Note: It can take up to a minute before you see these pods running OK.

      The output is similar to:

      1. NAME READY STATUS RESTARTS AGE
      2. default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
      3. kube-addon-manager-minikube 1/1 Running 0 3m
      4. kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
      5. kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
      6. nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
      7. storage-provisioner 1/1 Running 0 2m

      Make sure that you see a Pod with a name that starts with nginx-ingress-controller-.

    1. Create a Deployment using the following command:

      1. kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

      The output should be:

      1. deployment.apps/web created
    2. Expose the Deployment:

      1. kubectl expose deployment web --type=NodePort --port=8080
      1. service/web exposed
    3. Visit the Service via NodePort:

      The output is similar to:

      1. http://172.17.0.15:31637

      Note: Katacoda environment only: at the top of the terminal panel, click the plus sign, and then click Select port to view on Host 1. Enter the NodePort, in this case 31637, and then click Display Port.

      The output is similar to:

      1. Hello, world!
      2. Hostname: web-55b8c6998d-8k564

      You can now access the sample app via the Minikube IP address and NodePort. The next step lets you access the app using the Ingress resource.

    Create an Ingress

    The following manifest defines an Ingress that sends traffic to your Service via hello-world.info.

    1. Create example-ingress.yaml from the following file:

      1. apiVersion: networking.k8s.io/v1
      2. kind: Ingress
      3. metadata:
      4. name: example-ingress
      5. annotations:
      6. nginx.ingress.kubernetes.io/rewrite-target: /$1
      7. spec:
      8. rules:
      9. - host: hello-world.info
      10. http:
      11. paths:
      12. - path: /
      13. pathType: Prefix
      14. backend:
      15. service:
      16. name: web
      17. port:
      18. number: 8080
    2. Create the Ingress object by running the following command:

      1. kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml

      The output should be:

      1. ingress.networking.k8s.io/example-ingress created
    3. Verify the IP address is set:

      1. kubectl get ingress

      Note: This can take a couple of minutes.

      You should see an IPv4 address in the ADDRESS column; for example:

      1. NAME CLASS HOSTS ADDRESS PORTS AGE
      2. example-ingress <none> hello-world.info 172.17.0.15 80 38s
    4. Verify that the Ingress controller is directing traffic:

      1. curl hello-world.info

      You should see:

      1. Hello, world!
      2. Version: 1.0.0
      3. Hostname: web-55b8c6998d-8k564

      Note: If you are running Minikube locally, you can visit hello-world.info from your browser.

    1. Create another Deployment using the following command:

      The output should be:

      1. deployment.apps/web2 created
    2. Expose the second Deployment:

      1. kubectl expose deployment web2 --port=8080 --type=NodePort

      The output should be:

      1. service/web2 exposed

    Edit the existing Ingress

    1. Edit the existing example-ingress.yaml manifest, and add the following lines at the end:

      1. - path: /v2
      2. pathType: Prefix
      3. backend:
      4. service:
      5. name: web2
      6. port:
      7. number: 8080
    2. Apply the changes:

      1. kubectl apply -f example-ingress.yaml

      You should see:

      1. ingress.networking/example-ingress configured
    1. Access the 1st version of the Hello World app.

      1. curl hello-world.info

      The output is similar to:

      1. Hello, world!
      2. Version: 1.0.0
      3. Hostname: web-55b8c6998d-8k564
    2. Access the 2nd version of the Hello World app.

      1. curl hello-world.info/v2

      The output is similar to:

      1. Hello, world!
      2. Hostname: web2-75cd47646f-t8cjk

      Note: If you are running Minikube locally, you can visit hello-world.info and hello-world.info/v2 from your browser.

    What’s next

    • Read more about Ingress
    • Read more about