边缘集群环境下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}"