集群環境下Consul集成Envoy實踐


邊緣集群環境下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}"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM