单节点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实践的更多相关文章

  1. 使用sklearn进行集成学习——实践

    系列 <使用sklearn进行集成学习——理论> <使用sklearn进行集成学习——实践> 目录 1 Random Forest和Gradient Tree Boosting ...

  2. fir.im weekly - 「 持续集成 」实践教程合集

    我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...

  3. 基于Armitage的MSF自动化集成攻击实践

    基于Armitage的MSF自动化集成攻击实践 目录 0x01 实践环境 0x02 预备知识 0x03 Armitage基础配置 0x04 Nmap:Armitage下信息搜集与漏洞扫描 0x05 A ...

  4. 自动化打包资源混淆集成python实践----资源混淆

    前面自动化打包资源混淆集成python实践----打包一文讲述了四种打包方案,以及美团打包方案.apk注释添加渠道号方案的实现.这里讲集成资源混淆. 1.资源混淆带来的好处: 1)对资源文件起一定的保 ...

  5. Apache DolphinScheduler 的持续集成方向实践

    今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...

  6. fir.im 持续集成技术实践

    互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...

  7. 一个Web 持续集成工作实践

    一个web的持续基础实践: https://mp.weixin.qq.com/src=3&timestamp=1494325174&ver=1&signature=wFVC0E ...

  8. 视频云SDK iOS持续集成项目实践

    1. 前言 2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本, 经历了最初痛苦的全手动版本构建和维护, 到后来慢 ...

  9. Jenkins多环境持续集成架构实践

    自动化部署主要是为了解决项目多.环境多.持续集成慢.部署操作麻烦.手动操作易出错.自动化运维等问题. Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化 ...

随机推荐

  1. Java(6)集合

    一.Java集合框架概述 1.什么是集合 集合框架:用于存储数据的容器. 数组.集合等存储数据的结构,叫Java容器. 此时的存储,是指内存层面的存储,不涉及持久化的存储. 任何集合框架都包含三大块的 ...

  2. H5系列之contenteditable

    其实这个属性很简单,既然把它放到一个单独的文章来说,他肯定有一些注意点要讲 兼容性很好,兼容所有主流浏览器. 用法很简单,只需要给你需要的标签填上即可. <div contenteditable ...

  3. jQuery 第六章 实例方法 动画

    .show() .hide() .toggle() .fadeIn() .fadeout() .fadeToggle() .fadeTo() .slideDown() .slideUp() .slid ...

  4. iOS7使用iOS8上的方法报错处理

    问题描述 我们经常会遇到在低版本上使用高版本方法导致的bug,例如: WebKit discarded an uncaught exception in the webView:decidePolic ...

  5. 基于gin的golang web开发:docker

    Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...

  6. Contest 985

    A 均移到黑色或白色即可. 时间复杂度 \(O\left(n\log n\right)\). B 枚举每种开关判断是否有灯只能靠该种开关控制. 时间复杂度 \(O\left(nm\right)\). ...

  7. Java基础教程——线程池

    启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...

  8. 编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  9. 20191209_Centos7.2使用yum安装mysql

    1. 下载mysql的rpm包 [root@izwz91qnvovd6suufon1ccz ~]# wget http://dev.mysql.com/get/mysql57-community-re ...

  10. scentos7安装redis,以及redis的主从配置

    redis的安装 下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 解压压缩包 tar -zxvf redis- ...