首页 > 其他 > 详细

Consul集成Envoy实践

时间:2020-12-13 23:52:27      阅读:105      评论:0      收藏:0      [点我收藏+]

单节点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.11.1 -- --version

$ sudo cp ~/.getenvoy/builds/standard/1.11.0/linux_glibc/bin/envoy /usr/local/bin/ #

$ envoy --version #检查envoy是否正常启动

注册服务和sidecar代理

注册服务有很多种方式:

  • 通过配置文件(consul启动时加载)
  • 使用HTTP API
  • 使用CLI命令——consul service register

demo结构图:

技术分享图片

创建counting service配置文件counting.hcl
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"
  }
}
创建dashboard service配置文件 dashboard.hcl
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服务。

启动服务和Sidecar代理

? 现在已经创建了描述服务连接的所有必要配置,启动我们的服务,服务代码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 envoy命令

? Consul connect 使用TLS提供服务到服务的连接授权和加密。应用程序可以在服务网格配置中使用sidecar代理来为入站和出站建立TLS连接,而根本不知道connect。connect支持异构代理部署:任何两个代理实现都可以通信,任何服务实例都可以运行任何代理实现。

? 该命令用于为Envoy代理生成引导配置,通过该配置,它执行一个外部Envoy 二进制文件,使Envoy进程在前台运行。

Envoy Options for both Sidecars and Gateways

-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代理选项

-sidecar-for:目标服务不必存在于本地代理。

Envoy整合

? Envoy代理需要两种配置类型:初始引导程序配置和从“管理服务器”(在本例子中为Consul)中发现的动态配置。

? Consul connect为每个Envoy实例提供的动态配置包括:

  • TLS证书和密钥
  • 通过intentions强制服务到服务的授权规则
  • 上游的服务发现使每个Sidecar代理能够进行负载
  • L7配置
  • 暴露详细的HTTP路径
引导程序配置

? 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集成Envoy实践

环境介绍

? 三台边缘节点,节点一部署consul server,节点二部署socat及其sidecar,机器三部署web及其sidecar。

机器一部署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和sidecar

? 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和sidecar

? 官网案例中,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通信或者其他通信方式,也挺麻烦,毕竟现在服务网格落地的方案少,没有太多借鉴的案例。

Consul集成Envoy实践

原文:https://www.cnblogs.com/yrxing/p/14130962.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!