内部域名无法解析

在部署和使用时,如果遇到类似这样的日志信息:"Name or service not known" 或者 "host=xxx.service.consul port=xxxx max retries…."

意味着内部域名无法解析的问题。内部域名,指的是蓝鲸集群模块之间使用 consul 模块注册的以".service.consul"结尾的域名。它由每台机器上运行的consul进程监听的53端口提供解析服务。

当无法解析时,第一步,在报错的机器上使用dig看看consul能否解析:

  1. dig xxx.service.consul @127.0.0.1

@127.0.0.1 表示使用 127.0.0.1:53 这个作为dns服务器,也就是使用 consul 提供的dns服务。

正常情况下,可以看到类似下图的记录。如果命令换成dig 域名 没出现正确的记录,说明/etc/resolv.conf里没有配置上127.0.0.1 的namserver,确认/etc/resolv.conf里第一行是nameserver 127.0.0.1

  1. ;; QUESTION SECTION:
  2. ;zk.service.consul. IN A
  3. ;; ANSWER SECTION:
  4. zk.service.consul. 0 IN A 10.x.x.x
  5. zk.service.consul. 0 IN A 10.x.x.x
  6. zk.service.consul. 0 IN A 10.x.x.x
  7. ;; Query time: 1 msec
  8. ;; SERVER: 127.0.0.1#53(127.0.0.1)

如果出现以下信息, 说明 consul 没有正常启动。那么 使用supervisor启动consul进程。

  1. ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> zk.service.consul @127.0.0.1
  2. ;; global options: +cmd
  3. ;; connection timed out; no servers could be reached

如果出现以下信息 "IN A" 后面没有 ip地址,说明consul 启动了,但是无法解析域名

  1. ;; QUESTION SECTION:
  2. ;zk.service.consul. IN A
  3. ;; AUTHORITY SECTION:
  4. consul. 0 IN SOA ns.consul. postmaster.consul. 1530849644 3600 600 86400 0

此时按照以下步骤:

  • 运行 consul monitor 看看日志,主要确认consul集群状态是否正常。观察是否有"no cluster leader" 的输出。
  • 针对具体的域名,譬如 zk.service.consul,那么登陆到zk所在机器,查看/data/bkce/etc/consul.d/zk.json文件 运行里面的check脚本,看返回的输出。
    对于出现"no cluster leader"的输出时,说明consul之间没有成功组成集群,选举出leader:

  • 检查consul server节点是否都running

  • 在任意一台consul上输入 consul join <另外一个consul节点>
  • 查看节点状态:consul operator raft list-peers