# SkyDNS in CoreDNS


The [etcd middleware](https://github.com/miekg/coredns/tree/master/middleware/etcd) is shaping
up nicely. With the following `Corefile` you already have a big chunk of the SkyDNS funcionality:

~~~
.:1053 {
    errors
    etcd skydns.local
    proxy . 8.8.8.8:53
}
~~~

Which says, run on port 1053, accept queries for *all* zones, if the zone matches `skydns.local.` go look
in etcd, if it doesn't forward to GOOG. Multiple zones should work as well, but this is not tested
as of yet.

Let's test this [with the examples from SkyDNS'
README](https://github.com/skynetservices/skydns/blob/master/README.md). Let's add all the `rails`
production sites. (Why does this use rails btw?)

Checking with:

`dig -p 1053 @localhost SRV 1.rails.production.east.skydns.local`

~~~ txt
;; QUESTION SECTION:
;1.rails.production.east.skydns.local. IN SRV

;; ANSWER SECTION:
1.rails.production.east.skydns.local. 300 IN SRV 10 100 8080 service1.example.com.
~~~

Yeah! It actually works :-)

## Wildcards

Lets try the wildcard stuff:

`dig -p 1035 @localhost SRV east.skydns.local`

~~~ txt
;; ANSWER SECTION:
east.skydns.local.      300    IN      SRV     10 20 8080 service1.example.com.
east.skydns.local.      300    IN      SRV     10 20 8080 4.rails.staging.east.skydns.local.
east.skydns.local.      300    IN      SRV     10 20 8080 6.rails.staging.east.skydns.local.

;; ADDITIONAL SECTION:
4.rails.staging.east.skydns.local. 300 IN A    10.0.1.125
6.rails.staging.east.skydns.local. 300 IN AAAA 2003::8:1
~~~

Working :) Only change I made was that the TTL is now 300s (might make that a config thing as well).

Remote lookups for resolving names found *in* etcd are using the proxy middleware, so there is no code
duplication there.

## Proxy

Records that don't match the zone(s) are proxied (this needs some few extra features, but is already
working pretty well):

~~~ txt
% dig -p 1053 @localhost A miek.nl

;; ANSWER SECTION:
miek.nl.		1799	IN	A	139.162.196.78
~~~

What you except, an answer from 8.8.8.8.

## "Loadbalancing"

If you need A/AAAA shuffling, also know as loadbalancing, add the loadbalance middleware, again,
this is *just another* middleware. From the SkyDNS README:

`dig -p 1053 @localhost A db.skydns.local`

returns:

~~~ txt
db.skydns.local.	300	IN	A	127.0.0.1
db.skydns.local.	300	IN	A	127.0.0.2
db.skydns.local.	300	IN	A	127.0.0.3
~~~

In that order, *always*, Lets add `loadbalance` middleware to our Corefile, and try again:

~~~ txt
.:1053 {
    errors stderr
    loadbalance
    etcd skydns.local
    proxy . 8.8.8.8:53
}
~~~

*Whee* randomized answer:

~~~ txt
; ANSWER SECTION:
db.skydns.local.	300	IN	A	127.0.0.1
db.skydns.local.	300	IN	A	127.0.0.3
db.skydns.local.	300	IN	A	127.0.0.2
~~~

As said some features need to be added, mostly dealing with UDP buffer sizing, more tests (as
always) and the "advanced" features like Groups and TargetStrip need to be ported and tested.

