美文网首页
Envoy 动态配置 -2

Envoy 动态配置 -2

作者: 程序员札记 | 来源:发表于2023-02-25 09:34 被阅读0次

七、基于文件系统的订阅

为Envoy提供动态配置的最简单方法是将其放置在ConfigSource中显式指定的文件路径中

1)Envoy将使用inotify(Mac OS X上的kqueue)来监视文件的更改,并在更新时解析文件中的DiscoveryResponse 报文 2)二进制protobufs,JSON,YAML和proto文本都是DiscoveryResponse 所支持的数据格式

提示 1)除了统计计数器和日志以外,没有任何机制可用于文件系统订阅ACK/NACK更新 2)若配置更新被拒绝,xDS API的最后一个有效配置将继续适用

1、基于eds实现Envoy基本全动态的配置方式

以EDS为例,Cluster为静态定义,其各Endpoint通过EDS动态发现

集群定义格式

# Cluster中的endpoint配置格式

clusters: - name:
  ...
  eds_cluster_config:
    service_name:
    eds_config:
      path: ... # ConfigSource,支持使用path, api_config_source或ads三者之一;

cluster的配置


# 类似如下纯静态格式的Cluster定义
clusters: - name: webcluster
 connect_timeout: 0.25s
 type: STATIC #类型为静态
 lb_policy: ROUND_ROBIN
 load_assignment:
   cluster_name: webcluster
   endpoints: - lb_endpoints: - endpoint:
       address:
         socket_address:
           address: 172.31.11.11 port_value: 8080 #使用了EDS的配置
clusters: - name: targetCluster
 connect_timeout: 0.25s
 lb_policy: ROUND_ROBIN
 type: EDS #类型为EDS
 eds_cluster_config:
   service_name: webcluster
   eds_config:
     path: '/etc/envoy/eds.yaml' # 指定订阅的文件路径

提示:文件后缀名为conf,则资源要以json格式定义;文件后缀名为yaml,则资源需要以yaml格式定义;另外,动态配置中,各Envoy实例需要有惟的id标识;

EDS的配置

1)文件/etc/envoy/eds.yaml中以Discovery Response报文的格式给出响应实例,例如,下面的 配置示例用于存在地址172.31.11.11某上游服务器可提供服务时

  1. 响应报文需要以JSON格式给出
resources: - "@type": type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment
    cluster_name: webcluster
    endpoints: - lb_endpoints: - endpoint:
        address:
          socket_address:
            address: 172.31.11.11 port_value: 8080

随后,修改该文件,将172.31.11.12也添加进后端端点列表中,模拟配置变动

- endpoint:
        address:
          socket_address:
            address: 172.31.11.12 port_value: 8080

2、基于lds和cds实现Envoy基本全动态的配置方式

1)各Listener的定义以Discovery Response 的标准格式保存于一个文件中。

  1. 各Cluster的定义同样以Discovery Response的标准格式保存于另一文件中。

如下面Envoy Bootstrap配置文件示例中的文件引用

node: id: envoy_front_proxy 
  cluster: MageEdu_Cluster

admin:
  profile_path: /tmp/envoy.prof 
  access_log_path: /tmp/admin_access.log
  address: 
    socket_address: 
      address: 0.0.0.0 port_value: 9901 dynamic_resources:
  lds_config:
    path: /etc/envoy/conf.d/lds.yaml 
  cds_config: 
    path: /etc/envoy/conf.d/cds.yaml 

lds的Discovery Response格式的配置示例如下

resources: - "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  name: listener_http
  address: 
    socket_address: { address: 0.0.0.0, port_value: 80 }
  filter_chains: - filters:
    name: envoy.http_connection_manager
    typed_config: "@type":type.googleapis.com/envoy.extensions.filters.network.http_connection_manag
er.v3.HttpConnectionManager
      stat_prefix: ingress_http
      route_config:
        name: local_route 
        virtual_hosts: - name: local_service
          domains: ["*"]
          routes: - match:
              prefix: "/" route:
              cluster: webcluster
      http_filters: - name: envoy.filters.http.router

cds的Discovery Response格式的配置示例如下

resources: - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
  name: webcluster
  connect_timeout: 1s
  type: STRICT_DNS
  load_assignment:
  cluster_name: webcluster
    endpoints: - lb_endpoints: - endpoint:
          address: 
            socket_address: 
              address: webserver01
              port_value: 8080
      - endpoint:
          address: 
            socket_address: 
              address: webserver02
              port_value: 8080

 

八、基于gRPC的动态配置

1、gRPC的介绍

1)、Enovy支持为每个xDS API独立指定gRPC ApiConfigSource,它指向与管理服务器对应的某 上游集群。

(1)这将为每个xDS资源类型启动一个独立的双向gRPC流,可能会发送给不同的管理服务器
(2)每个流都有自己独立维护的 资源版本,且不存在跨资源类型的共享版本机制;
(3)在不使用ADS的情况下,每个资源类型可能具有不同的版本,因为Envoy API允许指向不同的 EDS/RDS资源配置并对应不同的ConfigSources

image.png

2)、API的交付方式采用最终一致性机制。

2、基于gRPC的动态配置格式

以LDS为例,它配置Listener以动态方式发现和加载,而内部的路由可由发现的Listener直接 提供,也可配置再经由RDS发现。

下面为LDS配置格式,CDS等的配置格式类同:

dynamic_resouces:
lds_config:
api_config_source:
api_type: ... # API 可经由REST或gRPC获取,支持的类型包括REST、gRPC和delta_gRPC
resource_api_version: ... # xDS 资源的API版本,对于1.19及之后的Envoy版本,要使用v3;
rate_limit_settings: {...} # 速率限制
grpc_services: # 提供grpc服务的一到多个服务源
transport_api_version : ... # xDS 传输协议使用的API版本,对于1.19及之后的Envoy版本,要使用v3;
envoy_grpc: # Envoy内建的grpc客户端,envoy_grpc和google_grpc二者仅能用其一;
cluster_name: ... # grpc集群的名称;
google_grpc: # Google的C++ grpc客户端
timeout: ... # grpc超时时长;

注意:
提供gRPC API服务的Management Server (控制平面)也需要定义为Envoy上的集群, 并由envoy实例通过xDS API进行请求;
(1)通常,这些管理服务器需要以静态资源的格式提供;
(2)类似于,DHCP协议的Server 端的地址必须静态配置,而不能经由DHCP协议获取;

3、基于GRPC管理服务器订阅

基于gRPC的订阅功能需要向专用的Management Server请求配置信息。

下面的示例配置使用了lds和cds 分别动态获取Listener和Cluster相关的配置。

node: id: envoy_front_proxy 
  cluster: webcluster

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0 port_value: 9901 dynamic_resources: 
  lds_config:  #定义动态获取listener
    resource_api_version: V3
    api_config_source:
      api_type: GRPC  #使用GRPC模式
      transport_api_version: V3
      grpc_services: - envoy_grpc:
        cluster_name: xds_cluster #调用grpc服务器

  cds_config: #定义动态获取cluster
    resource_api_version: V3
    api_config_source:
      api_type: GRPC  #使用GRPC模式
      transport_api_version: V3
      grpc_services: - envoy_grpc:
        cluster_name: xds_cluster #调用grpc服务器

#xds_cluster需要静态配置
static_resources:
  clusters: - name: xds_cluster
      connect_timeout: 0.25s
      type: STRICT_DNS
      # Used to provide extension-specific protocol options for upstream connections. 
      typed_extension_protocol_options: 
        envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions 
           explicit_http_config:
           http2_protocol_options: {}
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: xds_cluster
        endpoints: - lb_endpoints: - endpoint:
              address:
                socket_address:
                  address: xdsserver-IP
                  port_value: 18000

4、ADS

通过上面的交互顺序保证MS资源分发时的流量丢弃是一项很有挑战的工作,而ADS允许单 一MS通过单个gRPC流提供所有的API更新。

1)配合仔细规划的更新顺序,ADS可规避更新过程中流量丢失
2)使用 ADS,在单个流上可通过类型 URL 来进行复用多个独立的 DiscoveryRequest/DiscoveryResponse 序列

image.png

使用了ads分别动态获取Listener和Cluster相关的配置

node: id: envoy_front_proxy 
  cluster: webcluster

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0 port_value: 9901 dynamic_resources:
  ads_config:
    api_type: GRPC
    transport_api_version: V3
    grpc_services: - envoy_grpc:
      cluster_name: xds_cluster
      set_node_on_first_message_only: true cds_config:
    resource_api_version: V3
    ads: {}
    lds_config:
      resource_api_version: V3
      ads: {}

 #xds_cluster需要静态配置
static_resources:
  clusters: - name: xds_cluster
      connect_timeout: 0.25s
      type: STRICT_DNS
      # Used to provide extension-specific protocol options for upstream connections. 
      typed_extension_protocol_options: 
        envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions 
           explicit_http_config:
           http2_protocol_options: {}
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: xds_cluster
        endpoints: - lb_endpoints: - endpoint:
              address:
                socket_address:
                  address: xdsserver-IP
                  port_value: 18000

九、REST-JSON轮询订阅

1、REST-JSON介绍

1)、通过REST端点进行的同步(长)轮询也可用于xDS单例API

2)、上面的消息顺序是类似的,除了没有维护到管理服务器的持久流

3)、预计在任何时间点只有一个未完成的请求,因此响应nonce在REST-JSON中是可选的 p proto3的JSON规范转换用于编码DiscoveryRequest和DiscoveryResponse消息。

4)、ADS不适用于REST-JSON轮询

5)、当轮询周期设置为较小的值时,为了进行长轮询,则还需要避免发送DiscoveryResponse ,除 非发生了对底层资源的更改

2、以LDS为例,它用于发现并配置Listener

基于REST订阅的LDS配置格式,CDS等其它配置类似

dynamic_resources:
  lds_config:
  resource_api_version: … # xDS 资源配置遵循的API版本,v1.19版本及以后仅支持V3 ;
  api_config_source:
    transport_api_version: ... # xDS 传输协议中使用API版本,v1.19版本及以后仅支持V3;
    api_type: ... # API 可经由REST或gRPC获取,支持的类型包括REST、GRPC和DELTA_GRPC
    cluster_names: ... # 提供服务的集群名称列表,仅能与REST类型的API一起使用;多个集群用于冗余之目的,故障时将循环访问;
    refresh_delay: ... # REST API 轮询时间间隔;
    request_timeout: ... # REST API请求超时时长,默认为1s;

注意:提供REST API服务的管理服务器也需要定义为Envoy上的集群,并由LDS等相关 的动态发现服务进行调用;但这些管理服务器需要以静态配置的格式提供;

3、基于REST管理服务器订阅

使用了ads分别动态获取Listener和Cluster相关的配置

node: id: envoy_front_proxy
  cluster: webcluster

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0 port_value: 9901 dynamic_resources:
  cds_config:
    resource_api_version: V3
    api_config_source:
      api_type: REST
      transport_api_version: V3 refresh_delay: {nanos: 500000000} # 1/2s cluster_names: - xds_cluster

  lds_config:
    resource_api_version: V3
    api_config_source:
    api_type: REST
      transport_api_version: V3 refresh_delay: {nanos: 500000000} # 1/2s cluster_names: - xds_cluster

相关文章

  • Envoy 动态配置 -2

    七、基于文件系统的订阅 为Envoy提供动态配置的最简单方法是将其放置在ConfigSource中显式指定的文件路...

  • envoy ads配置

    基于envoy ads的动态配置服务发现,直接上代码。 go.mod文件 envoy yaml配置文件: 参考ht...

  • envoy动态配置

    动态资源,是指由envoy通过xDS协议发现所需要的各项配置的机制,相关的配置信息保存 于称之为管理服务器(Man...

  • envoy动态配置 - 3

    实验案例1、cluster-static-dns-discovery实验环境 三个Service: envoy:F...

  • envoy

    envoy安装 静态配置

  • Envoy 学习笔记之创建 EDS 动态配置

    本文档第一部分介绍一下 Envoy v2 API,第二部分给出了一个 Java 编写的简陋 EDS Server ...

  • envoy 静态配置

    纯静态资源配置方式主是直接在配置文件中通过static_resources配置参数明确定义listeners、 c...

  • Envoy 运维调试

    统计信息分类 Envoy 的主要目标之一是使网络易于理解。 Envoy 会发出大量其配置方式的统计信息。 通常,统...

  • envoy 架构与配置

    概述 Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,它是Istio中的Sid...

  • envoy静态配置实例

    提示:为便于建立测试环境,示例将以 docker-compose工具编排运行,相关的代码位于 [https://g...

网友评论

      本文标题:Envoy 动态配置 -2

      本文链接:https://www.haomeiwen.com/subject/hksfldtx.html