Consul 快速指南



Consul - 簡介

Consul 是一個基於 HashiCorp 的工具,用於發現和配置基礎架構中各種不同的服務。它基於並構建在 Golang 之上。構建 Consul 的核心原因之一是為了維護分散式系統中存在的服務。Consul 提供的一些重要功能如下。

  • 服務發現 − 使用 DNS 或 HTTP,應用程式可以輕鬆找到它們所依賴的服務。

  • 健康檢查狀態 − 它可以提供任意數量的健康檢查。服務發現元件使用它來將流量從不健康的宿主機路由出去。

  • 鍵值儲存 − 它可以將 Consul 的分層鍵值儲存用於任意數量的目的,包括動態配置、特性標誌、協調、領導者選舉等。

  • 多資料中心部署 − Consul 支援多個數據中心。它用於構建額外的抽象層,以擴充套件到多個區域。

  • Web UI − Consul 為使用者提供了一個美觀的 Web 介面,使用它可以輕鬆使用和管理 Consul 中的所有功能。

服務發現

服務發現是 Consul 最重要的功能之一。它被定義為使用服務發現的各種服務和網路協議來查詢服務。服務發現的使用對分散式系統來說是一個福音。這是當今大型行業在環境中採用分散式系統發展過程中面臨的主要問題之一。

與 Etcd 和 Zookeeper 的比較

當我們檢視該領域的其他服務發現工具時,我們有兩個流行的選項。過去,一些軟體行業的巨頭一直在使用它。這些工具是EtcdZookeeper

讓我們考慮下表來比較每個工具的不同方面。我們還將瞭解每個工具內部使用了什麼。

屬性 Consul Etcd Zoo Keeper
使用者介面 可用
RPC 可用 可用
健康檢查 HTTP API HTTP API TCP
鍵值 3種一致性模式 良好的一致性 強一致性
令牌系統 可用
語言 Golang Golang Java

Consul - 成員和代理

Consul 成員可以定義為使用它們部署 Consul 叢集的不同代理和伺服器模式的列表。Consul 為我們提供了一個命令列功能,使用它可以輕鬆列出與 Consul 關聯的所有代理。

Consul 代理是 Consul 的核心程序。代理維護成員資訊、註冊服務、執行檢查、響應查詢等。任何代理都可以以兩種模式之一執行:客戶端伺服器。這兩種模式可以根據使用 Consul 時決定的角色來使用。Consul 代理透過提供以下資訊來提供幫助。

  • 節點名稱 − 這是機器的主機名。

  • 資料中心 − 代理配置為執行的資料中心。每個節點都必須配置為向其資料中心報告。

  • 伺服器 − 它指示代理是執行在伺服器模式還是客戶端模式。伺服器節點參與共識仲裁,儲存叢集狀態並處理查詢。

  • 客戶端地址 − 代理用於客戶端介面的地址。它包括 HTTP、DNS 和 RPC 介面的埠。

  • 叢集地址 − 叢集中 Consul 代理之間通訊使用的地址和埠集。所有其他節點都必須能夠訪問此地址。

在下一章中,我們將瞭解 Consul 的架構。

Consul - 架構

在一個數據中心中執行的 Consul 工作的架構圖最好描述如下:

Architecture

正如我們所看到的,有三個不同的伺服器由 Consul 管理。工作架構透過使用 Raft 演算法來實現,這有助於我們從三個不同的伺服器中選舉出一個領導者。然後根據標籤(例如跟隨者領導者)對這些伺服器進行標記。顧名思義,跟隨者負責遵循領導者的決策。所有這三個伺服器進一步相互連線以進行任何通訊。

每個伺服器使用 RPC 的概念與其自己的客戶端互動。客戶端之間的通訊是由於如下所述的八卦協議。可以使用 TCP 或八卦通訊方法提供與網際網路設施的通訊。這種通訊直接與三個伺服器中的任何一個聯絡。

Raft 演算法

Raft 是一種用於管理複製日誌的共識演算法。它依賴於CAP 定理的原理,該定理指出,在出現網路分割槽的情況下,必須在一致性和可用性之間進行選擇。並非 CAP 定理的所有三個基本原理都可以在任何給定時間點實現。必須對其中任何兩個進行權衡。

一個Raft 叢集包含多個伺服器,通常數量為奇數。例如,如果我們有五個伺服器,它將允許系統容忍兩次故障。在任何給定時間,每個伺服器都處於三種狀態之一:領導者、跟隨者候選者。在正常操作中,只有一個領導者,所有其他伺服器都是跟隨者。這些跟隨者處於被動狀態,即它們不會自行發出請求,而只是響應領導者和候選者的請求。

下圖描述了 Raft 演算法的工作流程模型:

Raft Algorithm

鍵值資料

從 Consul 的 0.7.1 版本開始,引入了單獨的鍵值資料。KV 命令用於透過命令列與 Consul 的鍵值儲存進行互動。它公開了用於插入、更新、讀取刪除儲存的頂級命令。要獲取鍵值物件儲存,我們呼叫 Consul 客戶端可用的 KV 方法:

kv := consul.KV()

KVPair 結構用於表示單個鍵值條目。我們可以在下面的程式中檢視 Consul KV 對的結構。

type KVPair struct {
   Key string
   CreateIndex uint64
   ModifyIndex uint64
   LockIndex uint64
   Flags uint64
   Value []byte
   Session string
}

這裡,上面程式碼中提到的各種結構可以定義如下:

  • − 它是一個斜槓 URL 名稱。例如 – sites/1/domain。

  • CreateIndex − 首次建立鍵時分配的索引號。

  • ModifyIndex − 最後更新鍵時分配的索引號。

  • LockIndex − 在鍵值條目上獲取新鎖時建立的索引號

  • 標誌 − 應用程式可以使用它來設定自定義值。

  • − 它是一個最大為 512kb 的位元組陣列。

  • 會話 − 建立會話物件後可以設定。

協議型別

Consul 中有兩種型別的協議,分別稱為:

  • 共識協議和
  • 八卦協議

讓我們現在詳細瞭解它們。

共識協議

Consul 使用共識協議來提供 CAP 定理中描述的一致性。此協議基於 Raft 演算法。在實現共識協議時,使用 Raft 演算法,其中 Raft 節點始終處於三種狀態之一:跟隨者、候選者或領導者。

八卦協議

八卦協議可用於管理成員身份,在叢集之間傳送和接收訊息。在 Consul 中,八卦協議的使用有兩種方式,WAN(無線區域網)和LAN(區域網)。有三個已知的庫可以實現八卦演算法來發現對等網路中的節點:

  • teknek-gossip − 它與 UDP 一起工作,並用 Java 編寫。

  • gossip-python − 它利用 TCP 堆疊,也可以透過構建的網路共享資料。

  • Smudge − 它用 Go 編寫,並使用 UDP 交換狀態資訊。

八卦協議也用於實現和維護分散式資料庫一致性或其他型別的一致狀態資料,計算未知大小網路中的節點數量,穩健地傳播新聞,組織節點等。

遠端過程呼叫

RPC 可以表示為遠端過程呼叫的縮寫。這是一種程式用於請求另一程式服務的協議。此協議可以位於網路上的另一臺計算機上,而無需確認網路詳細資訊。

在 Consul 中使用 RPC 的真正優勢在於,它幫助我們避免了大多數服務發現工具一段時間前所具有的延遲問題。在 RPC 之前,Consul 僅使用基於TCPUDP的連線,這對於大多數系統來說都很好,但在分散式系統的情況下則不然。RPC 透過減少從一個地方到另一個地方的包資訊傳輸時間段來解決此類問題。在這個領域,谷歌的GRPC是一個值得期待的好工具,以防有人希望觀察基準並比較效能。

Consul - 安裝

為了演示目的,我們將使用開發模式下的 consul 代理 -dev 模式。僅對於本地機器設定,我們將進行單系統 Consul 設定。請不要在生產環境中使用此單節點 Consul 叢集。正如 HashiCorp 在單節點 Consul 叢集的案例中已經提到的那樣,資料丟失是不可避免的

安裝 Consul

可以透過www.consul.io/downloads.html上的下載頁面安裝 Consul

Installing Consul

您可以將二進位制包解壓到機器的下載部分。

$ cd Downloads
$ chmod +x consul
$ sudo mv consul /usr/bin/

現在讓我們使用-dev標誌啟動 Consul。

$ consul agent -dev -data-dir=/tmp/consul

輸出將如以下螢幕截圖所示。

Dev Flag

現在您可以使用以下命令檢查您的 Consul 成員。

$ consul members

輸出將如以下螢幕截圖所示。

Memebers

如果您想將其他節點加入此節點:

$ consul join <Node 2> <Node 3>

或者,您可以在節點 2 和 3 上執行以下命令:

$ consul join <Node 1>

使用命令列

Consul 的命令列包含幾個不同的選項,一些最常用的選項如下:

  • agent − 執行 Consul 代理。

  • configtest − 驗證配置檔案。

  • event − 啟動一個新事件。

  • exec − 在 Consul 節點上執行命令。

  • force-leave − 強制叢集成員離開叢集。

  • info − 它為運營商提供除錯資訊。

  • join − 使 Consul 代理加入叢集。

  • keygen − 生成一個新的加密金鑰。

  • keyring − 管理八卦層加密金鑰。

  • kv − 與鍵值儲存互動。

  • leave − 離開 Consul 叢集並將其關閉,無需強制。

  • lock − 執行命令以保持鎖。

  • maint − 控制節點或服務的維護模式。

  • members − 它列出 Consul 叢集的成員。

  • monitor − 它從 Consul 代理流式傳輸日誌。

  • operator − 它為 Consul 運營商提供了一組工具。

  • reload − 它觸發代理重新載入配置檔案。

  • rtt − 它估計節點之間的網路往返時間。

  • snapshot − 它儲存、恢復和檢查 Consul 伺服器狀態的快照。

  • version − 列印當前 Consul 版本。

  • watch − 監視 Consul 中的變化。

Consul 模板

consul-template 提供了一個守護程序,該程序查詢 Consul 例項並更新檔案系統上的任意數量的指定模板。consul-template 可以選擇在更新過程完成後執行任意命令。此選項有助於我們設定 Consul 叢集,而無需手動完成所有操作。

consul 模板將生成在 **`/tmp/<檔名>.conf.tmpfl`** 。模板使用的語言為 **HashiCorp 配置語言 (HCL)**。

您可以從此 頁面 下載 consul-template。

Template

嘗試使用以下命令:

$ ./consul-template -h

輸出將如以下螢幕截圖所示。

Template Output

如果您希望將此二進位制檔案移動到更顯眼的位置,以便使用者每次都能使用它。您可以輸入以下命令:

$ chmod +x consul-template
$ sudo mv consul-template /usr/share/bin/

出於演示目的,我們將使用 **nginx** 的示例配置作為我們的服務。您可以在 https://github.com/hashicorp/consul-template/tree/master/examples 嘗試更多演示,或者編寫您自己的模板。

$ vim /tmp/nginx.conf.ctmpl

輸出將如以下螢幕截圖所示。

nginx

配置檔案可能如下所示:

{{range services}} {{$name := .Name}} {{$service := service .Name}}

upstream {{$name}} {
   zone upstream-{{$name}} 64k;
   {{range $service}}server {{.Address}}:{{.Port}} max_fails = 3 fail_timeout = 60
   weight = 1;
   {{else}}server 127.0.0.1:65535; # force a 502{{end}}
} {{end}}

server {
   listen 80 default_server;
   location / {
      root /usr/share/nginx/html/;
      index index.html;
   }
   location /stub_status {
      stub_status;
   }
   {{range services}} {{$name := .Name}}
   location /{{$name}} {
      proxy_pass http://{{$name}};
   }
   {{end}}
}

現在使用 consul template 二進位制檔案,請執行以下命令:

$ consul-template \
 -template = "/tmp/nginx.conf.ctmpl:/etc/nginx/conf.d/default.conf"

透過之前的命令,程序已啟動。稍後您可以開啟另一個終端並檢視使用以下命令完全渲染的 nginx.conf 檔案。

$ cat /etc/nginx/conf.d/default.conf

輸出將如以下螢幕截圖所示。

Output

Consul - 與微服務的協同工作

在本章中,我們將瞭解微服務如何與 Consul 協同工作。我們還將學習以下元件如何影響 Consul。

  • 使用 Docker
  • 構建 Registrator 用於服務發現
  • 使用 rkt 和 Nomad

現在讓我們詳細討論每一個。

使用 Docker

在開始之前,**請不要在生產環境中使用此設定**,因為它僅用於演示目的。Docker 是一種基於容器的服務,我們可以使用它輕鬆部署應用程式。為了使用 Consul,我們將使用以下連結中的映象:

https://hub.docker.com/r/progrium/consul/.

假設您的系統已安裝並正確配置了 Docker。讓我們嘗試從 Docker Hub 下載映象,執行以下命令:

$ docker pull progrium/consul

輸出將如以下螢幕截圖所示。

Pull Progrium

我們將以以下方式釋出一些介面及其埠(在 Docker 上使用 -p 選項)。

  • 8400 (RPC)
  • 8500 (HTTP)
  • 8600 (DNS)

此外,根據拉取操作,我們將主機名設定為 **node1**。您可以使用 **-h 標記** 和您自己的主機名將其更改為您想要的任何名稱,如下所示。

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap

輸出將如以下螢幕截圖所示。

Pull Made

您還可以使用以下命令啟用 Consul 的 UI 模式:

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap -ui-dir /ui

您可以在 **https://:8500** 上檢視基於 UI 的輸出。以下螢幕截圖讓您更好地瞭解基於 UI 的輸出。

UI based

為了在不同節點上的多個 Docker 容器上使用 consul,我們可以在不同節點上執行以下命令:

在 Node1 上

$ docker run -d --name node1 -h node1 progrium/consul -server -bootstrap-expect 3

其中,**-bootstrap-expect 3** 表示 consul 伺服器將在有 3 個對等節點連線之前等待,然後進行自我引導併成為一個工作的叢集。

在繼續之前,我們需要透過檢查容器來獲取容器的內部 IP。對於我們的用例,我們將宣告 **$JOIN_IP**。

$ JOIN_IP = "$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"

在 Node2 上

因此,讓我們啟動 Node2 並指示它使用上面程式中宣告的變數加入 Node1。

$docker run -d --name node2 -h node2 progrium/consul -server -join $JOIN_IP

在 Node3 上

$ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP

構建 Registrator 用於服務發現

Registrator 透過檢查容器上線情況,自動註冊和登出任何 Docker 容器的服務。我們即將使用的 Registrator 目前支援可插拔的服務登錄檔,目前包括 **Consul、Etcd** 和 **SkyDNS2**。當我們在網路上與不同的服務互動時,強烈建議使用 Registrator。

$ docker pull gliderlabs/registrator:latest

輸出將如以下螢幕截圖所示。

gliderlabs

$ docker run -d \
--name = registrator \
--net = host \
--volume = /var/run/docker.sock:/tmp/docker.sock \
gliderlabs/registrator:latest \
 consul://:8500

輸出將如以下螢幕截圖所示。

gliderlabs

您收到的輸出是您剛剛啟動的 Docker 容器的 ID。您可以使用以下命令檢查容器是否正在執行:

$ docker ps -a

輸出將如下面的螢幕截圖所示。

docker ps

您還可以使用以下命令檢視 Registrator 的日誌。

$ docker logs registrator

使用 rkt 和 Nomad

rkt 是另一種基於容器的服務,您可以在您的環境中使用它。它由 **CoreOS** 構建。構建 rkt 的主要原因是提高安全性,這是 Docker 在 2013-14 年仍在開發時面臨的危機問題之一。

對於 Consul,我們可以使用 Rkt Registrator 來處理 Consul 的服務發現。這個針對 rkt 的 Registrator 專案正在開發中,**不建議用於生產環境**。

您可以透過轉到其路徑並執行以下命令來檢查 rkt 是否已安裝。

$ ./rkt

您可以檢查輸出以檢視它是否已正確安裝,如下面的螢幕截圖所示。

Rkt Registrator

要嘗試 rkt 和 Consul,請檢視:https://github.com/r3boot/rkt-registrator

Nomad 工具

最常用和最受歡迎的選項之一是 Nomad 工具。Nomad 是一種用於管理機器叢集並在其上執行應用程式的工具。它類似於 **Mesos** 或 **Kubernetes**。預設情況下,Nomad 在自身內部包含 Docker 和 rkt 驅動程式。因此,如果您正在尋找使用 Consul 進行大規模部署容器的方法,Nomad 可能是一個不錯的解決方案。檢視 https://www.nomadproject.io/docs/drivers/rkt.html 以獲取有關 Nomad 的更多資訊。

Consul - 引導和DNS

在本章中,我們將討論以下元件如何在 Consul 中使用。

  • 自動引導
  • 手動引導
  • 使用 DNS 轉發
  • DNS 快取

現在讓我們詳細討論每一個。

自動引導

引導是 Consul 的核心功能之一。當您第一次安裝 consul 時,它會自動配置為檢測、識別和加入它遇到的節點。在其叢集形成過程中,自動引導是 Consul 的內建功能。要獲得有關 consul 的更多資訊,最好的方法是使用以下命令:

$ sudo consul info

輸出將如以下螢幕截圖所示。

Automatic Bootstrapping

此命令將顯示 consul 在 **實際工作場景** 中的實際工作方式。它將顯示在 Consul 中工作的 Raft 演算法。可以使用以下命令顯示自動引導命令:

$ consul agent -server -data-dir = ”/tmp/consul” -bootstrap-expect 3

在 -dev 模式下無法進行自動引導。

此選項將預期伺服器節點數量告知 Consul,並在伺服器可用時自動引導。

手動引導

手動引導是 Consul 的一項舊但有用的功能。實際上,在 Consul 的早期版本中,首次安裝和使用 consul 時必須手動進行引導。後來,人們意識到不可能在不同的時間執行此命令列操作。因此,引入了自動引導。您可以始終使用以下命令手動使用引導。

在這種情況下,我們將假設要構建一個 3 節點的 consul 叢集。

有兩種方法可以進行手動引導

  • 在 2 個節點上執行命令:在節點 B 和節點 C 上,您可以執行以下操作:

$ consul join <Node A Address>
  • 在一個節點上執行命令:

$ consul join <Node B Address> <Node C Address>

使用 DNS 轉發

DNS 從 **53 埠** 提供服務。DNS 轉發可以使用 **BIND、dnsmasq** 和 **iptables** 完成。預設情況下,Consul 代理執行一個在 8600 埠監聽的 DNS 伺服器。透過向 Consul 代理的 DNS 伺服器提交 DNS 請求,您可以獲取執行您感興趣的服務的節點的 IP 地址。

Consul DNS 介面透過 **SRV 記錄** 提供服務的埠資訊。通常,無需在程式碼中手動新增邏輯,您僅限於查詢服務的 IP 地址資訊(即 A 記錄)。

最好的方法是擁有多個 BIND 伺服器,每個伺服器都在本地執行一個 Consul 代理。BIND 伺服器接收到的任何查詢都將轉發到其本地 Consul 代理 DNS 伺服器。

使用 Bind

我們可以使用 Bind 函式進行 DNS 轉發。可以使用以下命令完成:

$ sudo apt-get install bind9 bind9utils bind9-doc

輸出將如以下螢幕截圖所示。

Bind function

讓我們使用以下命令編輯 /etc/bind/named.conf 檔案。

$ sudo vim /etc/bind/named.conf

在檔案中,請在程式碼的最後一行下方新增以下幾行。

options {
   directory "/var/cache/bind";
   recursion yes;
   allow-query { localhost; };
   
   forwarders {
      8.8.8.8;
      8.8.4.4;
   };
   dnssec-enable no;
   dnssec-validation no;
   auth-nxdomain no; # conform to RFC1035
   listen-on-v6 { any; };
};
include "/etc/bind/consul.conf";

輸出將如以下螢幕截圖所示。

Bind command

您可以使用以下 Bind 命令配置 Consul。

$ sudo vim /etc/bind/consul.conf

建立檔案時,請新增以下幾行:

zone "consul" IN {
   type forward;
   forward only;
   forwarders { 127.0.0.1 port 8600; };
};

現在您可以使用以下命令啟動您的 consul 代理。(記住也要重新啟動 bind9 服務。)

$ sudo service bind9 restart
$ consul agent -server -bootstrap-expect 1 -data-dir = /tmp/consul -configdir = [Path]

系統需要配置為將查詢傳送到本地 Consul 代理的 DNS 伺服器。這是透過更新系統上的 **resolv.conf** 檔案以指向 127.0.0.1 來完成的。在大多數情況下,需要將 Consul 配置為在 53 埠執行。

您可以將以下資訊新增到 /etc/resolv.conf

nameserver 127.0.0.1

DNS 快取

Consul 使用“0 TTL”(生存時間)值提供所有 DNS 結果。這可以防止任何快取。但是,由於 TTL 值,可以將其設定為允許 DNS 結果在 Consul 的下游進行快取。較高的 TTL 值減少了對 Consul 伺服器的查詢次數並加快了客戶端的查詢速度,但代價是結果越來越陳舊。

為此,我們將使用以下方法使用 DNS 快取:

$ sudo apt-get install dnsmasq

輸出將如以下螢幕截圖所示。

dnsmasq

現在,我們可以進行一個非常簡單的配置:

$ echo "server = /consul/127.0.0.1#8600" > /etc/dnsmasq.d/10-consul

我們在這裡所做的只是指定要由 127.0.0.1 上 8600 埠的 DNS 伺服器處理的 consul 服務的 DNS 請求。除非您更改 consul 預設值,否則這應該可以工作。

在正常情況下,應使用以下命令。

$ dig @127.0.0.1 -p 8600 web.service.consul

對於 **Dnsmasq**,您應該使用以下命令。

$ dig web.service.consul

輸出將如以下螢幕截圖所示。

web.service

Consul - 查詢節點

在本章中,我們將學習如何使用以下函式查詢節點:

  • 使用 dig
  • 使用 Monitor 命令
  • 使用 Watch 命令
  • 透過註冊外部服務

讓我們詳細瞭解這些函式。

使用 Dig

Consul 在 consul 的 127.0.0.1:8600 上監聽 DNS 查詢。它確定哪些節點可用於提供服務的方式是使用檢查,這些檢查可以是:

  • 執行並返回 **符合 nagios 標準的程式碼** 的指令碼。

  • 返回 HTTP 響應程式碼的 HTTP 檢查。

  • 檢查埠是否開啟的 TCP 檢查。

嘗試 **dig** 的通用命令是:

$ dig @127.0.0.1 -p <port> <service-name>.consul

現在,讓我們嘗試一個示例 **dig** 命令:

$ dig @127.0.0.1 -p 8600 web.service.consul

輸出將如以下螢幕截圖所示。

dig

使用 Monitor 命令

它用於連線並顯示正在執行的 Consul 代理的日誌。此命令將顯示最近的日誌。它還允許您以相對較高的日誌級別記錄代理。它包含各種日誌級別,您可以遵循,例如:跟蹤、除錯、資訊、警告和錯誤。

讓我們嘗試以下命令:

$ consul monitor

輸出將如以下螢幕截圖所示。

Monitor Command

您還可以使用子命令(例如 -log-level 和 -rpc-address)設定 monitor 命令。預設情況下,RPC 地址為 127.0.0.1:8400。更多資訊,請點選 此處

使用 Watch 命令

此命令為我們提供了一種機制來監視節點列表、服務成員、鍵值等的變化。它還會使用檢視的最新值呼叫一個程序。如果未指定程序,則將當前值處理到 **STDOUT**,這是一種檢查 Consul 中資料的有用方法。Consul Watch 命令幫助具有各種不同的選項,如下面的螢幕截圖所示:

Watch Command

讓我們使用 **-type = service** 嘗試一個演示,如下面的命令所示。

$ consul watch -type = service -service = consul

Watch Type

有關此主題的更多資訊,您可以點選 此處

透過註冊外部服務

註冊後,DNS 介面將能夠為服務返回相應的“A 記錄”或 CNAME 記錄。讓我們註冊一個外部服務,例如 Amazon,如下面的程式碼塊和螢幕截圖所示。

$ sudo curl -X PUT -d '{"Datacenter": "dc1", "Node": "amazon",
"Address": "www.amazon.com",
"Service": {"Service": "shop", "Port": 80}}'
http://127.0.0.1:8500/v1/catalog/register

Registering External Services

以上命令指定了一個名為 shop 的服務。此節點名為 amazon,其 URL 為 www.amazon.com,埠為 80。讓我們檢查 consul 的輸出,確保我們已正確安裝此服務。為此,請在瀏覽器視窗中開啟 localhost:8500。

Registering External Services

要刪除服務,我們可以簡單地使用以下命令。

$ curl -X PUT -d '{"Datacenter": "dc1", "Node": "amazon"}'
http://127.0.0.1:8500/v1/catalog/deregister

Remove Service

讓我們檢查一下 UI,如下圖所示。

Remove Service

Consul - 故障轉移事件

本章,我們將學習 Consul 中的故障轉移事件。這將藉助以下功能實現:

  • 單叢集故障
  • Jepsen 測試
  • 多叢集故障
  • 拍攝快照

讓我們詳細瞭解一下這些內容。

單叢集故障

在單叢集故障中,位於某個資料中心的一個叢集開始出現故障。在每種情況下,務必確保在發生故障轉移時,系統不僅能夠防止故障,而且還擁有可以依賴的備份。為了防止 Consul 故障轉移事件,我們將使用名為 Consul-alerts 的工具。主要專案可以在以下地址找到:https://github.com/AcalephStorage/consul-alerts

Consul-alerts 是一個高可用守護程式,用於根據 Consul 健康檢查傳送通知和提醒。此專案在 localhost:9000 執行守護程式和 API,並連線到本地 consul 代理 (localhost:8500) 及預設資料中心 (dc1)。

有兩種方法可以開始使用該專案。第一種方法是透過 **GO** 安裝。對於已安裝和配置 GO 的使用者,可以按照以下步驟操作:

$ go get github.com/AcalephStorage/consul-alerts
$ go install
$ consul-alerts start

最後一個命令可以輕鬆地用於覆蓋 consul-alert 的預設埠、資料中心選項、consul-acl 令牌等。該命令也可以按如下方式編寫:

$ consul-alerts start --alert-addr = localhost:9000 --consul-addr = localhost:8500
--consul-dc = dc1 --consul-acl-token = ""

第二種方法涉及使用者使用 Docker。這兩種方法在不同的場景下同樣有用。要在 Docker 上使用 Consul-alerts,讓我們使用以下命令從 Docker Hub 拉取映象。

$ docker pull acaleph/consul-alerts

Consul-Alerts

在 Docker 方法中,我們可以考慮以下三個選項:

  • 使用容器本身內建的 Consul 代理。
  • 使用在另一個 Docker 容器中執行的 Consul 代理。
  • 使用 Consul-alerts 連線到遠端 Consul 例項。

現在讓我們詳細討論一下這些內容。

使用容器本身內建的 Consul 代理

讓我們使用以下命令啟動 consul 代理:

$ docker run -ti \
   --rm -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \  
   --entrypoint = /bin/consul \
   acaleph/consul-alerts \
   agent -data-dir /data -server -bootstrap -client = 0.0.0.0

在這裡,我們使用標誌 **--entrypoint** 覆蓋了 Consul 的 **entrypoint**。同時,我們透過使用 **-p 標誌、資料目錄 /data** (使用標誌 -data-dir)和客戶端 0.0.0.0 來引導客戶端。

Entrypoint

在新終端視窗中,讓我們啟動 consul-alerts 選項。

$ docker exec -ti consul-alerts /bin/consul-alerts start --alertaddr = 0.0.0.0:9000
--log-level = info --watch-events --watch-checks

在這裡,在上述步驟中,我們執行 consul-alerts 以互動模式啟動。警報地址埠設定為 9000。監視檢查 consul 代理是否啟用以及 consul 檢查。

Alerts Option

我們可以清楚地看到,consul 警報已輕鬆啟動,並且它已註冊了一個新的健康檢查,並添加了 consul 代理。資料中心採用 dc1,使用者可以根據需要更改。

使用在另一個 Docker 容器中執行的 Consul 代理

在這裡,您可以使用任何型別的 consul 映象在 Docker 容器中執行。使用 consul-alerts 映象,我們可以輕鬆地將 consul 容器與 consul-alerts 容器連結。這是使用 **--link 標誌** 完成的。

**注意** - 在使用以下命令之前,請確保 consul 容器已在另一個終端執行。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   --link consul:consul \
   acaleph/consul-alerts start \
   --consul-addr=consul:8500 \
   --log-level = info --watch-events --watch-checks

使用 Consul-alerts 連線到遠端 Consul 例項

在這裡,我們應該使用以下命令來使用 Consul-alerts 連線到遠端 consul 例項。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   acaleph/consul-alerts start \
   --consul-addr = remote-consul-server.domain.tdl:8500 \
   --log-level = info --watch-events --watch-checks

Jepsen 測試

Jepsen 是一個用於測試任何系統中的部分容錯和網路的工具。它透過對系統進行一些隨機操作來測試系統。**Jepsen 使用 Clojure 編寫**。不幸的是,對於演示,Jepsen 測試需要大量的叢集形成和資料庫系統,因此不在本文討論範圍內。

Jepsen 透過在五個不同的主機上設定被測資料儲存來工作。它為被測資料儲存建立一個客戶端,指向五個節點中的每一個節點以傳送請求。它還建立了一系列特殊的客戶端,稱為“Nemesis”,它們會在叢集中造成破壞,例如使用 **iptables** 切斷節點之間的連結。然後,它繼續對不同的節點併發發出請求,同時交替地劃分和修復網路。

在測試執行結束時,它會修復叢集,等待叢集恢復,然後驗證系統的中間狀態和最終狀態是否符合預期。

有關 Jepsen 測試的更多資訊,請檢視 此處

多叢集故障

在多叢集故障轉移事件期間,部署在多個數據中心的叢集無法支援向客戶提供的服務。Consul 使我們能夠確保當這種情況發生時,Consul 具有幫助您在這種情況下啟用服務的功能。

為此,我們將研究一個專案,該專案幫助我們將 Consul 從一個叢集複製到多個叢集。該專案為我們提供了一種使用 consul-replicate 守護程式跨多個 Consul 資料中心複製 K/V 對的方法。您可以在以下位置檢視此 HashiCorp 專案:https://github.com/hashicorp/consul-replicate。嘗試此專案的一些前提條件包括:

  • Golang
  • Docker
  • Consul
  • Git

讓我們從以下命令開始:

**注意** - 在執行以下命令之前,請確保已在您的機器上正確安裝和配置 Git。

**$ git clone** - https://github.com/hashicorp/consul-replicate.git

輸出將如以下螢幕截圖所示。

Git Clone

$ cd consul-replicate
$ make

輸出將如以下螢幕截圖所示。

Replicate

如果您在構建二進位制檔案時遇到一些問題,也可以嘗試使用以下命令手動拉取 Docker 映象:

$ docker pull library/golang:1.7.4

上述命令將建立 bin/consul-replicate,可以將其作為二進位制檔案呼叫。下表顯示了它涵蓋的子命令的完整列表:

選項 描述
auth 基本身份驗證使用者名稱(和可選密碼),用冒號分隔。沒有預設值。
consul* 要查詢的 consul 例項的位置(可能是 IP 地址或 FQDN)以及埠。
max-stale 查詢的最大陳舊性。如果指定,Consule 將在所有伺服器之間分配工作,而不僅僅是領導者。預設值為 0(無)。
ssl 與 Consul 通訊時使用 HTTPS。需要將 consule 伺服器配置為服務安全連線。預設值為 false。
ssl-verify 透過 SSL 連線時驗證證書。這需要使用 -ssl。預設值為 true。
syslog 將日誌輸出傳送到 syslog(除了 stdout 和 stderr)。預設值為 false
syslog-facility 傳送到 syslog 時使用的工具。這需要使用 -syslog。預設值為 LOCAL
token Consul API 令牌。沒有預設值。
prefix* 包括源字首,以及目標字首選項,用冒號 (**:**) 分隔。此選項是累加的,可以為要複製的多個字首多次指定。
exclude 在複製期間要排除的字首。此選項是累加的,可以為要排除的多個字首多次指定。
wait 複製前等待穩定性的最小值(:最大值),用冒號 (**:**) 分隔。如果省略可選的最大值,則假定它為所需最小值的 4 倍。沒有預設值。
retry 如果 Consule 在與 API 通訊時返回錯誤,則等待的時間量。預設值為 5 秒。
config 磁碟上配置檔案或配置檔案目錄的路徑,相對於當前工作目錄。CLI 上指定的值優先於配置檔案中指定的值。沒有預設值。
log-level 輸出的日誌級別。這適用於 stdout/stderr 日誌記錄以及 syslog 日誌記錄(如果啟用)。有效值為“debug”、“info”、“warn”和“err”。預設值為“warn”。
once 執行 Consule Replicate 一次並退出(而不是預設的守護程式行為)。*(僅限 CLI)*
version 輸出版本資訊並退出。*(僅限 CLI)*

拍攝快照

快照對於在備份情況下管理 Consul 叢集至關重要。預設情況下,Consul 為我們提供了一種儲存 Consul 叢集快照的方法。Consul 為我們提供了四個單獨的子命令,我們可以使用它們來建立快照,它們是:

  • Consul snapshot save
  • Consul snapshot agent
  • Consul snapshot inspect
  • Consul snapshot restore

讓我們詳細瞭解一下這些內容。

Consul Snapshot Save

此命令設定為檢索 Consul 伺服器狀態的原子式時間點快照,其中包括鍵/值條目、服務目錄、準備好的查詢、會話和 ACL。快照儲存到提到的檔名中。

$ consul snapshot save <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Save

要檢查當前目錄中是否存在該檔案,請透過在當前目錄中執行它來檢查。對於非領導者節點,請執行以下命令:

$ consul snapshot save -stale <name-of-file>.snap

Consul Snapshot Agent

此子命令啟動一個程序,該程序拍攝 Consul 伺服器狀態的快照並將其儲存在本地,或將其推送到可選的遠端儲存服務。

Snapshot Agent

Consul Snapshot Inspect

它用於檢查 Consul 伺服器狀態的時間點快照,其中包括鍵/值條目、服務目錄、準備好的查詢、會話和 ACL。命令可以按如下方式執行:

**注意** - 請記住,以下命令只能在儲存快照的目錄中執行。

$ consul snapshot save <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Inspect

Consul Snapshot Restore

快照恢復命令用於恢復 Consul 伺服器狀態的時間點快照,其中包括鍵/值條目、服務目錄、準備好的查詢、會話和 ACL。快照從儲存的備份檔案中讀取。

**注意** - 請記住,以下命令只能在儲存快照的目錄中執行。

$ consul snapshot restore <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Restore

如果您正在使用 AWS 使用 Consul,此專案可能會幫助您節省一些時間:https://github.com/pshima/consul-snapshot

Consul - 使用UI

本章,我們將學習如何使用 Consul UI(使用者介面)並瞭解其重要元件。

Consul UI 設定

Consul 提供了一個方便易用的介面,讓我們可以輕鬆管理各種事物。您可以輕鬆地在任何您想要的埠啟動 Consul 使用者介面。Consul UI 可以分為三個主要部分:

  • ACL(訪問控制列表) – 一套規則,可以輕鬆鎖定您的叢集。

  • 資料中心 – 使您可以輕鬆管理資料中心並處理您的叢集。

  • 節點 – 快速瞭解 Consul 叢集正在使用的節點。

使用 Consul UI

為了使用 Consul UI,我們必須安裝 HashiCorp 團隊在 Consul 專案站點上提供的 UI 包。因此,讓我們嘗試從原始碼下載它並開始使用它。如果顯示許可權被拒絕錯誤,請在每個命令前使用sudo

$ mkdir /opt/consul-ui
$ cd /opt/consul-ui
$ wget https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_web_ui.zip
$ unzip consul_0.7.2_web_ui.zip
$ rm consul_0.7.2_web_ui.zip

您可以使用以下命令在任何代理上檢視 Consul UI 的輸出。

$ consul agent -dev -ui -data-dir /tmp/consul

輸出將如以下螢幕截圖所示。

Agent

預設情況下,您將在https://:8500/ui看到 UI。/ui 部分與 Consul 的 HTTP API 相同。

要在 Docker 上使用 Consul UI,請為 Docker 映象 (progrium/consul) 執行以下命令:

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap -ui-dir /ui

輸出將如以下螢幕截圖所示。

progrium/consul

Consul UI 的功能

您可以透過檢視其一些功能來開始瀏覽 Consul UI,例如:

  • 節點
  • ACL
  • 鍵值對
  • 設定
  • 資料中心
  • 服務

讓我們詳細瞭解一下這些內容。

節點

可以在下面的螢幕截圖中看到 UI 儀表板上節點的基本用法。

UI Dashboard

當您點選某個特定節點(在本例中為 node1)時,我們可以看到節點資訊很容易檢視,例如:

node1

您可以隨時從 Consul 登出節點。這使得從高階 Consul 叢集的角度輕鬆管理節點。

ACL(訪問控制列表)

Consul 最好的功能之一是訪問控制列表。您可以為不同資料中心中的不同叢集編寫不同的許可權。啟用 ACL 的最簡單方法是在 Consul 的資料目錄中新增一個新的 json 檔案。要啟用和更新 ACL,您可以在設定中的欄位中新增主 ACL 令牌,並使用 ACL 選項卡重新整理它。

更多資訊,請檢視此處

ACL Tab

鍵值對

Consul UI 預設情況下提供 Consul 的鍵值對選項。您可以使用 Consul UI 建立您自己的鍵。它還提供建立資料夾來儲存金鑰的選項。

Key/Value

設定

您可以在螢幕右上角檢視 Consul UI 的設定選項。單擊該選項後,您可以輕鬆看到 Consul 提供了一個選項,您可以使用該選項配置其本地儲存設定和用於驗證的令牌系統。

Settings

資料中心

資料中心選項可以根據您的選擇輕鬆更改和切換。Consul UI 會自動更新 Consul 正在執行的資料中心數量的檢測。

服務

Consul UI 還提供了一個服務選項卡,用於配置和檢視當前使用 Consul 部署的服務。它使我們可以根據節點配置服務。

Consul - 在AWS上使用Consul

在本章中,我們將學習如何在 AWS(Amazon Web Services)上使用 Consul。

AWS 的功能

在 AWS 中使用 Consul 時,一些有用的功能包括:

  • 易於維護叢集狀態。
  • 可擴充套件性和高可用性。
  • 出色的使用者介面,用於跨多個數據中心管理叢集。
  • 易於使用的命令列選項。

如果您正在尋找一種可以使用 Docker 在 AWS 上輕鬆部署 Consul 的解決方案,請檢視以下連結:https://github.com/dwmkerr/terraform-consul-cluster

AWS 部署

要使用 AWS,我們可以從為其建立 VPC 開始。為了在 AWS 中部署 Consul,我們將使用 AWS 服務提供的快速入門模板。此模板很容易找到:https://aws.amazon.com/quickstart/architecture/consul/

在本章中,我們假設您已經瞭解 AWS 的基礎知識。AWS CloudFormation 模板將建立以下元件:

  • 跨三個可用區的具有公共和私有子網的VPC

  • 一個種子 Consul 伺服器和一個種子客戶端,以及兩個自動擴充套件組。

  • 您可以選擇建立 3、5 或 7 個伺服器。客戶端數量預設為三個,但使用者可以進行配置。

  • Dnsmasq,作為安裝的一部分,已安裝並配置為 Consul。

  • 使用bootstrap_expect選項的 Consul 叢集。

檢視下圖以瞭解不同元件如何互連。

Interconnected

使用 AWS

請確保您已使用 Web 控制檯登入到您的 AWS 基礎架構。現在,請將以下URL放入瀏覽器視窗。輸入 URL 並按 Enter 鍵後,AWS 網站將開啟。

Using the AWS

在本演示中,我們將選擇將其部署到新的 VPC(虛擬私有云)。您始終可以在以下連結上檢視 AWS 的 VPC 管理:https://<awsregion>.console.aws.amazon.com/vpc/home。對於首次使用者,預設區域是美國的俄勒岡州西部。因此,您可以直接訪問以下 URL:https://us-west-2.console.aws.amazon.com/vpc/home。

VPC Management

您可以看到 AWS 的 VPC 服務正在執行,並且您的 AWS 帳戶中沒有正在執行/配置的 VPC。現在,請根據您的選擇點選 AWS 上的“部署到新 VPC”選項或“部署到現有 VPC”選項。您可以在網站上看到該選項,如下圖所示。

VPC service

點選上述選項後,您可以看到它會開啟另一個視窗,類似於如下所示的視窗。

Create Stack

如您所見,URL 已由 AWS 為您選擇。它還使您可以自由地自定義 CloudFormation 模板。您可以根據需要自定義它,然後點選“下一步”按鈕繼續。

Specify Details

如您所見,您可以在此處配置各種不同的值和選項。對於某些更改,您可以根據您的選擇將其重新命名為 HashiCorp-Consul 的替代名稱。請隨意根據您的方便更改其他選項。

Configure

如上所示,可以根據您的選擇自定義多個選項。如您在 Consul 設定部分中所見,預設的 Consul 叢集例項型別為t2.medium。您可以根據您的選擇更改它。

注意 – 將允許的範圍填寫為 0.0.0.0/0 以允許任何 IP 地址。

預設情況下,Consul 伺服器數量為三個。您可以將其更改為五個,以在 Consul 環境中測試更多伺服器。在快速入門配置下,您可以看到還使用了S3 儲存桶,並且預設情況下將其命名為快速入門參考。完成更改後,點選螢幕底部的“下一步”按鈕。

Options

在上圖中,您可以看到可以使用標籤來更好地識別和使用。除此之外,您還可以選擇 IAM 角色,以允許其他人訪問您的 VPC 堆疊。您可以根據您的選擇進行選擇。

對於更高階的選項,請選擇高階選項卡,您可以在其中為您的 VPC 啟用 Amazon SNS 以獲取其通知。完成詳細資訊後,請繼續執行下一步。

Review

上述螢幕顯示了您選擇的 Consul 堆疊的詳細資訊。您可以檢視為 VPC 堆疊選擇的選項,然後轉到螢幕底部,選中建立 IAM 資源的確認框,然後點選“建立”按鈕以完成堆疊的建立。

您可以在 AWS 管理控制檯的 CloudFormation 堆疊部分下檢視輸出。根據 VPC 輸出,您也可以在 AWS 控制檯的 VPC 部分檢視它,如下面的螢幕截圖所示。

CloudFormation

如果您只是測試 Consul 模板,請確保刪除您已使用的資源。您可以透過刪除 CloudFormation 部分下的 CloudFormation 堆疊和 VPC 儀表板上的 VPC 來輕鬆完成此操作。

廣告
© . All rights reserved.