集群环境下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}"
posted @ 2020-12-13 23:06  尹瑞星  阅读(1642)  评论(0编辑  收藏  举报