背景
服务网格解决方案Istio的架构从逻辑上分为数据平面和控制平面。
-
数据平面 由一组智能代理(Envoy)组成,被部署为 边车。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。
-
控制平面 管理并配置代理来进行流量路由。
其中控制面与数据面之间的通信协议为 XDS (X Discovery Service)
,其中x
代表其他单一类型资源的API,如LDS(Listener DS),RDS(Router DS),CDS(Cluster DS)等。
XDS通信协议API由Envoy提出,用于实现其动态配置,来应对不断变化的基础架构。
在通过XDS进行不同单一类型资源配置时,存在顺序一致性上的问题,可能导致部分临时流量的丢失。
因此Envoy又推出了ADS (Aggregated Discovery Service)
,ADS 允许单一管理服务器通过单个 gRPC 流,提供所有的 API 更新。配合仔细规划的更新顺序,ADS 可规避更新过程中流量丢失。
本文就服务网格Istio中如何与Envoy进行XDS协议通信为主体内容进行讲解。
go-control-plan项目
项目go-control-plane是Envoy基于Go语言实现的服务发现API工程
。
项目中提供了两个库:
-
API服务: 基于GRPC实现了
xDS API
的服务端,该服务负责推送、更新Envoy配置。 -
配置缓存: 为了能够快速响应Envoy请求,代码库会在内存中缓存一份Envoy配置。
样例
Envoy在其github源码仓库提供了一个xDS Server
的样例,本节进行讲解。
源码修改
由于测试网络限制,对部分源码进行修改:
编译与运行
运行命令为make example
,为了方便查看日志,将envoy
与xDS Server
两个进程运行分成两个命令。
xDS Server
编译二进制:
go build -race -o bin/example internal/example/main/main.go
运行xDS Server
:
其中打印的部分配置缓存json内容如下:
启动之后,xDS Server
阻塞在监听端口18000
上,等待请求的连接。
envoy
启动配置文件部分释义如下:
# sample/bootstrap-xds.yaml
admin:
address:
socket_address:
address: 127.0.0.1
port_value: 19000 # envoy admin端口为19000
dynamic_resources: # 动态资源配置(xds配置)
cds_config: # cds
api_config_source:
api_type: GRPC # GRPC通信方式
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster # xDS Server集群名称为'xds_cluster'
lds_config: # lds
# ......
cluster_name: xds_cluster
node:
id: test-id # envoy本机信息ID
static_resourc