# nomad ## Name *nomad* - enables reading zone data from a Nomad cluster. ## Description This plugin serves DNS records for services registered with Nomad. Nomad 1.3+ comes with [support for discovering services](https://www.hashicorp.com/en/blog/nomad-service-discovery) with an in-built service catalogue that is available via the HTTP API. This plugin extends the HTTP API and provides a DNS interface for querying the service catalogue. The query can be looked up with the format `[service].[namespace].service.nomad`. The plugin currently handles A, AAAA and SRV records. Refer to [#Usage Example](#usage-example) for more details. ## Example job template ``` job "dns" { type = "service" group "dns" { network { port "dns" { static = 1053 } } task "dns" { driver = "docker" config { image = "coredns/coredns:latest" ports = ["dns"] args = ["-conf", "/secrets/coredns/Corefile", "-dns.port", "1053"] } service { name = "hostmaster" provider = "nomad" port = "dns" address_mode = "driver" } identity { env = true } template { data = <> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> redis.default.service.nomad @127.0.0.1 -p 1053 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54986 ;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: bdc9237f49a1f744 (echoed) ;; QUESTION SECTION: ;redis.default.service.nomad. IN A ;; ANSWER SECTION: redis.default.service.nomad. 10 IN A 192.168.29.76 redis.default.service.nomad. 10 IN A 192.168.29.76 redis.default.service.nomad. 10 IN A 192.168.29.76 ;; Query time: 4 msec ;; SERVER: 127.0.0.1#1053(127.0.0.1) (UDP) ;; WHEN: Thu Jan 05 12:12:25 IST 2023 ;; MSG SIZE rcvd: 165 ``` ### SRV Record Since an A record doesn't contain the port number, SRV record can be used to query the port number of a service. ``` dig redis.default.service.nomad @127.0.0.1 -p 1053 SRV ; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> redis.default.service.nomad @127.0.0.1 -p 1053 SRV ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49945 ;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 14572535f3ba6648 (echoed) ;; QUESTION SECTION: ;redis.default.service.nomad. IN SRV ;; ANSWER SECTION: redis.default.service.nomad. 8 IN SRV 10 10 25395 redis.default.service.nomad. redis.default.service.nomad. 8 IN SRV 10 10 20888 redis.default.service.nomad. redis.default.service.nomad. 8 IN SRV 10 10 26292 redis.default.service.nomad. ;; ADDITIONAL SECTION: redis.default.service.nomad. 8 IN A 192.168.29.76 redis.default.service.nomad. 8 IN A 192.168.29.76 redis.default.service.nomad. 8 IN A 192.168.29.76 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#1053(127.0.0.1) (UDP) ;; WHEN: Thu Jan 05 12:12:20 IST 2023 ;; MSG SIZE rcvd: 339 ``` ### SOA Record ``` $ dig @localhost -p 1053 1dns.default.service.nomad. ; <<>> DiG 9.18.12-0ubuntu0.22.04.2-Ubuntu <<>> @localhost -p 1053 1dns.default.service.nomad. ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 21012 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 6d146bb140b4d8ca (echoed) ;; QUESTION SECTION: ;1dns.default.service.nomad. IN A ;; ANSWER SECTION: 1dns.default.service.nomad. 5 IN SOA ns1.1dns.default.service.nomad. ns1.1dns.default.service.nomad. 1 3600 600 604800 3600 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#1053(localhost) (UDP) ;; WHEN: Wed Aug 23 21:14:41 EEST 2023 ;; MSG SIZE rcvd: 189 ```