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可以用來加密連接, 以及授權。