mirror of https://github.com/k3s-io/k3s
52 lines
3.1 KiB
Markdown
52 lines
3.1 KiB
Markdown
# DNS Integration with SkyDNS
|
|
Since Kubernetes services changed to assign a single IP address to each service, it is
|
|
now possible to use DNS to resolve a DNS name directly to a Kubernetes service, which
|
|
would then use Kubernetes' proxy to connect to an appropriate pod running the application
|
|
pointed to by the service definition.
|
|
|
|
## How it Works
|
|
Version 2.0.1a of [SkyDNS](https://github.com/skynetservices/skydns) added a change that
|
|
allows it to poll the Kubernetes API looking for changes to the service definitions. Newly
|
|
added services are published in SkyDNS, and removed services are deleted from SkyDNS's
|
|
internal registry.
|
|
|
|
### Concrete Example
|
|
If you run the Guestbook example in the Kubernetes repository, you'll end up with a service
|
|
called `redismaster`. If you were also running SkyDNS with the `-kubernetes=true` flag and
|
|
`-master=http://my.kubernetes.master:8080` you would immediately be able to run queries against
|
|
the SkyDNS server for the `redismaster` service. By default, SkyDNS is authoratative for the
|
|
domain `skydns.local`, so a query to the SkyDNS server requesting redismaster.skydns.local will
|
|
return the IP Address of the `redismaster` service.
|
|
|
|
## Configuration
|
|
SkyDNS allows you to change the domain name that it will resolve by passing in a domain on the
|
|
command line using `-domain=mydomain.com` or by setting an environment variable `SKYDNS_DOMAIN`.
|
|
|
|
If you change the Docker daemon on your Kubernetes minions to use SkyDNS for domain name resolution,
|
|
your pods will all be able to connect to services via DNS instead of using environment variables
|
|
or other configuration methods. To change Docker to use SkyDNS resolution, add `--dns=ip.of.skydns.server`
|
|
to the Docker startup command.
|
|
```
|
|
docker -d --dns=10.2.0.5 ...
|
|
```
|
|
|
|
SkyDNS uses the etcd instance in Kubernetes as its storage backend, which means that you can run
|
|
multiple SkyDNS daemons if you wish to have more than one resolver on your cluster. You could run
|
|
a SkyDNS instance on each node in your Kubernetes cluster, and set Docker to use 127.0.0.1 as the
|
|
DNS resolver.
|
|
|
|
## Starting SkyDNS in a Kubernetes Cluster
|
|
At a minimum, you need to provide the `-kubernetes` flag, and the `-master=http://my.kubernetes.master.ip:8080`
|
|
flag when you start SkyDNS. You may also wish to use `-domain=mydomain.com` to change the domain that
|
|
SkyDNS resolves.
|
|
|
|
SkyDNS can act as your external resolver, too. If you set your domain to use the external IP address of
|
|
the server running SkyDNS and bind SkyDNS to listen on all interfaces, SkyDNS will serve DNS for
|
|
your domain. You could then use a mixture of manually created hosts in SkyDNS and Kubernetes service
|
|
resolution to serve your various DNS endpoints. A simple example might be to run a Wordpress pod in Kubernetes
|
|
and create a service called `blog` in Kubernetes. Then external DNS requests to `blog.mydomain.com` will
|
|
automatically resolve to the service proxy and be forwarded to the pods running Wordpress.
|
|
|
|
Full documentation of the SkyDNS server is in the [SkyDNS repository](https://github.com/skydnsservices/skydns)
|
|
and abbreviated information is available by typing `skydns --help`.
|