Files
Davi Garcia 9d34deda55 Remove untidy caution note from tutorial
The caution note was warning user about having Ingress Controller configured as prerequisite, but this is exactly what the tutorial is explaining.

Signed-off-by: Davi Garcia <dvercill@redhat.com>
2020-04-02 10:01:50 -03:00

288 lines
6.8 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.
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 %}}