邊緣集群環境下Consul集成Envoy實踐
前言
Consul Service Mesh通過授權和加密來保護服務之間的通信,還可以攔截有關服務到服務通信的數據並將其呈現給監視工具。我們可以使用Consul隨附的內置代理測試Consul Service Mesh,對於生產部署並啟用L7功能,應使用Envoy。我們可以基於官方容器鏡像創建Envoy,也可以從第三方項目getenvoy.io(進入官網獲取安裝命令)獲取一Envoy二進制包構建。
Consul需要能夠在中找到envoy
二進制文件$PATH
以自動啟動它,而無需指定二進制文件的位置。
Consul根據service definition自動定義Envoy並啟動Envoy。
邊緣節點安裝Envoy
$ curl -L https://getenvoy.io/cli | sudo bash -s -- -b /usr/local/bin #如果出現證書問題可以自己去github上下載getenvoy
##注意:首先要去查看當前Consul支持的Envoy列表!!!
$ getenvoy run standard:1.16.0 -- --version
$ sudo cp ~/.getenvoy/builds/standard/1.16.0/linux_glibc/bin/envoy /usr/local/bin/ #
$ envoy --version #檢查envoy是否正常啟動
邊緣節點安裝Consul
###CentOS###
# 使用 yum-config-manager 管理倉庫
sudo yum install -y yum-utils
# 連接倉庫
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# 安裝
sudo yum -y install consul
###Ubuntu###
# 添加 GPG key
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
# 添加 倉庫
# 如果執行后提示 apt-add-repository: command not found
# 可先安裝: apt-get install software-properties-common
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
# 更新源以及安裝 consul
sudo apt-get update && sudo apt-get install consul
注意:consul和envoy最好都要用最新版本,之前envoy1.11.1會出錯!!!出錯原因排查不出。建議在Envoy 1.15.0+上運行Consul 1.9.0
環境介紹
三台邊緣節點,節點一部署consul server,節點二部署socat及其sidecar,機器三部署web及其sidecar。
注意:consul aget啟動時候需要指定-grpc-port=8502, -https-port=8501!!!!,后續connect需要用到!!!!。
機器一部署consul,編寫配置文件
consul有個特點,啟動時候可以指定配置文件,只要配置文件寫明A服務要注冊,即使A服務不存在。
在consul目錄下創建consul.d目錄作為配置目錄,里面建兩個json文件,作為socat和web注冊配置文件。
{
"service": {
"name": "socat",
"port": 8181,
"address":"192.168.1.206",
"connect": {
"sidecar_service": {
"proxy": {
"destination_service_name": "socat",
"destination_service_id": "socat",
"local_service_address": "192.168.1.206",
"local_service_port": 8181
}
}
}
}
}
里面配置服務名是socat,所在address(官網沒寫,默認服務在consul本機上)、端口以及邊車信息,邊車代理了socat服務、邊車代理服務的IP、端口。
{
"service": {
"name": "web",
"port": 80,
"address":"192.168.1.204",
"connect": {
"sidecar_service": {
"proxy": {
"destination_service_name": "web",
"destination_service_id": "web",
"local_service_address": "192.168.1.204",
"local_service_port": 80,
"upstreams": [
{
"destination_name": "socat",
"local_bind_port": 9191
}
]
}
}
}
}
}
web.json的內容與socat大致相同,upstreams指定了邊車將會監聽9191端口,發送到192.168.1.204機器上的9191端口就會被邊車轉發到socat服務,因為邊車啟動后,和consul相連,可以獲取到socat的服務地址。
如果consul沒有啟動,通過-config-dir=./consul.d指定配置目錄;如果consul正在運行,通過consul services register添加服務。
機器二部署socat和side
socat類似於echo命令程序,會將輸入的字符串返回。
$ socat -v tcp-l:8181,fork exec:"/bin/cat" & #在后台運行socat服務
$ consul connect envoy -sidecar-for socat -admin-bind localhost:19000
#-http-addr參數指定consul服務端地址,如果沒有,默認本地(前提是本地運行有服務器模式下的consul)。端口為服務端http端口,默認8500,如果修改,使用你修改的端口。經測試client也不需要加
# 使用內置代理的話直接 consul connect proxy -sidecar-for socat
#啟動代理進程需要在另一個窗口執行,或者以后台形式運行,為了測試,我們在另一個窗口執行,以便於觀察日志信息。
#-admin-bind是envoy服務的地址,連接上游通信的數據端口是在配置文件中local_bind_port字段指定的
###如果沒有安裝netcat的話
$ wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
$ tar -zxvf download
$ mv netcat-0.7.1/ /usr/local/
$ cd /usr/local/netcat-0.7.1/
$ ./configure
$ make && make install #如果./configure報錯:configure: error: no acceptable C compiler found in $PATH,就下載yum install gcc -y來解決,完事重新執行命令即可
$ export NETCAT_HOME=/usr/local/netcat-0.7.1
$ export PATH=$PATH:$NETCAT_HOME/bin
$ nc -help #測試
$ nc 127.0.0.1 8181 #測試socat服務,注意沒有冒號!!
機器三部署web和sidecar
官網案例中,web服務並不存在,只注冊了web服務信息。這並不影響,只要啟動了web邊車,就可以通過web邊車監聽的端口與socat通信,當然web邊車控制台會報錯,因為連不上web服務,這並不影響案例進行。
$ consul connect envoy -sidecar-for web #啟動后報錯,找不到本機80端口的web服務,不影響案例
$ nc 127.0.0.1 9191 #邊車監聽的端口,轉發到socat服務
#在開始代理過程之前,請確認您無法在端口9191上連接到socat服務。以下命令應立即退出,因為在端口9191上沒有偵聽任何內容(socat在8181上偵聽)
總結
- 服務注冊、邊車代理的配置信息都在consul server端,服務和邊車幾乎沒有配置信息。
- 服務調用還是要通過邊車所監聽的端口,如果web是個真實的服務,那web編碼應該在程序中硬編碼端口,或者寫配置文件,使用http通信或者其他通信方式,也挺麻煩,畢竟現在服務網格落地的方案少,沒有太多借鑒的案例。
- 如果使用docker的話,consul命令要進入docker內部執行。
錯誤及問題匯總
- Local_bind_port是對內置proxy有效。如果使用envoy集成的話,代理端口要通過-admin-bind指定。
- consul agent -dev是開發模式,單節點下使用,如果是集群不能帶有這個選項。
- agent啟動時候-grpc-port=8502 -https-port=8501要啟動。
- check=service:socat-sidecar-proxy:1 error="dial tcp 127.0.0.1:21000: connect: connection refused",導致connect代理時候出錯。consul 啟動時候要加-hcl="connect {enabled=true}"