? Consul Service Mesh通过授权和加密来保护服务之间的通信,还可以拦截有关服务到服务通信的数据并将其呈现给监视工具。我们可以使用Consul随附的内置代理测试Consul Service Mesh,对于生产部署并启用L7功能,应使用Envoy。我们可以基于官方容器镜像创建Envoy,也可以从第三方项目getenvoy.io(进入官网获取安装命令)获取一Envoy二进制包构建。Consul需要能够在中找到envoy
二进制文件$PATH
以自动启动它,而无需指定二进制文件的位置。
? Consul根据service definition自动定义Envoy并启动Envoy。
$ curl -L https://getenvoy.io/cli | sudo bash -s -- -b /usr/local/bin #如果出现证书问题可以自己去github上下载getenvoy
注意:首先要去查看当前Consul支持的Envoy列表!!!
$ getenvoy run standard:1.11.1 -- --version
$ sudo cp ~/.getenvoy/builds/standard/1.11.0/linux_glibc/bin/envoy /usr/local/bin/ #
$ envoy --version #检查envoy是否正常启动
注册服务有很多种方式:
demo结构图:
service {
name = "counting"
id = "counting-1"
port = 9003
connect {
sidecar_service {}
}
check {
id = "counting-check"
http = "http://localhost:9003/health"
method = "GET"
interval = "1s"
timeout = "1s"
}
}
service {
name = "dashboard"
port = 9002
connect {
sidecar_service {
proxy {
upstreams = [
{
destination_name = "counting"
local_bind_port = 5000
}
]
}
}
}
check {
id = "dashboard-check"
http = "http://localhost:9002/health"
method = "GET"
interval = "1s"
timeout = "1s"
}
}
? 上游是将被代理到目标服务的本地主机上的端口,local_bind_port值是您的服务将与之通信以达到您所依赖的服务的端口。即当dashboard服务连接到localhost:5000时,它将跨服务网格代理到计数服务。
$ consul services register counting.hcl
$ counsul services register dashboard.hcl
$ consul catalog services
consul
counting
counting-sidecar-proxy
dashboard
dashboard-sidecar-proxy
此时会自动注册*-sidecar-proxy服务。
? 现在已经创建了描述服务连接的所有必要配置,启动我们的服务,服务代码demo-consul-101项目。
$ PORT=9002 COUNTING_SERVICE_URL="http://localhost:5000" ./dashboard-service &
$ PORT=9003 ./counting-service &
$ consul connect envoy -sidecar-for counting-1 -admin-bind localhost:19001 > counting-proxy.log & #启动Envoy sidecar代理
$ consul connect envoy -sidecar-for dashboard > dashboard-proxy.log & #启动dashboard service的Envoy sidecar代理
注意:该-sidecar-for
参数使用领事服务ID,而不是一个服务名称!!!!
此时打开http://localhist:9002即可访问服务。
? Consul connect 使用TLS提供服务到服务的连接授权和加密。应用程序可以在服务网格配置中使用sidecar代理来为入站和出站建立TLS连接,而根本不知道connect。connect支持异构代理部署:任何两个代理实现都可以通信,任何服务实例都可以运行任何代理实现。
? 该命令用于为Envoy代理生成引导配置,通过该配置,它执行一个外部Envoy 二进制文件,使Envoy进程在前台运行。
-proxy-id:代理服务ID
-envoy-binary:要执行特定Envoy二进制文件的完整路径。默认情况下$PATH将搜索envoy
-admin-bind:绑定envoy的管理HTTP API。默认值localhost:19000。envoy要求启用此功能。如果要在同一主机上运行多个不同的代理实例,这个选项在除了第一个实例之外的所有实例使用,确保他们不会绑定到同一端口。
$ consul connect envoy -sidecar-for db -admin-bind localhost:19001
-bootstrap:该命令将以json protobuf形式生成的引导程序配置输出到stdout,可以将其定向到文件,来启动Envoy。
-envoy-version:默认值1.16.0,这是必须的,以便可以生成正确配置
-sidecar-for:目标服务不必存在于本地代理。
? Envoy代理需要两种配置类型:初始引导程序配置和从“管理服务器”(在本例子中为Consul)中发现的动态配置。
? Consul connect为每个Envoy实例提供的动态配置包括:
? Envoy需要初始引导程序配置文件。
? Consul根据对集群的了解自动生成Envoy的动态配置。用户可以为每个服务指定默认配置选项,例如协议等。Consul将使用此信息为该服务的代理以及任何下游服务的上游侦听器配置适当的代理。
? 这些字段也可以在代理服务定义中显示覆盖,或在全局proxy-defaults配置条目中定义为用作所有服务继承的默认值。
-protocol:服务使用的协议,支持tcp/http/http2/grpc
-bind_address:覆盖Envoy的公共监听器绑定到的地址。默认Envoy绑定到服务地址,如果服务注册上没有显示地址,则绑定到0.0.0.0
-bind_port:覆盖Envoy的公共监听器绑定的端口。默认绑定到服务端口
-local_connect_timeout_ms:超时之前允许与本地应用程序实例建立连接的毫秒数。
? 在代理服务定义或proxy.upstreams[].config字段中,可以直接覆盖以下配置项。
-protocol
-connect_timeout_ms
-limits
-passive_health_check
-connect_timeout_ms:在超时之前进行上游连接时允许的毫秒数。
-envoy_gateway_bind_tagged_address
-envoy_gateway_bind_address
-envoy_gateway_no_default_bind
-envoy_dns_discovery_bind
-envoy_dns_discovery_type
? 所有配置都指定为包含Envoy配置类型的序列化proto2 json字符串
? 三台边缘节点,节点一部署consul server,节点二部署socat及其sidecar,机器三部署web及其sidecar。
? 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类似于echo命令程序,会将输入的字符串返回。
$ socat -v tcp-l:8181,fork exec:"/bin/cat" &#在后台运行socat服务
###如果没有安装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服务,注意没有冒号!!
$ consul connect envoy -http-addr=192.168.1.206:8501 -sidecar-for socat #-http-addr参数指定consul服务端地址,如果没有,默认本地。
? 官网案例中,web服务并不存在,只注册了web服务信息。这并不影响,只要启动了web边车,就可以通过web边车监听的端口与socat通信,当然web边车控制台会报错,因为连不上web服务,这并不影响案例进行。
$ consul connect envoy -http-addr=192.168.1.206:8501 -sidecar-for web #启动后报错,找不到本机80端口的web服务,不影响案例
$ nc 127.0.0.1 9191 #边车监听的端口,转发到socat服务
? 服务注册、边车代理的配置信息都在consul server端,服务和边车几乎没有配置信息。
? 服务调用还是要通过边车所监听的端口,如果web是个真实的服务,那web编码应该在程序中硬编码端口,或者写配置文件,使用http通信或者其他通信方式,也挺麻烦,毕竟现在服务网格落地的方案少,没有太多借鉴的案例。
原文:https://www.cnblogs.com/yrxing/p/14130962.html