Consul DNSの挙動がCentOS6とCentOS7で違う

タイトルは結構デタラメです。
正しくは CentOS6とCentOS7それぞれの環境からdigでConsul DNSへ名前解決要求を送ると結果が異なることがある、です。

以下詳細。

まずCentOS6とかCentOS7とかどんだけ古いんだ、という話は置いておきます。

CentOS7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig +noall +answer @127.0.0.1 -p 8600 mx-gateway.service.consul. SRV
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-12.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-15.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-6.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-14.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-9.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-2.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-8.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-1.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-10.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-7.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-4.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-19.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-17.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-11.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-5.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-13.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-3.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-16.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-20.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-18.node.example.consul.

CentOS6

1
2
3
4
$ dig +noall +answer @127.0.0.1 -p 8600 mx-gateway.service.consul. SRV
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-7.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-9.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-3.node.example.consul.

明らかに少ない、もう一度。

1
2
3
4
$ dig +noall +answer @127.0.0.1 -p 8600 mx-gateway.service.consul. SRV
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-17.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-8.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-15.node.example.consul.

帰ってくるホストが変わった。が相変わらず少ない。

ここでタネを明かす。
その前にCentOS6でdigに+edns=0 を追加する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig +ends=0 +noall +answer @127.0.0.1 -p 8600 mx-gateway.service.consul. SRV
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-18.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-20.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-4.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-1.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-11.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-5.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-17.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-6.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-19.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-8.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-15.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-3.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-14.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-2.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-12.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-7.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-16.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-13.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-9.node.example.consul.
mx-gateway.service.consul. 0 IN SRV 1 1 25 mx-gateway-10.node.example.consul.

見事にCentOS7と同じ結果になった。

なぜこう言うことが起きるのか?
まずリクエスト側の話としてCentOS6のbind-utilsは9.8.x系、CentOS7は9.9.x系である。
digは9.9になる時に +ends=0デフォルトの挙動となった

それより古いdigは +noedns 相当の挙動なのである。

続いてConsul側。

Consulでは、EDNSフラグの有無でレスポンスの最大サイズを変えている

こうすることで稼働しているサービスを出来るだけ多くレスポンスとして返しつつ、DNSのルールに則った動作をしているのであった。