292 lines
6.9 KiB
Markdown
292 lines
6.9 KiB
Markdown
---
|
|
title: Set up Ingress on Minikube with the NGINX Ingress Controller
|
|
content_template: templates/task
|
|
weight: 100
|
|
---
|
|
|
|
{{% capture overview %}}
|
|
|
|
An [Ingress](/docs/concepts/services-networking/ingress/) is an API object that defines rules which allow external access
|
|
to services in a cluster. An [Ingress controller](/docs/concepts/services-networking/ingress-controllers/) fulfills the rules set in the Ingress.
|
|
|
|
{{< caution >}}
|
|
For the Ingress resource to work, the cluster **must** also have an Ingress controller running.
|
|
{{< /caution >}}
|
|
|
|
This page shows you how to set up a simple Ingress which routes requests to Service web or web2 depending on the HTTP URI.
|
|
|
|
{{% /capture %}}
|
|
|
|
{{% capture prerequisites %}}
|
|
|
|
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
|
|
|
{{% /capture %}}
|
|
|
|
{{% capture steps %}}
|
|
|
|
## Create a Minikube cluster
|
|
|
|
1. Click **Launch Terminal**
|
|
|
|
{{< kat-button >}}
|
|
|
|
1. (Optional) If you installed Minikube locally, run the following command:
|
|
|
|
```shell
|
|
minikube start
|
|
```
|
|
|
|
## Enable the Ingress controller
|
|
|
|
1. To enable the NGINX Ingress controller, run the following command:
|
|
|
|
```shell
|
|
minikube addons enable ingress
|
|
```
|
|
|
|
1. Verify that the NGINX Ingress controller is running
|
|
|
|
```shell
|
|
kubectl get pods -n kube-system
|
|
```
|
|
|
|
{{< note >}}This can take up to a minute.{{< /note >}}
|
|
|
|
Output:
|
|
|
|
```shell
|
|
NAME READY STATUS RESTARTS AGE
|
|
default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
|
|
kube-addon-manager-minikube 1/1 Running 0 3m
|
|
kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
|
|
kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
|
|
nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
|
|
storage-provisioner 1/1 Running 0 2m
|
|
```
|
|
|
|
## Deploy a hello, world app
|
|
|
|
1. Create a Deployment using the following command:
|
|
|
|
```shell
|
|
kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
deployment.apps/web created
|
|
```
|
|
|
|
1. Expose the Deployment:
|
|
|
|
```shell
|
|
kubectl expose deployment web --target-port=8080 --type=NodePort
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
service/web exposed
|
|
```
|
|
|
|
1. Verify the Service is created and is available on a node port:
|
|
|
|
```shell
|
|
kubectl get service web
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
|
web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
|
|
```
|
|
|
|
1. Visit the service via NodePort:
|
|
|
|
```shell
|
|
minikube service web --url
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
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**.{{< /note >}}
|
|
|
|
Output:
|
|
|
|
```shell
|
|
Hello, world!
|
|
Version: 1.0.0
|
|
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 resource
|
|
|
|
The following file is an Ingress resource that sends traffic to your Service via hello-world.info.
|
|
|
|
1. Create `example-ingress.yaml` from the following file:
|
|
|
|
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
|
|
kind: Ingress
|
|
metadata:
|
|
name: example-ingress
|
|
annotations:
|
|
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
|
spec:
|
|
rules:
|
|
- host: hello-world.info
|
|
http:
|
|
paths:
|
|
- path: /
|
|
backend:
|
|
serviceName: web
|
|
servicePort: 8080
|
|
|
|
1. Create the Ingress resource by running the following command:
|
|
|
|
```shell
|
|
kubectl apply -f example-ingress.yaml
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
ingress.networking.k8s.io/example-ingress created
|
|
```
|
|
|
|
1. Verify the IP address is set:
|
|
|
|
```shell
|
|
kubectl get ingress
|
|
```
|
|
|
|
{{< note >}}This can take a couple of minutes.{{< /note >}}
|
|
|
|
```shell
|
|
NAME HOSTS ADDRESS PORTS AGE
|
|
example-ingress hello-world.info 172.17.0.15 80 38s
|
|
```
|
|
|
|
1. Add the following line to the bottom of the `/etc/hosts` file.
|
|
|
|
{{< note >}}If you are running Minikube locally, use `minikube ip` to get the external IP. The IP address displayed within the ingress list will be the internal IP.{{< /note >}}
|
|
|
|
```
|
|
172.17.0.15 hello-world.info
|
|
```
|
|
|
|
This sends requests from hello-world.info to Minikube.
|
|
|
|
1. Verify that the Ingress controller is directing traffic:
|
|
|
|
```shell
|
|
curl hello-world.info
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
Hello, world!
|
|
Version: 1.0.0
|
|
Hostname: web-55b8c6998d-8k564
|
|
```
|
|
|
|
{{< note >}}If you are running Minikube locally, you can visit hello-world.info from your browser.{{< /note >}}
|
|
|
|
## Create Second Deployment
|
|
|
|
1. Create a v2 Deployment using the following command:
|
|
|
|
```shell
|
|
kubectl run web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080
|
|
```
|
|
Output:
|
|
|
|
```shell
|
|
deployment.apps/web2 created
|
|
```
|
|
|
|
1. Expose the Deployment:
|
|
|
|
```shell
|
|
kubectl expose deployment web2 --target-port=8080 --type=NodePort
|
|
```
|
|
|
|
Output:
|
|
|
|
```shell
|
|
service/web2 exposed
|
|
```
|
|
|
|
## Edit Ingress
|
|
|
|
1. Edit the existing `example-ingress.yaml` and add the following lines:
|
|
|
|
```yaml
|
|
- path: /v2/*
|
|
backend:
|
|
serviceName: web2
|
|
servicePort: 8080
|
|
```
|
|
|
|
1. Apply the changes:
|
|
|
|
```shell
|
|
kubectl apply -f example-ingress.yaml
|
|
```
|
|
|
|
Output:
|
|
```shell
|
|
ingress.extensions/example-ingress configured
|
|
```
|
|
|
|
## Test Your Ingress
|
|
|
|
1. Access the 1st version of the Hello World app.
|
|
|
|
```shell
|
|
curl hello-world.info
|
|
```
|
|
|
|
Output:
|
|
```shell
|
|
Hello, world!
|
|
Version: 1.0.0
|
|
Hostname: web-55b8c6998d-8k564
|
|
```
|
|
|
|
1. Access the 2nd version of the Hello World app.
|
|
|
|
```shell
|
|
curl hello-world.info/v2
|
|
```
|
|
|
|
Output:
|
|
```shell
|
|
Hello, world!
|
|
Version: 2.0.0
|
|
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.{{< /note >}}
|
|
|
|
{{% /capture %}}
|
|
|
|
|
|
{{% capture whatsnext %}}
|
|
* Read more about [Ingress](/docs/concepts/services-networking/ingress/)
|
|
* Read more about [Ingress Controllers](/docs/concepts/services-networking/ingress-controllers/)
|
|
* Read more about [Services](/docs/concepts/services-networking/service/)
|
|
|
|
{{% /capture %}}
|
|
|