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个插件来支持构建.部署.自动化 ...
随机推荐
- PHP一些不一样的思路
大多数来自p牛 SQL注入(left join) 源代码 <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_se ...
- python-网络安全编程第二天(文件操作)
前言 才吃完火锅嘿嘿,吃完把今天所学的内容写个博客当做笔记用哈哈! 文件操作 f=open("test.txt",w)直接打开一个文件,如果文件不存在则创建文件open模式w:以写 ...
- 实验吧[WEB]——what a fuck!这是什么鬼东西?
解题链接:http://ctf5.shiyanbar.com/DUTCTF/1.html 原题链接:http://www.shiyanbar.com/ctf/56 解题必看: 的jother编码定义: ...
- java8新特性LocalDate、LocalTime、LocalDateTime的学习
以前操作时间都是使用SimpleDateFormat类改变Date的时间格式,使用Calendar类操作时间.但是SimpleDateFormat是线程不安全的,源码如下: private Strin ...
- 2020阿里,字节跳动,JAVA岗(一线企业校招、社招)面试题合集
前言 以下面试题全属于一线大厂社招以及校招的面试真题,各位在做这些题目对照自己的时候请平凡心对待,不要信心受挫.其实 做为致力于一线企业校招或者社招的你来说,能把每个知识模块的一小部分问题去深入学习和 ...
- 「CSP-S 2019」Emiya 家今天的饭
description loj 3211 solution 看到题目中要求每种主要食材至多在一半的菜中被使用,容易想到补集转换. 即\(ans=\)总方案数-存在某一种食材在一半以上的菜中被使用的方案 ...
- 统计API调用次数
使用redis的有序集合, Zincrby https://redis.io/commands/zincrby 使用的symfony框架的这个方法,会返回接口名称 $request->getPa ...
- YoyoGo微服务框架入门系列-基本概念
前言 Github开源:github.com/yoyofx/yoyogo 还请多多Star 之前简单介绍了YoyoGo微服务框架的基本内容,接下来了解下框架中的基本概念. 从一个简单Web服务Demo ...
- 通过PHPExcel将Excel表文件中数据导入数据库
1 <?php 2 header("Content-Type:text/html;charset=utf-8"); 3 include_once 'PHPExcel.php' ...
- 使用Python开发鸿蒙设备程序(0-初体验)
到目前为止,鸿蒙设备开发的"官方指定语言"还是C语言! 这看起来是一件正常的事,毕竟鸿蒙设备开发还是属于嵌入式开发的范畴,而在嵌入式开发中C语言又是当之无愧的首选,所以,大家也都接 ...