DNS接口是Consul中主要的查询接口之一,另一个是HTTP接口, HTTP接口查询请查阅https://www.consul.io/api/catalog.html#list-services。Consul默认在8600端口监听DNS查询。
要使用DNS接口, 有几种方法可以实现:
一是使用指定的DNS解析库, 然后指向Consul;
二是把Consul设置为节点的DNS服务器, 并且提供recursors
配置项, 这样非Consul的查询也能被解析;
最后一种方法是从已有的DNS服务器上把所有consul.
为域名的请求转发到consul agent上。
查询的示例方法:
dig @127.0.0.1 -p 8600 redis.service.dc1.consul. ANY
查询redis服务器地址
通常情况下, 有两种类型的查询: node lookups
和service lookups
, node lookups
指定的查询一个节点的ip地址, 而service lookups
节点查询
查询一个节点的命令格式为:
<node>.node[.datacenter].<domain>
[datacenter]可选, 默认为当前agent所在的data center。
对于一个node lookups
, consul返回值包含A记录, AAAA记录以及TXT记录。
A记录返回ipv4地址, AAAA记录返回ipv6地址, TXT记录会匹配节点的元数据信息node_meta
, 如果节点的元数据key以rfc1035-
开头, 则只会返回节点的元数据信息。
服务查询
service lookups
用来查询服务的提供者, consul提供两种方法, 一种是标准查询, 一种是严格遵循RFC 2782
规范的查询。
默认情况下, SRV
权重为1, 但是可以通过service definition中的Weights
属性配置。
Standard Lookup
格式:
[tag.]<service>.service[.datacenter].<domain>
tag是可选的, 过滤节点, datacenter可选, 默认是agent所处的数据中心。
标准服务查询支持A
记录和SRV
记录, SRV
记录也会返回服务注册的端口地址。SRV
记录默认不返回, 除非是命令中指定, 如:
dig @127.0.0.1 -p 8600 consul.service.consul SRV
; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 consul.service.consul ANY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50483
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;consul.service.consul. IN SRV
;; ANSWER SECTION:
consul.service.consul. 0 IN SRV 1 1 8300 foobar.node.dc1.consul.
;; ADDITIONAL SECTION:
foobar.node.dc1.consul. 0 IN A 10.1.10.12
RFC 2782 Lookup
格式为:
_<service>._<protocol>[.service][.datacenter][.domain]
RFC 2782
格式要求service和protocol以_
为前缀,防止DNS记录冲突。protocol可以为service中的任何tag, 如果没有tag, 则应该使用tpc
, tag的作用和上面的一样, 用来过滤service节点, 如果是tcp, 则不过滤。
Prepared Query Lookups
<query or name>.query[.datacenter].<domain>
执行一个已保存的查询语句
Connect-Capable Service Lookups
<service>.connect.<domain>
查看支持connect的service, connect可以用来加密连接, 以及授权。