Open AurelienGasser opened 4 years ago
This seems to be highly dependent on the system. For instance, with dnsmasq instead of systemd:
$ tail -1 /etc/hosts
1.2.3.4 foo.bar
$ nslookup foo.bar
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
*** Can't find foo.bar: No answer
It is still resolvable, e.g. by ping
.
$ ping foo.bar
PING foo.bar (1.2.3.4) 56(84) bytes of data.
From 10.190.2.50 icmp_seq=1 Destination Net Unreachable
^C
--- foo.bar ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
It seems like the VirtualBox DNS server implements the same feature (as systemd-resolved does)
But that the Docker driver just goes to the regular DNS (in my case 8.8.8.8, no dnsmasq support...)
Same thing for the Podman driver. So it sounds more like a "missing feature", than an actual bug ?
Depending on the use case, something like the ingress-dns
addon solves the opposite problem.
Here are more details about my use case:
I have an ingress which exposes the address foo.bar
/etc/hosts
to point foo.bar
to $(minikube ip)
. It works fine.foo.bar
doesn't work (since the /etc/hosts
from the host is ignored)The feature is called "NAT DNS proxy";: https://www.virtualbox.org/manual/ch09.html#nat-adv-dns
EDIT: Or the actual feature is actually "Host DNS resolver", which is an add-on to that feature...
It is enabled by the machine virtualbox driver, when creating the VirtualBox virtual machine.
https://github.com/docker/machine/blob/v0.16.2/drivers/virtualbox/virtualbox.go#L394
hostDNSResolver := "off"
if d.HostDNSResolver {
hostDNSResolver = "on"
}
dnsProxy := "off"
if d.DNSProxy {
dnsProxy = "on"
}
"--natdnshostresolver1", hostDNSResolver,
"--natdnsproxy1", dnsProxy,
There is no built-in functionality to do the same for Docker, so workaround is to edit /etc/hosts
.
Theoretically one could deploy a similar DNS proxy on the host, and configure Docker to talk to it.
It might even be an existing project somewhere ? Sortof depends on how many hosts are involved...
There were some other nice use cases for this, like resolving various minikube profiles on host.
I seem to recall that someone was dabbling with it, but can only find sed
hacks at the moment...
Like https://gist.github.com/jacobtomlinson/4b835d807ebcea73c6c8f602613803d4
Maybe it was a part of https://github.com/kubernetes/minikube/issues/5494 ? Not sure if it ever made it as far as any code, though ?
This one looked promising, if someone wants to try it: https://github.com/janeczku/go-dnsmasq
@afbjorklund Thank you for the workaround. It appears that it fixes the DNS resolution from minikube ssh
, but not from pods:
From minikube ssh
docker@minikube:~$ tail -1 /etc/hosts
1.2.3.4 foo.bar
docker@minikube:~$ ping foo.bar
PING foo.bar (1.2.3.4) 56(84) bytes of data.
From a pod running in minikube
root@mypod:/usr/src/app# ping foo.bar
ping: foo.bar: No address associated with hostname
Restarting the coredns
pods doesn't help
Well, the pod containers also have their own /etc/hosts
...
This is why we have DNS, to not have to copy these things.
FWIW the following hack does the trick:
Note: use with care: hostNetwork: true
has security implications.
minikube ssh
, add entries to /etc/hosts
hostNetwork: true
to the pod spec
When the pod is started, /etc/hosts
entries get copied from the host into the pod.
I would accept a PR that makes docker driver act like our VM drivers ! this seems to be done by mimicking our machine driver for virtualbox https://github.com/machine-drivers/machine
How about adding a new parameter like --add-host
to the docker run
command?
Issues go stale after 90d of inactivity.
Mark the issue as fresh with /remove-lifecycle stale
.
Stale issues rot after an additional 30d of inactivity and eventually close.
If this issue is safe to close now please do so with /close
.
Send feedback to sig-contributor-experience at kubernetes/community. /lifecycle stale
I would still accept a PR that would implement this feature
go to /etc/docker/daemon.json ( create it if not exist) and add the following:
{
"dns": ["my.dns.server.ip:port"]
}
Where you can run your own dns server (i.e. coredns) and mount to it /etc/hosts format DB.
When using the
docker
driver, the/etc/hosts
file from the host machine is ignored. Things work as expected when I use thevirtualbox
driver.Steps to reproduce the issue:
virtualbox
^
foo.bar
is successfully resolved to1.2.3.4
docker
minikube start --driver=virtualbox --alsologtostderr
minikube start --driver=docker --alsologtostderr