cleans up the ingress-dns docs

pull/12883/head
rahil-p 2021-11-08 03:32:29 -05:00
parent 9abb3b5bac
commit 2eb6de818a
2 changed files with 98 additions and 59 deletions

View File

@ -1,33 +1,35 @@
---
title: "Ingress DNS"
linkTitle: "Minikube Ingress DNS"
linkTitle: "Ingress DNS"
weight: 1
date: 2021-06-03
date: 2021-11-08
---
DNS service for ingress controllers running on your minikube server
## Overview
### Problem
When running minikube locally you are highly likely to want to run your services on an ingress controller so that you
don't have to use minikube tunnel or NodePorts to access your services. While NodePort might be ok in a lot of
circumstances in order to test some features an ingress is necessary. Ingress controllers are great because you can
define your entire architecture in something like a helm chart and all your services will be available. There is only
1 problem. That is that your ingress controller works basically off of dns and while running minikube that means that
your local dns names like `myservice.test` will have to resolve to `$(minikube ip)` not really a big deal except the
only real way to do this is to add an entry for every service in your `/etc/hosts` file. This gets messy for obvious
reasons. If you have a lot of services running that each have their own dns entry then you have to set those up
manually. Even if you automate it you then need to rely on the host operating system storing configurations instead of
storing them in your cluster. To make it worse it has to be constantly maintained and updated as services are added,
remove, and renamed. I call it the `/etc/hosts` pollution problem.
When running minikube locally, you may want to run your services on an ingress controller so that you don't have to use
minikube tunnel or NodePorts to access your services. While NodePort might be okay in a lot of circumstances, an ingress
is necessary to test some features. Ingress controllers are great because you can define your entire architecture in
something like a helm chart and all your services will be available.
However, for minikube, there is an additional challenge. Your ingress controller relies on DNS, so local DNS names like
`myservice.test` will have to resolve to your `minikube ip`. The only real way to do this is to add an entry for every
service in your `/etc/hosts` file. This gets messy for obvious reasons. For each service you are running that each has
its own DNS entry, you will need to configure it manually. Even if you automate it, you then need to rely on the host
operating system for storing configurations instead of storing them in your cluster. To make it worse, these
configurations have to be constantly maintained and updated as services are added, remove, and renamed. I call it the
`/etc/hosts` pollution problem.
### Solution
What if you could just access your local services magically without having to edit your `/etc/hosts` file? Well now you
can. This addon acts as a DNS service that runs inside your kubernetes cluster. All you have to do is install the
service and add the `$(minikube ip)` as a DNS server on your host machine. Each time the dns service is queried an
API call is made to the kubernetes master service for a list of all the ingresses. If a match is found for the name a
response is given with an IP address as the `$(minikube ip)`. So for example lets say my minikube ip address is
`192.168.99.106` and I have an ingress controller with the name of `myservice.test` then I would get a result like so:
What if you could just access your local services magically without having to edit your `/etc/hosts` file? Well, now you
can. The `ingress-dns` addon acts as a DNS service that runs inside your Kubernetes cluster. All you have to do is
install the service and add the `$(minikube ip)` as a DNS server on your host machine. Each time the DNS service is
queried, an API call is made to the Kubernetes master service for a list of all the ingresses. If a match is found for
the name, a response is given with an IP address matching `minikube ip`. For example, with a `minikube ip` of
`192.168.99.106` and an ingress rule for `myservice.test` configured in the cluster, a DNS query from the host would
produce:
```text
#bash:~$ nslookup myservice.test $(minikube ip)
@ -41,56 +43,57 @@ Address: 192.168.99.169
## Installation
### Start minikube
```
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">1</strong></span>Start minikube</h2>
```bash
minikube start
```
### Install the kubernetes resources
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">2</strong></span>Enable the addons</h2>
```bash
minikube addons enable ingress
minikube addons enable ingress-dns
```
### Add the minikube ip as a dns server
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">3</strong></span>Add the `minikube ip` as a DNS server</h2>
#### Mac OS
Create a file in `/etc/resolver/minikube-profilename-test`
```
domain test
nameserver 192.168.99.169
search_order 1
timeout 5
```
Replace `192.168.99.169` with your minikube ip and `profilename` is the name of the minikube profile for the
corresponding ip address
{{% card %}}
If you have multiple minikube ips you must configure multiple files
{{% quiz_row base="" name="Operating system" %}}
{{% quiz_button option="Linux" %}} {{% quiz_button option="macOS" %}} {{% quiz_button option="Windows" %}}
{{% /quiz_row %}}
See https://www.unix.com/man-page/opendarwin/5/resolver/
Note that even though the `port` feature is documented. It does not actually work.
{{% card %}}
{{% quiz_instruction_plain id="/Linux" %}}
Update the file `/etc/resolvconf/resolv.conf.d/base` to have the following contents.
#### Linux
Update the file `/etc/resolvconf/resolv.conf.d/base` to have the following contents
```
search test
nameserver 192.168.99.169
timeout 5
```
Replace `192.168.99.169` with your minikube ip
If your linux OS uses `systemctl` run the following commands
Replace `192.168.99.169` with your `minikube ip`.
If your Linux OS uses `systemctl`, run the following commands.
```bash
sudo resolvconf -u
systemctl disable --now resolvconf.service
```
If your linux does not use `systemctl` run the following commands
If your Linux OS does not use `systemctl`, run the following commands.
TODO add supporting docs for Linux OS that do not use `systemctl`
```bash
# TODO add supporting docs for Linux OS that do not use `systemctl`
```
See https://linux.die.net/man/5/resolver
When you are using Network Manager with the dnsmasq plugin, you can add an additional configuration file, but you need
When you are using Network Manager with the `dnsmasq` plugin, you can add an additional configuration file, but you need
to restart NetworkManager to activate the change.
```bash
@ -100,62 +103,95 @@ systemctl restart NetworkManager.service
Also see `dns=` in [NetworkManager.conf](https://developer.gnome.org/NetworkManager/stable/NetworkManager.conf.html).
#### Windows
Open `Powershell` as Administrator and execute the following
{{% /quiz_instruction_plain %}}
{{% quiz_instruction_plain id="/macOS" %}}
Create a file in `/etc/resolver/minikube-test` with the following content.
```
domain test
nameserver 192.168.99.169
search_order 1
timeout 5
```
Replace `192.168.99.169` with your `minikube ip`.
If you have multiple minikube IPs, you must configure a file for each.
See https://www.unix.com/man-page/opendarwin/5/resolver/
Note that the `port` feature does not work as documented.
{{% /quiz_instruction_plain %}}
{{% quiz_instruction_plain id="/Windows" %}}
Open `Powershell` as Administrator and execute the following.
```sh
Add-DnsClientNrptRule -Namespace ".test" -NameServers "$(minikube ip)"
```
The following will remove any matching rules, before creating one. This is helpful if your minikube has a new ip
The following will remove any matching rules before creating a new one. This is useful for updating the `minikube ip`.
```sh
Get-DnsClientNrptRule | Where-Object {$_.Namespace -eq '.test'} | Remove-DnsClientNrptRule -Force; Add-DnsClientNrptRule -Namespace ".test" -NameServers "$(minikube ip)"
```
{{% /quiz_instruction_plain %}}
{{% /card %}}
{{% /card %}}
## Testing
### Add the test ingress
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">1</strong></span>Add the test ingress</h2>
```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/minikube/master/deploy/addons/ingress-dns/example/example.yaml
```
Note: Minimum Kubernetes version for example ingress is 1.19
Note: Minimum Kubernetes version for the example ingress is 1.19
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">2</strong></span>Confirm that DNS queries are returning A records</h2>
### Validate DNS queries are returning A records
```bash
nslookup hello-john.test $(minikube ip)
nslookup hello-jane.test $(minikube ip)
```
### Validate domain names are resolving on host OS
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">3</strong></span>Confirm that domain names are resolving on the host OS</h2>
```bash
ping hello-john.test
ping hello-jane.test
```
Expected results:
```text
PING hello-john.test (192.168.99.169): 56 data bytes
64 bytes from 192.168.99.169: icmp_seq=0 ttl=64 time=0.361 ms
```
```bash
ping hello-jane.test
```
```text
PING hello-jane.test (192.168.99.169): 56 data bytes
64 bytes from 192.168.99.169: icmp_seq=0 ttl=64 time=0.262 ms
```
### Curl the example server
<h3 class="step"><span class="fa-stack fa-1x"><i class="fa fa-circle fa-stack-2x"></i><strong class="fa-stack-1x text-primary">4</strong></span>Curl the example server</h2>
```bash
curl http://hello-john.test
curl http://hello-jane.test
```
Expected result:
Expected results:
```text
Hello, world!
Version: 1.0.0
Hostname: hello-world-app-557ff7dbd8-64mtv
```
```bash
curl http://hello-jane.test
```
Expected result:
```text
Hello, world!
Version: 1.0.0

View File

@ -0,0 +1,3 @@
<div data-quiz-id="{{ with .Get "id"}}{{.}}{{end}}" class="quiz-instruction">
{{ .Inner }}
</div>