Consul是一個網絡工具,提供了一個功能齊全的service-mesh控制層,服務發現,配置,和分區。
一.安裝
1.安裝consul
下載consul,這裏我下載的是linux版本的,
下載下來的是一個zip壓縮文件,解壓後得到一個consul二進制文件,解壓後,確保consul文件可被環境變量訪問
# 解壓consul
$ unzip consul_1.7.2_linux_amd64.zip
# 查看PATH變量
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
#我這裏把consul文件放在/usr/local/bin目錄下,保證consul可以訪問到
$ mv consul /usr/local/bin
2.驗證是否安裝成功,在命令行中輸入consul
$ consul
usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
event Fire a new event
...
如果您得到一個無法找到consul的錯誤,說明你的PATH環境變量沒有正確設置。請確保您的PATH變量包含安裝了consul的目錄
二.運行consul代理
安裝領事後,你需要啓動consul代理。以下將以開發模式運行consul代理,這種模式不安全,也不具有可伸縮性,但是可以讓你輕鬆體驗consul的大多數功能,而不需要額外的配置。你還將知道如何優雅地關閉consul代理
服務端和客戶端代理
在生產環境中,可以在服務器或客戶端模式下運行每個consul代理。每個consul數據中心必須至少有一個服務器,負責維護consul的狀態。這包括關於其他consul服務器和客戶端的信息、可用於發現的服務以及允許哪些服務與哪些其他服務進行通信。
爲了確保即使服務器發生故障也能維護consul的狀態,您應該始終在生產環境中運行3或5個服務器。服務器的奇數(不超過5個)在性能和容錯之間取得平衡
非服務器代理在客戶端模式下運行。客戶機是一個輕量級進程,它註冊服務、運行健康檢查並將查詢轉發到服務器。客戶端必須運行在運行服務的consul數據中心的每個節點上,因爲客戶端是服務健康狀況的真實來源。
當你準備在生產使用時,可以在部署指南中找到關於服務器和客戶端的生產部署的更多指導。現在,讓我們以開發模式啓動本地代理,這是一種內存服務器模式,爲便於使用啓用了一些公共特性(儘管存在安全風險),並且關閉了所有持久性選項。
啓動consul代理
在開發模式下啓動consul代理。
$ consul agent -dev
==> Starting Consul agent...
Version: 'v1.7.2'
Node ID: '58b5abd3-4071-f5d5-bf6d-d87e0e7fb079'
Node name: 'alias'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
2020-03-18T20:14:44.575+0800 [DEBUG] agent: Using random ID as node ID: id=58b5abd3-4071-f5d5-bf6d-d87e0e7fb079
2020-03-18T20:14:44.575+0800 [DEBUG] agent.tlsutil: Update: version=1
2020-03-18T20:14:44.576+0800 [DEBUG] agent.tlsutil: OutgoingRPCWrapper: version=1
2020-03-18T20:14:44.576+0800 [INFO] agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:58b5abd3-4071-f5d5-bf6d-d87e0e7fb079 Address:127.0.0.1:8300}]"
2020-03-18T20:14:44.576+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: alias.dc1 127.0.0.1
2020-03-18T20:14:44.576+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: alias 127.0.0.1
2020-03-18T20:14:44.577+0800 [INFO] agent: Started DNS server: address=127.0.0.1:8600 network=udp
2020-03-18T20:14:44.577+0800 [INFO] agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader=
2020-03-18T20:14:44.579+0800 [INFO] agent.server: Adding LAN server: server="alias (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
2020-03-18T20:14:44.579+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=alias.dc1 area=wan
2020-03-18T20:14:44.580+0800 [INFO] agent: Started DNS server: address=127.0.0.1:8600 network=tcp
2020-03-18T20:14:44.581+0800 [INFO] agent: Started HTTP server: address=127.0.0.1:8500 network=tcp
2020-03-18T20:14:44.581+0800 [INFO] agent: started state syncer
==> Consul agent running!
2020-03-18T20:14:44.581+0800 [INFO] agent: Started gRPC server: address=127.0.0.1:8502 network=tcp
2020-03-18T20:14:44.614+0800 [WARN] agent.server.raft: heartbeat timeout reached, starting election: last-leader=
2020-03-18T20:14:44.614+0800 [INFO] agent.server.raft: entering candidate state: node="Node at 127.0.0.1:8300 [Candidate]" term=2
2020-03-18T20:14:44.615+0800 [DEBUG] agent.server.raft: votes: needed=1
2020-03-18T20:14:44.615+0800 [DEBUG] agent.server.raft: vote granted: from=58b5abd3-4071-f5d5-bf6d-d87e0e7fb079 term=2 tally=1
2020-03-18T20:14:44.615+0800 [INFO] agent.server.raft: election won: tally=1
2020-03-18T20:14:44.615+0800 [INFO] agent.server.raft: entering leader state: leader="Node at 127.0.0.1:8300 [Leader]"
2020-03-18T20:14:44.615+0800 [INFO] agent.server: cluster leadership acquired
啓動日誌顯示,consul代理已經啓動,並正在傳輸一些日誌數據。他們還報告說,代理正在作爲服務器運行,並聲稱爲leader。此外,本地代理已被標記爲數據中心的健康成員。
Datacenter Members
在新的終端窗口中運行consul members命令,檢查consul數據中心的成員關係。輸出列出了數據中心中的代理。稍後我們將介紹如何將領事代理連接在一起,但目前只有一個成員(當前的機器)。
$ consul members
Node Address Status Type Build Protocol DC Segment
alias 127.0.0.1:8301 alive server 1.7.2 2 dc1 <all>
輸出顯示出你的代理、IP地址、健康狀態、代理在數據中心中的角色以及一些版本信息。你可以使用-detailed
標記來發現額外的元數據。
members命令針對領事客戶端運行,後者通過gossip協議獲取信息。客戶端擁有的信息最終是一致的,但是在任何時候,它的視圖都可能與服務器上的狀態不完全匹配。要獲得一個非常一致的視圖,可以查詢HTTP API,它將請求轉發給領事服務器。
$ curl localhost:8500/v1/catalog/nodes
[
{
"ID": "0bb70c85-c52d-e10a-07c8-6b8451e5dee4",
"Node": "alias",
"Address": "127.0.0.1",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "127.0.0.1",
"lan_ipv4": "127.0.0.1",
"wan": "127.0.0.1",
"wan_ipv4": "127.0.0.1"
},
"Meta": {
"consul-network-segment": ""
},
"CreateIndex": 10,
"ModifyIndex": 11
}
]
除了HTTP API之外,你還可以使用DNS interface 來發現節點。除非你啓用了緩存,否則DNS接口將把你的查詢發送到consul服務器。要執行DNS查找,你必須指向consul代理的DNS服務器,該服務器默認在端口8600上運行。稍後將更詳細地介紹DNS條目的格式(例如judiths - mbp .node.consul)。
$ dig @127.0.0.1 -p 8600 Judiths-MBP.node.consul
; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> @127.0.0.1 -p 8600 Judiths-MBP.node.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30453
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;Judiths-MBP.node.consul. IN A
;; AUTHORITY SECTION:
consul. 0 IN SOA ns.consul. hostmaster.consul. 1584534749 3600 600 86400 0
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Mar 18 20:32:29 CST 2020
;; MSG SIZE rcvd: 102
停止運行代理
使用consul leave
命令停止cosnul代理。這將優雅地停止代理,使其從consul數據中心退出並關閉。
$ consul leave
Graceful leave complete
如果切換回帶有consul流日誌輸出的窗口,則日誌表明consul代理離開了數據中心。
2020-03-18T20:34:45.509+0800 [INFO] agent.server: server starting leave
2020-03-18T20:34:45.509+0800 [INFO] agent.server.serf.wan: serf: EventMemberLeave: alias.dc1 127.0.0.1
2020-03-18T20:34:45.509+0800 [INFO] agent.server: Handled event for server in area: event=member-leave server=alias.dc1 area=wan
2020-03-18T20:34:45.509+0800 [INFO] agent.server.router.manager: shutting down
2020-03-18T20:34:48.509+0800 [INFO] agent.server.serf.lan: serf: EventMemberLeave: alias 127.0.0.1
2020-03-18T20:34:48.509+0800 [INFO] agent.server: Removing LAN server: server="alias (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
2020-03-18T20:34:48.509+0800 [WARN] agent.server: deregistering self should be done by follower: name=alias
2020-03-18T20:34:48.655+0800 [ERROR] agent.server.autopilot: Error updating cluster health: error="error getting server raft protocol versions: No servers found"
2020-03-18T20:34:50.655+0800 [ERROR] agent.server.autopilot: Error updating cluster health: error="error getting server raft protocol versions: No servers found"
2020-03-18T20:34:51.509+0800 [INFO] agent.server: Waiting to drain RPC traffic: drain_time=5s
2020-03-18T20:34:52.655+0800 [ERROR] agent.server.autopilot: Error updating cluster health: error="error getting server raft protocol versions: No servers found"
2020-03-18T20:34:54.655+0800 [ERROR] agent.server.autopilot: Error updating cluster health: error="error getting server raft protocol versions: No servers found"
2020-03-18T20:34:56.509+0800 [INFO] agent: Requesting shutdown
2020-03-18T20:34:56.509+0800 [INFO] agent.server: shutting down server
2020-03-18T20:34:56.509+0800 [DEBUG] agent.leader: stopping routine: routine="CA root pruning"
2020-03-18T20:34:56.509+0800 [DEBUG] agent.leader: stopped routine: routine="CA root pruning"
2020-03-18T20:34:56.509+0800 [INFO] agent: consul server down
2020-03-18T20:34:56.510+0800 [INFO] agent: shutdown complete
2020-03-18T20:34:56.510+0800 [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/leave from=127.0.0.1:57862 latency=11.000960126s
2020-03-18T20:34:56.510+0800 [INFO] agent: Stopping server: protocol=DNS address=127.0.0.1:8600 network=tcp
2020-03-18T20:34:56.510+0800 [INFO] agent: Stopping server: protocol=DNS address=127.0.0.1:8600 network=udp
2020-03-18T20:34:56.510+0800 [INFO] agent: Stopping server: protocol=HTTP address=127.0.0.1:8500 network=tcp
2020-03-18T20:34:56.510+0800 [INFO] agent: Waiting for endpoints to shut down
2020-03-18T20:34:56.510+0800 [INFO] agent: Endpoints down
2020-03-18T20:34:56.510+0800 [INFO] agent: Exit code: code=0
當你發出leave命令時,consul會通知其他成員該代理離開了數據中心。當代理離開時,它在同一節點上運行的本地服務及其檢查將從catalog中刪除,consul將不再嘗試再次連接訪問該節點。
強制終止代理進程,其實是向consul數據中心中的其他代理表明該節點出現了故障,而不是離開。當一個節點發生故障時,它的健康狀態被標記爲危急狀態,但不會從catalog中刪除它。consul將自動嘗試重新連接到一個發生故障的節點,假設它可能由於網絡分區而不可用,並且它可能會返回。
如果代理是作爲服務器運行的,適當的退出對於避免造成影響一致性協議的潛在可用性中斷是很重要的。有關如何安全地添加和刪除服務器的詳細信息,請參閱添加和刪除服務器指南
三.註冊服務和健康檢查服務發現
前面我們運行了一個本地consul代理,並檢查了數據中心的其他成員。下面我們將通過註冊服務和健康檢查開始使用consul。
consul的主要用例之一是服務發現。consul提供了一個DNS接口,下游服務可以使用該接口查找其上游依賴項的IP地址。
consul知道這些服務的位置,因爲每個服務都向其本地consul客戶端註冊。操作員可以手動註冊服務,配置管理工具可以在部署服務時註冊服務,或者容器編制平臺可以通過集成自動註冊服務。
定義一個服務
你可以通過提供服務定義(這是註冊服務的最常見方式)來註冊服務,也可以通過調用HTTP API來註冊服務。這裏我們將使用服務定義。
首先,爲consul配置創建一個目錄。consul加載配置目錄中的所有配置文件,因此Unix系統的一個常見約定是將該目錄命名爲/etc/ consulc.d (.d後綴表示“此目錄包含一組配置文件”)。
$ mkdir ./consul.d
接下來,編寫一個服務定義配置文件。假設有一個名爲“web”的服務在端口80上運行。使用以下命令創建一個名爲web的文件。配置目錄中的json。此文件將包含服務定義:名稱、端口和一個可選標記,您可以使用該標記在以後查找服務。(在本例中,除了$之外,複製整個代碼塊以運行命令並創建文件。)
$ echo '{"service":
{"name": "web",
"tags": ["rails"],
"port": 80
}
}' > ./consul.d/web.json
現在,重新啓動代理,使用命令行標誌來指定配置目錄並啓用代理上的腳本檢查。
在某些配置中啓用腳本檢查可能會引入遠程執行漏洞,這是已知的惡意軟件的目標。在生產環境中,我們強烈建議使用-enable-local-script-check。
consul agent -dev -enable-script-checks -config-dir=./consul.d
==> Starting Consul agent...
Version: 'v1.7.2'
Node ID: 'e4768fed-0c53-9644-df15-7029a436e0ec'
Node name: 'alias'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
...
automatically: check=serfHealth
2020-03-18T21:20:07.878+0800 [DEBUG] agent: Node info in sync
2020-03-18T21:20:07.878+0800 [DEBUG] agent: Service in sync: service=web
2020-03-18T21:20:07.878+0800 [DEBUG] agent: Node info in sync
2020-03-18T21:20:07.878+0800 [DEBUG] agent: Service in sync: service=web
2020-03-18T21:20:07.941+0800 [DEBUG] agent.tlsutil: OutgoingRPCWrapper: version=1
再輸出中看到到consul“sync”了web服務。這意味着代理從配置文件中加載服務定義,併成功地將其註冊到服務目錄中。
在一個多代理consul數據中心中,每個服務將向其本地consul客戶端註冊,客戶端將註冊轉發給維護服務目錄的consul服務器。
如果希望註冊多個服務,可以在consul配置目錄中創建多個服務定義文件。
查詢服務
一旦代理將服務添加到consul的服務目錄中,你就可以使用DNS接口或HTTP API來查詢它。
DNS 接口
首先使用consul的DNS接口查詢web服務。在consul處註冊的服務的DNS名稱是NAME.service.consul
,這裏的NAME
是您用來註冊服務的名稱(在本例中是web)。默認情況下,所有DNS名稱都在consul名稱空間中,不過這是可配置的。
該web服務的完全限定域名是web.service.consul。查詢註冊服務的DNS接口(在端口8600上缺省運行的consul)。
$ dig @127.0.0.1 -p 8600 web.service.consul
; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> @127.0.0.1 -p8600 web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42592
;; 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: 4096
;; QUESTION SECTION:
;web.service.consul. IN A
;; ANSWER SECTION:
web.service.consul. 0 IN A 127.0.0.1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Mar 18 21:29:38 CST 2020
;; MSG SIZE rcvd: 63
可以看到,返回了一條A記錄,其中包含註冊服務的IP地址。一條記錄只能保存IP地址。
你還可以使用DNS接口以SRV記錄的形式檢索整個地址/端口對。
$ dig @127.0.0.1 -p 8600 web.service.cosnul SRV
; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> @127.0.0.1 -p 8600 web.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36320
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul. IN SRV
;; ANSWER SECTION:
web.service.consul. 0 IN SRV 1 1 80 alias.node.dc1.consul.
;; ADDITIONAL SECTION:
alias.node.dc1.consul. 0 IN A 127.0.0.1
alias.node.dc1.consul. 0 IN TXT "consul-network-segment="
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Mar 18 21:33:18 CST 2020
;; MSG SIZE rcvd: 140
SRV記錄表明,web服務運行在端口80上,並且存在於節點alias.node.dc1.consul。帶有該節點的A記錄的DNS將返回另一個部分。
最後,還可以使用DNS接口按標記過濾服務。基於標記的服務查詢的格式TAG.NAME.service.consul
。在下面的示例中,你將詢問帶有“rails”標記的所有web服務。你將獲得一個成功的響應,因爲你使用該標記註冊了web服務。
$ dig @127.0.0.1 -p 8600 raild.web.service.consul
; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> @127.0.0.1 -p 8600 rails.web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27583
;; 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: 4096
;; QUESTION SECTION:
;rails.web.service.consul. IN A
;; ANSWER SECTION:
rails.web.service.consul. 0 IN A 127.0.0.1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Mar 18 21:36:59 CST 2020
;; MSG SIZE rcvd: 69
HTTP API
除了DNS接口之外,您還可以使用HTTP API查詢服務。
$ curl http://localhost:8500/v1/catalog/service/web
[
{
"ID": "e4768fed-0c53-9644-df15-7029a436e0ec",
"Node": "alias",
"Address": "127.0.0.1",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "127.0.0.1",
"lan_ipv4": "127.0.0.1",
"wan": "127.0.0.1",
"wan_ipv4": "127.0.0.1"
},
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceKind": "",
"ServiceID": "web",
"ServiceName": "web",
"ServiceTags": [
"rails"
],
"ServiceAddress": "",
"ServiceWeights": {
"Passing": 1,
"Warning": 1
},
"ServiceMeta": {},
"ServicePort": 80,
"ServiceEnableTagOverride": false,
"ServiceProxy": {
"MeshGateway": {},
"Expose": {}
},
"ServiceConnect": {},
"CreateIndex": 12,
"ModifyIndex": 12
}
]
HTTP API列出了承載給定服務的所有節點。正如你將在稍後討論服務健康檢查時看到的,你通常希望僅過濾健康服務實例的查詢,而DNS會在幕後自動執行這些查詢。過濾HTTP API查詢,只查找健康的實例。
$ curl 'http://localhost:8500/v1/health/service/web?passing'
[
{
"Node": {
"ID": "e4768fed-0c53-9644-df15-7029a436e0ec",
"Node": "alias",
"Address": "127.0.0.1",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "127.0.0.1",
"lan_ipv4": "127.0.0.1",
"wan": "127.0.0.1",
"wan_ipv4": "127.0.0.1"
},
"Meta": {
"consul-network-segment": ""
},
"CreateIndex": 10,
"ModifyIndex": 11
},
"Service": {
"ID": "web",
"Service": "web",
"Tags": [
"rails"
],
"Address": "",
"Meta": null,
"Port": 80,
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false,
"Proxy": {
"MeshGateway": {},
"Expose": {}
},
"Connect": {},
"CreateIndex": 12,
"ModifyIndex": 12
},
"Checks": [
{
"Node": "alias",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Type": "",
"Definition": {},
"CreateIndex": 10,
"ModifyIndex": 10
}
]
}
]
更新服務
通過更改服務定義文件,並向代理髮送SIGHUP或運行consul reload,可以在不停機的情況下更新服務配置。或者,可以使用HTTP API動態地添加、刪除和修改服務。在本例中,將更新註冊文件。
首先,通過運行以下命令來編輯註冊文件。複製並粘貼整個代碼塊(不包括$)到你的終端。
$ echo '{"service":
{"name": "web",
"tags": ["rails"],
"port": 80,
"check": {
"args": ["curl", "localhost"],
"interval": "10s"
}
}
}' > ./consul.d/web.json
此服務定義的“check”部分添加了一個基於腳本的健康檢查,該檢查嘗試每10秒通過curl連接到web服務。基於腳本的健康檢查與啓動consul流程的用戶相同。
如果命令使用出口代碼>= 2退出,那麼檢查將失敗,consul將認爲服務不健康。退出碼爲1將被視爲警告狀態。
現在重新加載consul的配置,使其知道新的健康檢查。
$ consul reload
Configuration reload triggered
請注意consul日誌中的以下幾行,它們表明web檢查非常重要。
2020-03-18T22:14:05.752+0800 [WARN] agent: Check is now critical: check=service:web
2020-03-18T22:14:05.934+0800 [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=alias
2020-03-18T22:14:15.761+0800 [WARN] agent: Check is now critical: check=service:web
2020-03-18T22:14:25.770+0800 [WARN] agent: Check is now critical: check=service:web
consul的DNS服務器只返回健康的結果。再次查詢web服務的DNS。它不應該返回任何IP地址,因爲web的健康檢查失敗了。
$ dig @127.0.0.1 -p 8600 web.service.consul
; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> @127.0.0.1 -p 8600 web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 17056
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul. IN A
;; AUTHORITY SECTION:
consul. 0 IN SOA ns.consul. hostmaster.consul. 1584540983 3600 600 86400 0
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Mar 18 22:16:23 CST 2020
;; MSG SIZE rcvd: 97
響應中沒有應答部分,因爲consul已經將web服務標記爲不健康。