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.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实践的更多相关文章
- 使用sklearn进行集成学习——实践
系列 <使用sklearn进行集成学习——理论> <使用sklearn进行集成学习——实践> 目录 1 Random Forest和Gradient Tree Boosting ...
- fir.im weekly - 「 持续集成 」实践教程合集
我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...
- 基于Armitage的MSF自动化集成攻击实践
基于Armitage的MSF自动化集成攻击实践 目录 0x01 实践环境 0x02 预备知识 0x03 Armitage基础配置 0x04 Nmap:Armitage下信息搜集与漏洞扫描 0x05 A ...
- 自动化打包资源混淆集成python实践----资源混淆
前面自动化打包资源混淆集成python实践----打包一文讲述了四种打包方案,以及美团打包方案.apk注释添加渠道号方案的实现.这里讲集成资源混淆. 1.资源混淆带来的好处: 1)对资源文件起一定的保 ...
- Apache DolphinScheduler 的持续集成方向实践
今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...
- fir.im 持续集成技术实践
互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...
- 一个Web 持续集成工作实践
一个web的持续基础实践: https://mp.weixin.qq.com/src=3×tamp=1494325174&ver=1&signature=wFVC0E ...
- 视频云SDK iOS持续集成项目实践
1. 前言 2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本, 经历了最初痛苦的全手动版本构建和维护, 到后来慢 ...
- Jenkins多环境持续集成架构实践
自动化部署主要是为了解决项目多.环境多.持续集成慢.部署操作麻烦.手动操作易出错.自动化运维等问题. Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化 ...
随机推荐
- Math.floor(Math.random() * array.length),splice
1.Math.floor(Math.random() * array.length) 返回长度内的索引 eg: changeLimit () { function getArrayItems(arr, ...
- 巧妙使用MindManager图像功能,能够让你的思维导图更精彩
MindManager是一款多功能思维导图工具软件,有其他软件无法媲美的项目管理和商业规划高级功能.用户们制作思维导图时一定要注意图文并茂,单纯的文字会过于单调.所以接下来,小编就为大家详细介绍Min ...
- 在FL Studio中如何制作和优化你的人声和弦(Vocal Chords)
人声和弦在Future Bass.Melodic Dubstep等类型的电子音乐中被常用.与一般的和弦相同,其主要起到为主旋律做铺垫的效果,但是人声和弦加入了人声的因素,可以使得和弦更有趣,更有电子音 ...
- 文件误删了怎么办,EasyRecovery来帮忙
哈喽大家好!又到了年底冲业绩的时候了,每逢这个时候,收拾自己的电脑就和收拾放假一样,令人头秃,不是这个文件丢了,就是那个数据没了,不管您是为论文头秃发愁的学生,还是朝九晚五的上班族,又或者是日进斗金的 ...
- 如何正确地安装MathType 7?
作为一名资深的公式编辑器用户,在新版本MathType 7上线的第一时间,已经去体验了一把.那么要如何正确地安装呢?下面就来详细地介绍下它的安装方法. 步骤一 双击下载好的应用程序,就可以开始安装软件 ...
- 有什么好用的Mac数据恢复软件
对于第一次上手苹果电脑的人来说,使用起来难免有点小难受,因为对苹果电脑操作系统不熟练,发生误删数据的事情也是屡见不鲜. 那么对于这种情况我们该怎么办呢?不用担心,今天小编就为大家推荐一款好用的苹果数据 ...
- 怎么用MindManager自带的模板和设计画思维导图
小编知道大家平时工作学习都很忙,思维导图能完成的效率越高越好.所以今天,小编就为大家介绍两个能高效使用思维导图软件完成制作思维导图的小技巧.保证内容充实美观,还不费时间. 一.使用模板 打开MindM ...
- [python学习手册-笔记]003.数值类型
003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...
- Java基础教程——二维数组
二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...
- std::unique_ptr使用incomplete type的报错分析和解决
Pimpl(Pointer to implementation)很多同学都不陌生,但是从原始指针升级到C++11的独占指针std::unique_ptr时,会遇到一个incomplete type的报 ...