envoy

envoy

开源的云原生代理,用于处理微服务之间的通信和流量管理。它支持负载均衡、故障恢复、安全认证等功能。envoy 通常用作服务网格的一部分,例如在Kubernetes集群中

在负载均衡层面可实现比nginx更完善,更高级的功能,但使用成本也更复杂

特性

  • 性能:提供极高的吞吐量和低尾延迟差异,同时消耗相对较少的cpu和内存
  • 可扩展性:在L4、L7上提供丰富的可插拔过滤器功能,允许用户轻松添加新功能
  • api动态可配置性: 提供一组可由控制平面服务显示的管理api,这些配置API可以从多个不同的配置服务获取,也可以由1个统一的配置服务提供配置
    • 如果控制平面实现了所有api,则可使用通过引导配置在整个基础架构中运行envoy,所有进一步的配置更改都可以用管理服务器进行动态传递,使envoy无需重启,也使envoy成为通用的数据平面(lstio、ambassador、gloo都使用),与其他控制平面结合时,降低复杂度
      • DS API:LDS、RDS、CDS、SDS等
      • XDS API

常用术语

  • 主机:具备网络通信的端点,如服务器
  • 集群:envoy连接到的1组逻辑上相似的端点,在v2中,rds通过路由指向集群,cds提供集群配置,通过eds发现集群成员,即端点
  • 下游:客户端连接到envoy,发送请求并接收响应,
  • 上游:接收来自envoy的连接和请求并返回响应,envoy代理的后端服务器
  • 端点:上游主机,是1个或多个集群的成员,可通过eds发现
  • 侦听器:侦听器是可以由下游客户端连接的命名网络位置,如端口、unix套接字等
  • 位置(locality):上游端点运行的区域拓扑,包括地域、区域和子区域等
  • 管理服务器(management server):实现v2 api的服务器,支持复制和分片,且能够在不同的物理机器上实现针对不同XDS API的api服务
  • 地域(region):区域所属地理位置
  • 区域(zone):aws中的可用区(az)或gcp中的区域等
  • 子区域:envoy实例或端点运行的区域内的位置,用于支持区域内的多个负载均衡目标
  • xds:ces、eds、hds、lds、rls(rate limit)、rds、sds、vhds、rtds等api的统称
  • mesh和envoy mesh

架构

3个核心组件:

  • 侦听器(listener)
  • 过滤器链(filter chains),定义在侦听器上
  • 集群管理器(cluster manage)

线程模型:

使用单进程、多线程的模型,一个主线程负责实现各类管理任务,工作线程负责执行监听、过滤等代理服务器的核心功能

3个线程:

  • 主线程:envoy程序启动和关闭、xds api调用处理(包括dns、健康状态监测、集群管理等)、运行时配置、统计数据刷新、管理接口维护、其他线程管理(信号、热重启等)。所有事件都以异步非阻塞模式完成
  • 工作线程:默认情况下,envoy根据当前cpu数启动工作线程,可通过--concurrency指定线程数。每个线程运行非阻塞事件循环,负责为每个侦听器监听指定的套接字、接受新请求、为每个连接初始化一个过滤器栈并处理此连接的所有事件
  • 文件读写线程:envoy写入的每个文件都有一个专用、独立的阻塞型刷写线程,写入文件时,数据被移到内存缓冲区,用文件刷写线程同步到文件

数据流向

客户端发起请求,访问listener,经过filter chains过滤后,到达cluster manager(envoy内部将后端成为cluster,类似ngx的upstream中定义的server),cluster manager将请求交给适配的cluster处理(filter chains中必须定义这个请求由哪个cluster组处理,也就是请求路由)

cluster manage可以动态加载配置cluster,需要使用控制平面(lstio)配置,然后cluster管理器去控制平面加载配置,或控制平面下发配置,这个流程就是XDS

image-20230812232747157

XDS api:

后面单独写

版本:

v1版仅使用json、rest
v2版是v1的升级,使用proto3,同时支持grpc、rest、json、yaml端点实现
v3版支持start_tls、拒绝传入的tcp连接、4096位的tls秘钥、skywalking和wasm等

XDS协议用于连接上层的控制平面服务,envoy可连接多个上层控制平面,且可以发现多种内容,如:RDS(路由服务发现)

客户端请求时,如访问监听器0,经过过滤后路由到cluster_0组,而通过XDS协议动态发现eds(后端实际处理的端口),而多个eds可以包含到一个cluster_0组内

image-20230812233626014

配置:

启动时必须加载配置文件做初始化设置,在启用全动态配置机制后,只有极少数情况采用重新启动
允许静态配置,但动态更合适

动态配置:
  • xds api:从配置文件加载、从管理服务器加载
  • runtime:新特性保存为kv数据、支持多层配置和覆盖

envoy部署:

代理类型(部署类型):

边缘代理

流量总入口(gw),与网格中部署为ingress部分的envoy做流量转发

网格

通常以容器编排系统为底层环境的服务网格中,并以sidecar形式与主进程容器同属于一个pod中
非编排系统环境中,可以将主程序与envoy运行于同一个容器,或手动组织主程序容器与envoy容器共享同一个网络命名空间

ingress:代理入站流量,为业务容器提供代理。路由部分比egress简单,侧重于观测、安全部分
egress:代理出站流量,为业务容器提供代理。流量治理、安全、
external:代理网格外部流量,非envoy管理的部分,可选

image-20230815170751364

运行:

文档:https://www.envoyproxy.io/docs/envoy/v1.28.0/start/install
github:https://github.com/envoyproxy/envoy

容器方式:

提供多平台容器

  • envoyproxy/envoy:基于ubuntu-bionic
  • envoyproxy/envoy-alpine和envoyproxy/envoy-alpine-dev
  • envoy-debug和envoy-debug-dev
  • envoy-windows和envoy-windows-dev

二进制方式

按官方文档来,一般运行在K8s/容器中,较少二进制运行
如果使用通用版二进制,对系统glibc版本有要求,目前1.28.0最低要glibc-2.30,rhel9可直接运行,rhel8要编译新glibc,查看方法:

ldd --version #查看glibc版本

  • ubuntu
  • debain
  • rhel
启动:
envoy --mode validate -c /etc/envoy/envoy.yml		#验证配合语法
envoy --enable-core-dump -c 文件		#支持json、yaml、pb、pb_text格式
例:二进制运行,代理nginx
1)安装/配置nginx
#安装完后修改nginx的监听端口为8080
yum install -y nginx

systemctl start nginx
2)安装envoy
wget https://github.com/envoyproxy/envoy/releases/download/v1.28.0/envoy-1.28.0-linux-x86_64
chmod +x envoy-1.28.0-linux-x86_64 
mv envoy-1.28.0-linux-x86_64 /bin/envoy
3)配置envoy
mkdir -p /etc/envoy/ 
cd !$

cat > envoy.yml <<EOF
admin:
  access_log_path: /dev/null
  address:
    socket_address:
      address: 127.0.0.1
      port_value: 9000

node:
  cluster: service_greeter
  id: test-id

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: web_service_1
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: local_cluster
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  - name: local_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: local_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 127.0.0.1, port_value: 8080 }
EOF

#验证配置,并启动
envoy --mode validate -c /etc/envoy/envoy.yml
envoy -c /etc/envoy/envoy.yml
4)测试
#测nginx
curl -I 127.0.0.1:8080

#测envoy
curl -I 127.0.0.1

image-20231208142351156

image-20231208142315407


envoy配置:

官方文档:https://www.envoyproxy.io/docs/envoy/v1.28.0/configuration/configuration

启动时必须加载配置文件做初始化设置(bootstrap配置),在启用全动态配置机制后,只有极少数情况采用重新启动

动态配置:

  • xds api:从配置文件加载、从管理服务器加载
  • runtime:新特性保存为kv数据、支持多层配置和覆盖

配置方式

  • 纯静态配置:自行提供侦听器、过滤器链、集群、路由等,端点可用dns发现,使用热重启加载配置
  • 仅使用eds:eds提供端点发现功能,可有效避免dns的限制
    eds和cds:cds可让envoy以优雅的方式添加、更新、删除上游集群,所以初始化时不用配置上游集群
  • eds、cds、rds:动态路由发现,三者一起使用时可实现更高级的路由功能,如蓝绿、流量转移
  • eds、cds、rds、lds:动态发现侦听器配置,包括内嵌的过滤器链,4者一起使用时除了罕见的配置变动、证书更新、升级envoy外,几乎不用热重启
  • eds、cds、rds、lds、sds:动态发现侦听器、秘钥证书等,加入对证书、tls管理

全局配置:

主体配置框架

全部定格写

node: "{}"		      #节点标识,在管理服务器中显示,
admin: {}
static_resources: "{}"		#静态配置的资源,用于配置静态listener、cluster、secret
dynamic_resources: "{}"		#动态配置的资源,基于xds api获取listener、cluster、secret的lds_config、cds_config、ads_config
cluster_mamager: "{}"
tracing: {}			#链路追踪
layered_runtime: {}		#层级化运行时,支持使用rtds从管理服务器动态加载
hds_config: "{}"
overload_manager: {}	#过载管理器
flags_path: ""
stats_sinks: []
stats_config: "{}"
stats_flush_interval: ""
stats_flush_on_admin: ""

较完整版配置

额外路由配置,参考官方文档:https://www.envoyproxy.io/docs/envoy/v1.28.0/intro/arch_overview/http/http_routing.html#priority-routing

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
       address: 0.0.0.0
       port_value: 9901

layered_runtime:            #未指定时使用null供应者
  layers:
  - name: 名               #运行时的层级名称,后面的层会覆盖先前层上的配置
    static_layer: {}      #静态运行时层级,遵循protobuf.json编码格式,不同于静态的xds资源,静态运行时层一样可被后面的层覆盖
    disk_layer: {}        #基于本地磁盘的运行时层级
      symlink_root: str       #通过符号链接访问的文件系统树
      subdirectory: str       #指定要在根目录加载的子目录
      append_layer: str       #是否将服务集群附加到符号链接根目录下的子路径上
    admin_layer: {}           #管理控制台运行时层级,即通过/runtime api查看,通过/runtime_modify api修改配置,空为开启
    rtds_layer: {}            #运行时发现服务层级,通过xds中的rtds api动态发现相关的层级配置
      name: str               #在rtds_config中为rtds层订阅的资源
      rtds_config: {}         #rtds的配置

static_resources:
  listeners:
  - name: listener_0        #侦听器名称
    address:          #侦听器监听地址
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:     #侦听器上的过滤链定义
    - filters:        #定义4层过滤器,7层包含在其中,因为7层基于4层
      - name: envoy.filters.network.http_connection_manager     #使用tcp 4层过滤器的http_connection_manager
        typed_config:           #类型配置
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager    #使用http过滤器的v3版
          stat_prefix: ingress_http
          codec_type: AUTO
          access_log:
            name: str           #访问日志名,必须与静态注册的访问日志匹配,日志记录器一次只能选一个,当前内置日志记录器有:envoy.access_loggers.file、envoy.access_loggers.http_grpc、envoy.access_loggers.open_telemetry、envoy.access_loggers.stream、envoy.access_loggers.tcp_grpc、envoy.access_loggers.wasm
            filter:             #日志输出过滤器
            typed_config:       #日志记录器类型相关的专用配置,以文件记录器为例
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: str         #路径
              log_format: 格式      #格式定义,未定义时使用默认值
                text_format:        #命令操作符的文本字符串,几个格式只能选一个
                json_format:        #json格式
                text_format_source:     #字符串来自filename、inline_bytes、inline_string数据源
                omit_empty_values: 布尔值
                content_type: 类型      #文本类型,默认为text/plan,json为application/json
                formatters: []      #调用的日志格式化插件
              status_code_filter:
              duration_filter:
              not_health_check_filter:
              traceable_filter:
              runtime_filter:
              and_filter:
              or_filter:
              header_filter:
              response_flag_filter:
              grpc_status_filter:
              extension_filter:
              metadata_filter:
          route_config:           #静态路由配置,动态配置为rds
            name: local_route     #路由配置名称
            virtual_hosts:        #虚拟主机匹配,与ngx的server_name一样
            - name: web_service_1     #配置名,用于统计信息中显示
              domains: ["*"]          #匹配的域名
              routes:                 #路由的实际配置
              - match:        #匹配内容,路径匹配三选一
                  prefix: url                 #前缀匹配
                  safe_regex:
                    google_re2: {}      #使用谷歌正则
                    regex: 正则
                  path:                 #路径,精确匹配
                  headers:              #请求头
                  - name: X-canary
                    exact_match: "true"      #匹配字段的值
                  parameters:           #请求参数
                  runtime_fraction:     #额外匹配指定的运行时键值对。流量迁移配置,每次评估匹配路径时,它必须低于此字段指定的百分比,支持渐进式修改
                    default_value:      #运行时键值对不可用时,则使用默认配置
                      numerator: 0      #默认0分子
                      denominator: 分母     #指定分母,小于分子时,最终百分比为1.分母可固定使用:HUNDRED(默认)、TEN_THOUSADN、MILLION
                    runtime_key: routing.traffic_shift.KEY    #指定要运行的运行时键,值需用户自定义
                  exact_match: 值       #用于匹配首部的值
                  exact_match: str        #精确值匹配
                  safe_regex_match: str   #正则表达式匹配
                  range_match: str        #范围匹配,检查标头值是否在指定范围内
                  present_match: str      #标头存在性匹配
                  prefix_match: str       #值前缀匹配
                  suffix_match: str       #值后缀匹配
                  contains_match: str     #检测标头值是否包含字符串
                  string_match: str       #标头值是否匹配字符串
                  invert_match: false     #是否对匹配结果取反,不满足条件为真。默认false
                  quert_parameters:     #匹配请求参数
                  - name: 'username'
                    value: 值
                    regex:
                    string_match:
                      exact: str
                      safe_regex: 正则
                      prefix: str
                      suffix: str
                      contains:
                      ignore_case: str      #忽略大小写
                    present_match:
                route:               #路由配置
                  cluster: local_cluster       #路由到指定集群
                  weighted_clusters:           #基于权重的方式,路由到多个不同子集,可根据元数据标签匹配做流量分割,如90%流量到v1版本,10%流量到v2
                    cluster:            #为每个目标集群定义专用的元数据匹配
                    - name: xx
                      weight: 0         #权重取值为0到total_weight
                      metadata_match:  #子集负载均衡器使用的端点元数据条件匹配。可选,参考下面
                        filter_metadata:
                          envoy.lb:
                            k1: v1
                    total_weight: 100     #总权重,默认100
                    runtime_key_prefix:   #可选。用于设定键前缀,每个集群以:runtime_key_prefix+.+cluster[索引].name为键,以运行时键值对的方式为每个集群提供权重。例此处前缀指定为route,集群名为app1,运行时key名为:route.app1
                  cluster_header:              #根据请求头中的cluster_header的值确定目标集群
                  cluster_not_found_response_code:
                  metadata_match:         #子集负载均衡器使用的端点的匹配条件。如果用了weighted_clusters,且内部定义了metadata_match,则匹配将被合并(与关系),weighted_cluster中定义的值优先。过滤器名称应使用envoy.lb
                    filter_metadata:
                      envoy.lb:
                        k1: v1
                  hash_policy:        #路由hash策略,实现高级hash,当cluster使用hash时,需在此处配合使用。header、
                  - header:
                      header_name: 首部       #需要hash的首部名称
                  - cookie:
                      name: cookie名           #必选项
                      ttl: 时间                 #过期时间,不存在带有ttl的cookie会自动生成,若ttl存在且为0,则生成的cookie是会话cookie
                      path: 路径                #cookie路径
                  - connection_properties:
                      source_ip: 布尔值          #是否源地址哈希
                    terminal: 布尔值             #是否启用哈希算法的短路标志,一旦当前策略生成哈希值,将不再考虑列表中后续的其他哈希策略(如源地址hash和首部哈希,其中一个满足就不再继续哈希)
                  timeout:                      #超时时间
                  idle_timeout:
                  retry_policy:                #重试策略
                    retry_on: 条件            #重试发生的条件,如网络故障、5xx类响应码,与标头x-envoy-retry-on、x-envoy-retry-grpc-on相同
                    num_retries: 1            #重试次数,默认为1,与标头x-envoy-max-retries相同,但取2个配置之间的最大值
                    per_try_timeout: 时间     #每次重试时与上游端点建立连接的超时时间
                    retry_priority:       #重试优先级策略,用于在各优先级之间分配负载
                      name: envoy.retry_priorities.previous_priorities
                      config:
                        update_frequency: 2
                    retry_host_predicate:     #重试时使用的主机断言列表,各断言用于拒绝主机。在选择重试主机时将参考列表中的断言,若存在任何内容拒绝了该主机,则需要重新尝试选择其他主机
                    - name: envoy.retry_host_predicates.previous_hosts
                    retry_options_predicates:
                    host_selection_retry_max_attempts:    #允许尝试重新选择主机的最大次数,默认为1
                    retriable_status_codes:       #出了retry_on指定的条件外,用于触发重试icaozuo的http状态码列表
                    retry_back_off: 25ms            #控制回退算法的参数,默认间隔25ms
                    rate_limited_retry_back_off:    #定义控制重试回退策略的参数
                    retriable_headers:              #触发重试的http响应标头列表,上游端点的响应报文与列表中任何标头匹配时将触发重试
                    retriable_request_headers:      #必须在用于重试的请求报文中使用http标头列表
                  request_mirror_policies:      #流量镜像配置
                  - cluster:
                    runtime_fraction:     #参考:routes.match.runtime_fraction
                    trace_sampied: {}     #是否跟踪采样,默认ture
                  priority:
                  include_vh_rate_limits:
                  rate_limits:                  #限速
                  cors: 跨域配置        #跨域配置,参考安全部分,或官方文档案例
                  prefix_rewrite:               #url重写
                  host_rewrite:                 #主机重写
                  auto_host_rewrite:
                  host_rewrite_literal:
                  host_rewrite_header:
                  host_rewrite_path_regex:
                  regex_rewrite: {}
                  max_grpc_timeout:
                  grpc_timeout_offset:
                  upgrade_configs:
                  internal_redirect_policy:
                  internal_redirect_action:
                  max_internal_redirects:
                  hedge_policy:
                  max_stream_duration:
                redirect: {}            #重定向
                  https_redirect: true
                  scheme_redirect:      #协议重定向
                  host_redirect:        #主机名重定向
                  port_redirect:        #端口重定向
                  path_redirect:        #路径重定向
                  prefix_redirect:      #url前缀重定向
                  regex_rewrite:
                  response_code:
                  strip_query: false
                direct_response:            #直接响应
                  status:                #响应码
                  body:                  #body
                    inline_string: "ok\n"
              require_tls:
              virtual_clusters:
              rate_limits:
              request_headers_to_add:
              request_headers_to_remove:
              response_headers_to_add:
              response_headers_to_remove:
              cors:
                allow_origin:           #允许共享的资源列表,*为所有
                allow_origin_regex:     #用正则允许资源访问
                allow_methods:          #允许的方法,内容对应access-control-allow-methods标头
                allow_headers:          #运行在请求资源时使用的标头,对应access-control-allow-headers标头
                expose_headers:         #浏览器可访问的标头白名单,对应access-control-expose-headers标头
                max_age:                  #缓存最大时间,对应access-control-max-age标头
                allow_credentials: 布尔值    #是否允许服务调用方式使用凭据发起实际请求
                enabled: 布尔值            #是否启用跨域,默认为启用,由filter_enab led取代
                filter_enabled: true      #启用跨域,需定义过滤器的请求百分比,默认100%
                  default_value:
                    numerator: 100
                    demominator: HUNDRED
                shadow_enabled: 布尔值       #是否只在阴影模式下启用过滤器的请求百分比,启用时,默认值为100/HUNDRED。并评估请求的来源以确定其是否有效,但不强制执行任何策略,若同时启用filter_enabled,则以filter_enabled优先
              typed_per_filter_config:
              include_request_attempt_count:
              include_attempt_count_in_response:
              retry_policy:
              hedge_policy:
              per_request_buffer_limit_bytes:
            vhds:
            internal_only_headers:
            response_headers_to_add:
            response_headers_to_remove:
            request_headers_to_add:
            request_headers_to_remove:
            most_specific_header_mutations_wins:
            validate_clusters:
            max_direct_response_body_size_bytes:
          generate_requiest_id: true        #生成请求id
          tracing:
            client_sampling:        #由客户端通过x-client-trace-id标头指定进行跟踪时的采样,默认100%
            random_sampling:        #随机采样,默认100%
            overall_sampling:       #整体采样,默认100%
            verbose:              #是否为span标注额外信息,开启时,span将包含stram事件的日志信息
            max_path_tag_length: []     #记录url时使用的最大长度
            custom_tags: []             #自定义标签列表,各标签用于活动的span之上,且名称要唯一
            provider: {}            #要使用的外部跟踪器
        http_filters:             #指定http过滤器链
          - name: envoy.filters.http.router       #调用7层的路由过滤器
            typed_config:
             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          - name: envoy.filters.http.fault
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
              delay:              #注入延迟,延迟和请求中止至少有1个
                fixed_delay:      #持续时长,将请求转发到上游主机前添加固定延迟
                header_delay:     #基于http标头的指定控制故障延迟
                percentage:      #将注入延迟的操作、连接、请求的百分比。表示将错误注入到多大比例的请求中
              abort:              #注入请求中止
                http_status:      #中止http请求的状态码,http_status、grpc_status、header_status三者之间必须选一个
                grpc_status:      #中止grpc请求的状态码
                header_status:    #由http标头控制的中止
                percentage:       # #将注入延迟的操作、连接、请求的百分比
              upstream_cluster:       #过滤器关联的上游集群,只生效在这些目标集群
              headers:                #过滤器关联的请求头列表,各标头间为与关系
              downstream_nodes:       #要注入故障的下游主机列表,未指定时将匹配所有主机
              max_active_faults:      #在同1个书剑点所允许的最大活动故障数,默认为不限制,可用运行时参数:config_http_filters_fault_injection_runtime配置
              response_rate_limit:    #响应速率限制,可用运行时参数:fault.http.rate_limit.response_percent配置,此为单流或连接级别的限制
                fixed_limit:
                  limit_kbps:         #固定速率,单位kiB/s
                header_limit:         #限制为http首部指定的速率
                percentage:
              delay_percent_runtime:
              abort_percent_runtime:
              delay_duration_runtime:
              max_active_faults_rumtime:
              response_rate_limit_percent_runtime:
              abort_grpc_status_runtime:
              disable_downstram_cluster_stats:
      - name: envoy.filters.http.jwt_authn
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
          providers:              #定义provider名称及相关属性
            name: xx              #provider名称
            issuer: str           #jwt签发者,通常是url或邮件
            audiences: {}         #接收jwt的一方,匹配一个就接收
            remote_jwks:          #通过http/https远程获取到的jwk
              uri: url            #url,格式为:http(s)://ip:端口/path
              cluster: xx         #集群名,可不定义uri,使用集群定义
              timeout: 时间       #超时时间
            cache_duration: 5m    #jwks缓存超时时间,默认5m
            async_fetch: {}
            retry_policy:
              retry_back_off: {}    #回退策略
                base_interval: 时间     #基准时间间隔
                max_interval: 时间      #最大时间间隔
              num_retries: 次数      #重试次数
            local_jwks: {}        #本地数据源可以访问到jwk,支持文件、字节码、字符串
            from_headers: [{}]    #哪些http协议标头获取jwt,支持bear和自定义标头,如:Authorization Bear <token>
            from_params: []       #从哪些url参数中获取jwt,如:/path?jwt_token=jwt中的jwt_token参数
            from_cookies: []      #jwt包含在哪些cookie中
            forward: false        #是否无需再认证陈宫后从请求中溢出jwt,默认false为需要移除
            forward_payload_header: str     #指定用于将经过验证的jwt的payload转发到后端的标头
          rules:
          - match:            #路由匹配条件
            require:          #jwt验证要求,以下验证方式只能选其一
              provider_name: str      #需要provider名称
              provider_and_audiences: {}      #需要的provider和audience
              requires_any: {}        #有requirements参数指定需要的provide列表,匹配一个则通过
              requires_alt: {}        #有requirements参数指定需要的provider列表,都匹配才通过
              allow_missing_or_faild: {}      #即使jwt缺失或验证失败,结果依然通过:example_jwks_cluster
    use_proxy_protoc:
    transport_socket_connect_timeout:
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:         #通用tls配置,如加密算法、证书等
        require_client_certificate:   #是否强制校验客户端证书
        session_ticket_key:         #为可以恢复tls会话,服务器使用session key将会话加密后发送给客户端保存,客户端需要透明支持该功能
        session_ticket_key_sds_secret_config:         #使用sds api请求加载session ticker key的配置
        disable_stateless_session_resumption: 布尔值     #true为不生成session_ticket,只启用stateless session;false为生成加密会话,使用的会话key可用session_ticket_key或session_ticket_key_sds_secret_config定义,未定义时自动生成
        session_timeout: 时间           #会话超时时间
        ocsp_staple_policy:             #


  clusters:
  - name: xx          #集群唯一名称,未提供alt_stat_name时会被用于统计信息中
    alt_state_name: str     #统计信息中使用的集群名称
    type: 类型          #解析集群的类型
      #static
      #strict_dns
      #logical_dns
      #eds
      #original_dst
    dbs_lookup_family: V4_ONLY
    connect_timeout: 10         #tcp超时时间,合理的配置可以改善服务调用导致的整个链接变慢的情况
    max_requests_per_connection: 1024       #每个连接最大可承载的最大请求数,http1.1和2的连接池都受限于此配置(小于等于此处),无设置为无限制,1为禁用持久连接
    circuit_breakers:           #熔断相关配置
      threasholds:              #适用于特定路由优先级的相关指标及阈值的列表
      - priority: 优先级         #当前断路器的路由优先级
        max_connections: 1024    #可发往上游集群的最大并发连接数,仅使用与http1,默认为1024,超过指定配置的连接将视为短路
        max_pending_requests: 1024       #允许请求服务时,可挂起的最大请求数,默认为1024,超过配置值则短路。组合:当max_connections和此处都配置为1时,如果超过1个连接发起请求,envoy就会熔断,阻止后续的请求或连接
        max_requests: 1024        #envoy可调度给上游集群的最大并发请求数,默认1024,仅用于http2
        max_retries: 3            #最大重试次数,默认为3
        track_remaining: false    #为true时将公布统计数据显示断路器打开前所有剩余的资源数量,默认false
        max_connection_pools: int     #每个集群可同时打开的最大连接池数量,默认无限制
    lb_policy: 算法
      #round_robin,加权轮询
      #least_request,加权最少请求,所有主机权重相同时默认每次从2个节点对比,最空闲的处理请求(可修改对比节点数)。权重不同时,计算方法:权重为2,活动请求4,综合权重为2/4=0.5
      #ring_hash,环哈希。一致性哈希。为避免环倾斜,最好设置环的大小,并监视min_hashes_per_host、max_hashed_per_host指标
      #maglev,磁悬浮,类似环哈希,但哈希环固定为65537,如A权重为1,B权重为2,则A接管21486项,B接管43691项,会根据权重将整个环分配干净。需要监视前面所说2个指标。效率比环哈希快,稳定性差一点
      #random,未配置健康检测策略时,随机算法比轮询好
      #original_dst_lb,原始目标集群负载均衡,仅使用于原始目标集群调度
    load_assignment:        #为static、strict_dns、logical_dns类型的集群指定成员获取方式。eds类型使用eds_cluster_config配置
      cluster_name: xx      #负载均衡cluster中的端点,关联的集群,一般关联上文集群
      endpoints:        #可定义集群中不同区域下,多个端点
      - locality:                     #定义节点位置,标识上游主机所处的位置
          region: str
          zone: str
          sub_zone: str
        lb_endpoint:      #属于指定位置的端点列表
        - endpoint_name: 端点名    #可选
          endpoint:
            socket_address:  {address: ip或域名, port_value: 端口, protocol: 协议 }  #端点地址标识
            health_check_config:
              port_value: int       #自定义检测的端口
          load_balancing_weight: 权重    #权重
          metadata: {}                  #基于匹配的侦听器、过滤器、路由、端点等为过滤器提供额外信息的元数据,常用于提供服务配置、辅助负载均衡
            filter_metadata:
              envoy_lb:
                version: '1.0'
                stage: 'prod'
          health_status: str            #端点是eds发现时,用于管理式设定端点的健康状态,可用值有:unkown、healthy、unhealthy、draining、timeout、defraded
        load_balancing_weight: 权重    #区域或优先级的权重,最小值为1。根据权重在各个区域间分配流量,如区域A权重为1,区域B权重为2,则流量分配为:33%和67%。如果区域中部分端点不可用时envoy会按比例动态调整区域权重(端点也可配置超配因子,默认1.4),详情参考集群管理
        priority: int                   #优先级,默认0为最高优先级
      policy:            #负载均衡策略
        drop_overloads: []              #过载保护机制,丢弃过载流量的机制
        overprovisioning_factor:        #整数值,超配因子(百分比),默认值为140,即1.4
        endpoint_stale_after: 0         #过期时长,过期前未收到任何新流量分配的端点会被视为过时,并标记为不健康,默认0为永不过时
    least_request_lb_config:
      choice_count: 2         #选择指定数量主机进行对比,默认为2
    lb_subset_lb_config:      #负载均衡器子集
      failback_policy: 回退策略     #默认NO_FAILBACK
      default_subset:         #使用回退策略DEFAULT_SUBSET时,使用的默认子集
        k1: v1
      subset_selectors:          #子集选择器
      - key: [A,B]                   #选择器中元数据的键列表,元数据中必须有A、B标签的
        failback_policy: 回退策略     #当前选择器专用的回退策略
      locality_weight_aware: 布尔值      #是否将请求路由到子集时考虑端点的位置和位置权重(有一些bug)
      scale_locality_weight: 布尔值      #是否将子集与主机中的主机比率来缩放每个位置的权重
      panic_mode_any: 布尔值             #是否在配置回退策略,且其相应的子集无法找到主机时尝试从整个集群中选择主机
      list_as_any: str
    ring_hash_lb_config:
      minimum_ring_size: 1024           #哈希环最小值,环越大结果越接近权重比,默认1024,最佳值为8M
      maximum_ring_size: 8M             #哈希环最大值,默认8M。值越大计算越消耗资源
      hash_function: 算法                 #支持xx_hash、murmum_hash,默认前一个
    original_dst_lb_config: {}
    common_lb_config:
      healthy_panic_threshold: 50       #恐慌阈值,默认50%
      zone_aware_lb_config: {}          #区域感知路由负载均衡的相关配置
        routing_enabled: 100             #百分比,用于配置在大比例的请求流量上启用区域感知路由机制,默认为100%
        min_cluster_size: 6               #配置区域感知路由需要的最小上游集群大小、上游集群大小小于指定的值时,即使配置区域感知路由也不会执行,默认值为6,取值范围:64位整数
      locality_weighted_lb_config: {}             #位置加权负载均衡,为特定区域加权,空就是开启,没有子参数。位置加权负载均衡与区域感知负载均衡互斥
      ignore_new_hosts_until_first_hc: 布尔值      #是否在新加入的主机经历第一次健康检测前不做负载均衡
      update_merge_window:
    transport_socket:         #上游后端配置tls
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapi.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        common_tls_context:         #通用tls配置
          tls_params:
            tls_minimum_protocol_version: TLS1.2    #最小tls版本,默认客户端1.2,服务端1.0
            tls_mmaximum_protocol_version: TLS1.2   #默认客户端1.2,服务端1.3
            cipher_suites: []         #tls1.0到1.2版本协商中支持的加密算法列表,1.3不受影响
            ecdh_curves: []           #使用ecdh curve算法
          tls_certificate_chain:      #证书,刺配静态配置,静态和动态不可同时配置
            filename: 文件            #证书文件
            inline_bytes: 字节证书        #证书字节码字符串
            inline_string: 证书           #证书字符串
          private_key: 私钥           #私钥配置,语法与公钥类似
          watched_directory:          #基于sds协议从文件系统加载证书和私钥监视的目录
            path: 目录                #监视的目录
        tls_certifacate_sds_secret_configs:       #通过sds动态加载secret配置,与静态互斥
        - name: xx              #引用的secret名。若同时指定sds_config配置,则从sds动态加载证书
          sds_configs:          #sds配置
            path:           #基于文件实现sds,以下3种只能取一个
            api_config_source:      #基于sds订阅
              api_type: GRPC
              transport_api_version: V3
              grpc_services:
                goole_grpc:
                  target_uri: unix:/tmp/usd_path      #使用套接字
                envoy_grpc:
                  cluster_name: sds集群               #使用集群
            ads:                    #基于ads订阅
            initial_fetch_timeout: 时间   #初始加载的超时时间
            resource_api_version: V3    #资源的api版本
        validation_context:               #校验对端证书相关配置
          trusted_ca: {}            #信任ca,支持文件、字节码、字符串冲加载
          watched_directory: {}     #sds监视的目录
          verify_certificate_spki: []     #spki校验,经过base64编码的spki的sha-256检验码列表
          verify_certificate_hash: []     #hash校验,仅该列表中的hash对应的证书会被接受
          match_subject_alt_names: []     #subject的可替换名称列表
          crl: {}             #证书吊销列表,相关信息可从文件、字节码、字符串中加载
          allow_expired_certificate:      #是否接受已经过期的证书
          trust_chain_verificate:          #证书信任链的校验模式,支持:VERIFY_TRUST_CHAIN、ACCEPT_UNTRUSTED,默认第一个
        validation_context_sds_secret_config:     #sds动态加载的校验配置
          name: xx            #引用的secret名。若同时指定sds_config配置,则从sds动态加载证书
          sds_config:         #sds服务端配置,与tls_certifacate_sds_secret_configs中一样
        combined_validation_context:        #混合模式的validation context加载机制,同时给了静态配置和sds,sds有返回数据时2者合并后使用
          default_validation_context: {}      #默认使用的validation_context
          validation_context_sds_secret_config: {}      #sds加载校验对端证书的配置
        sni:                    #sni支持基于FQDN的tls,创建tls后端连接时使用sni字符串
        allow_renegitiation: 布尔值       #是否启用协调机制(不安全)
        max_session_key: 1            #默认1为存储session恢复的key最大数量,0为禁止会话恢复
    transport_socket_matches: []
    cluster_type: '{...}'
    eds_cluster_config: '{...}'
    per_connection_buffer_limit_bytes: '{...}'
    health_checks:         #主动健康状态监测
    - timeout: 时间
      interval: 时间      #间隔
      initial_jitter: 时间      #初始化检测时间,单位ms
      interval_jitter: 时间     #间隔检测时间点,单位ms
      unhealth_threshold: int       #检测几次才算不成功
      healthy_threshold: int        #检测几次算健康,初始化检测时成功1此就算健康
      http_health_check:         #http类型检测
        host: 主机      #默认空时用集群名
        path: 路径      #如/health,必选
        service_name_master: 集群名      #验证目标集群名
        request_headers_to_add: []        #向检测报文添加自定义头
        request_headers_to_remove: []     #检测报文中删除标头
        expected_statuses:         #期望的响应码列表,默认200
          start: 200      #检测正确的响应码区间:200-399
          end: 399
      tcp_health_check: {}         #tcp类型检测,空则表示仅tcp发包判断网络连接,"{}"为空
        send: {}             #请求匹配
        recevie: []           #响应匹配
      grpc_health_check: {}         #grpc专用检测
      custom_health_check: {}       #自定义检测
      reuse_connection: 布尔值       #是否在多次检测之间重用连接,默认true
      no_traffic_interval: 时间     #定义未曾调度任何流量到集群时,端点健康检测时间间隔,一旦接受流量就转为正常的时间间隔
      unhealthy_interval: 时间      #标记为unhealthy状态的端点的检测间隔,一旦重新标记为healthy就转为正常时间间隔
      unhealthy_edge_interval: 时间   #端点标记为unhealthy状态时的检测间隔,随后转为unhealthy_interval
      healthy_edge_interval: 时间     #端点刚被标记为healthy状态的检测间隔,随后转为interval
      tls_opsions: {}             #tls配置
      transport_socket_match_criteria: {}
    upstream_http_protocol_options: '{...}'
    common_http_protocol_options: '{...}'
    http_protocol_options: '{...}'
    http2_protocol_options: {}      #配置http2,空则开启http2
    typed_extension_protocol_options: '{...}'
    dns_refresh_rate: '{...}'
    dns_failure_refresh_rate: '{...}'
    respect_dns_ttl: ...
    dns_lookup_family: ...
    dns_resolvers: []
    use_tcp_for_dns_lookups: ...
    outlier_detection:        #异常点检测(被动检测),熔断相关
      consecutive_5xx: int        #连续5xx错误而弹出主机之前,允许出现的连续5xx响应或本地原始错误数,默认5
      interval: 时间          #弹射分析扫描之间的间隔,默认10s
      base_ejection_time: 时间      #主机被弹出的基准时长,实际时长=基准时长*主机已弹出次数,默认30s,如第一次弹出30s,后面又挂了又弹出则是60s
      max_ejection_percet: 百分比    #默认10。集群中允许弹出的主机比率,避免所有主机都弹出
      enforcing_consecutive_5xx: int      #连续5xx检测到主机异常时,主机被弹出的几率,可用于禁止弹出和缓慢弹出,默认100
      enforcing_seccess_rate: int       #成功率检测到主机异常时,主机被弹出几率,用于禁止弹出、缓慢弹出,默认100
      success_rate_minimum_hosts: int   #参与评估的最少主机数,如果集群的主机数少于此就不参加评估,默认5
      success_rate_requests_volume: int   #检测的1次间隔中,必须收集的总请求的最小值,默认100
      success_rate_stdev_factor: int      #用确定成功率异常值弹出的弹射阈值的因子,弹射阈值=均值-(因子*平均成功率标准差)。如需要1.3因子,则要设为1300。因子越大弹出概率越低
      consecutive_gateway_failure: int    #连续网关故障弹出主机的最少连续故障数,默认5
      enforcing_consecutive_gateway_failure: int    #连续网关故障检测到异常状态时,弹出主机的几率,默认0
      split_external_local_origin_errors: 布尔值       #是否区分本地原因导致的故障和外部故障,默认为false,true时,下面3个配置才能生效
      consecutive_local_origin_failure:     #因本地原因的故障弹出主机的最少次数,默认5
      enforcing_consecutive_local_origin_failure:     #基于连续的本地故障检测异常状态而弹出主机的几率,默认100
      enforcing_local_origin_success_rate:      #基于连续本地故障检测的成功率统计检测到异常状态而弹出主机的几率,默认100
      failure_percentage_threshold: {}    #确定基于故障百分比的
      enforcing_failure_percentage: {}    #
      enforcing_failure_percentage_local_origin: {}
      faulure_percentage_minimum_hosts: {}
      failure_percentage_request_volume: {}
      max_ejection_time:              #主机弹出的最长时间,未指定则用默认值,300s,或对比base_ejection_time的最大值
    cleanup_interval: '{...}'
    upstream_bind_config: '{...}'
    lb_subset_config: '{...}'
    maglev_lb_config: '{...}'
    metadata: '{...}'
    upstream_connection_options: '{...}'
    close_connections_on_host_health_failure: ...
    ignore_health_on_host_removal: ...
    filters: []
    track_timeout_budgets: ...
    upstream_config:
      healthy_panic_threshold: int		#恐慌阈值,默认50%
      use_http2:
      use_http3:
      zone_routing:		#区域感知负载均衡
        enabled: 		#将路由到同一上游区域的请求的百分比。默认为 100% 的请求
        min_cluster_size:
    track_cluster_stats: '{...}'
    preconnect_policy: '{...}'
    connection_pool_per_downstream_connection: ...

  secrets:        #静态指定secret,三种配置取一个
  - name: xx      #定义secret的唯一标识符
    ds_certifacate: {}      #数字证书
      certifacate_chain: {}     #加载的tls证书链,可以是文件、字节码、字符串
      private_key: {}           #私钥配置,同上
      password: {}              #私钥信息的解密密码,未指定时,需要私钥文件处于未加密状态
      watched_directory: {}     #基于sds协议从文件系统中加载证书和私钥时监视的目录
  - name: xx
    session_ticket_keys:        #用于加密和解密的秘钥
      keys: []          #秘钥列表,未指定时将使用内部生成和管理的秘钥
  - name: xx
    validation_context:         #对等证书验证机制配置
      trusted_ca: {}            #信任ca,未指定时不验证对端证书
      crl: {}                   #可选的pem格式证书吊销列表
      verify_certificate_spki: {}     #base64编码的sha-256哈希,雅正der编码证书的公钥信息的sha256编码是否与内容之一匹配
      verify_certifacate_hash: {}     #bashe64编码的sha256哈希,验证der编码格式证书的sha256编码是否与内容之一匹配
      verify_subject_alt_name: []     #subject备用名称列表,可选。用于验证证书的主体备用名称是否与内容之一匹配
      match_subject_alt_names: []     #subject的可替换名称列表
      allow_expired_certificate: 布尔值    #是否拒绝过期的证书
      watched_directory: {}           #基于sds协议从文件系统中加载ca时监视的目录
  - name: xx
      generic_secret:       #filter使用的通用类型secret
        secret: {}          #加载的secret
tracing:
  http:
    name: xx
    typed_config:         #类型化配置,
      #envoy.tracers.datadog
      #envoy.tracers.dynamic_ot
      #envoy.tracers.lightstep
      #envoy.tracers.opencensus
      #envoy.tracers.skywalking
      #envoy.tracers.xray
      #envoy.tracers.zipkin
      "@type": type.googleapis.com/envoy.config.trace.v3.ZipkinConfig   #以zipkin为例
      conllector_cluster:         #指定承载zipkin收集器的集群名,必须在bootstrap静态集群资源中定义
      collecrot_endpoint:         #zipkin服务的用于接收span数据的api端点,默认配置为:/api/v2/spans
      trace_id_128bit:            #是否创建128位的跟踪id,默认为false,即使用64位id
      shared_span_context:        #客户端和服务器span是否共享相同的spanid,默认true
      collector_endpoint_version:     #collocter端点版本
      collector_hostname:             #向collector cluster发送span时使用的主机名,默认为conllector_cluster定义的名称。可选项

listener:

侦听器独立部署时,建议每个主机只部署1个envoy实例,在此实例上运行多个侦听器
侦听器支持:tcp、udp类型
侦听器收到请求后将其交给过滤器处理

从属于静态、动态配置,后面在路由、集群管理中会详细讲

主体配置:
{
  "name": "",
  "address": {},
  "stat_prefix": "",
  "filter_chains": [],
  "use_original": {},
  "default_filter_chain": {},
  "per_connection_buffer_limit_bytes": {},
  "metadata": {},
  "drain_type": "",
  "listener_filters": [],
  "listener_filters_timeout": {},
  "continue_on_listener_filters_timeout": "",
  "transparent": {},
  "freebind": {},
  "socket_options": [],
  "tcp_fast_open_queue_length": {},
  "traffic_direction": "",
  "udp_listener_config": {},
  "api_listener": {},
  "connection_balance_config": {},
  "reuse_port": "",
  "access_log": [],
  "tcp_backlog_size": {},
  "bind_to_port": {}
}
filter:

过滤器支持3、4层过滤,7层过滤基于3,4层实现(也就是必须在4层开启http_connect_manager功能,才能使用使用7层)
内置的3、层过滤器:

  • tcp代理
  • http
  • thrift代理
  • mongo代理
  • dubbo代理
  • zk代理
  • mysql代理
  • redis代理等

其他过滤器:

  • tls认证
  • 限速
  • RBAC鉴权认证网络过滤
  • upstream cluster fron sni等

image-20230816141807541

tcp过滤器:
  listeners:
    name: listenrer_0
    addiress: {socker_address: { address:0.0.0.0, port_value:80 }}
    filter_chains:
    - filters:
      - name: envoy.tcp_proxy		#tcp过滤器
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy     	#调用的过滤器的api版本
          stat_prefix: tcp		#统计数据中输出时显示的前缀
          cluster: local_cluster    #路由到的目标集群   
          weighted_cluster: {}    #权重
          metadata_match: {}
          idle_timeout: {}      #上下游连接的空闲超时时间
          accedd_log: []        #访问日志
          max_connect_attempts: {}      #最大尝试连接数
http过滤器:
  listeners:
  - name: listener_0        #侦听器名称
    address:          #侦听器监听地址
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:     #侦听器上的过滤链定义
    - filters:        #定义4层过滤器,7层包含在其中,因为7层基于4层
      - name: envoy.filters.network.http_connection_manager     #使用tcp 4层过滤器的http_connection_manager
        http_filters:             #指定http过滤器链
          - name: envoy.filters.http.router       #调用7层的路由过滤器
            typed_config:
             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
        typed_config:           #类型配置
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager    #使用http过滤器的v3版
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:           #静态路由配置,动态配置为rds
            name: local_route     #路由配置名称
            virtual_hosts:        #虚拟主机匹配,与ngx的server_name一样
            - name: web_service_1     #配置名,用于统计信息中显示
              domains: ["*"]          #匹配的域名
              routes:                 #路由的实际配置
              - match: {}        #匹配内容
                  prefix: url                 #前缀匹配
                  safe_regex:
                    google_re2: {}      #使用谷歌正则
                    regex: 正则
                  path:                 #路径,精确匹配
                  headers:              #请求头
                  - name: X-canary
                    exact_match: "true"      #匹配字段的值
                  parameters:           #请求参数
                  exact_match: 值       #用于匹配首部的值
                  quert_parameters:     #匹配请求参数
                  - name: 'username'
                    string_match:
                      prefix: 'vip_'
                route: {}               #路由配置
                  cluster: local_cluster       #路由到指定集群
                  weighted_clusters:           #权重,路由的目标集群有多个时,做权重比例
                  cluster_header:              #根据请求头中的cluster_header的值确定目标集群
                  timeout:                      #超时时间
                  retry_policy:                #重试策略
                  rate_limits:                  #限速
                  cors: 跨域配置
                  request_mirror_policy:
                  prefix_rewrite:               #url重写
                  host_rewrite:                 #主机重写
                redirect: {}            #重定向
                  scheme_redirect:      #协议重定向
                  host_redirect:        #主机名重定向
                  path_redirect:        #路径重定向
                  port_redirect:        #端口重定向
                  prefix_redirect:      #url前缀重定向
                  https_redirect: true
                direct_response:            #直接响应
                  status:                #响应码
                  body:                  #body
                    inline_string: "ok\n"

案例

例1: http ingress配置
1)envoy配置文件:envoy.ymal
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: engress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: web_service_1
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: web_cluster }
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: web_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: web_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 172.31.3.11, port_value: 80 }
        - endpoint:
            address:
              socket_address: { address: 172.31.3.12, port_value: 80 }
2)docker-compose:
version: '3'

services:
  envoy:
    image: envoyproxy/envoy-alpine:v1.20.0
    volumes:
    - ./envoy.yml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.3.2
        aliases:
        - ingress

  webserver01:
    image: ikubernetes/demoapp:v1.0
    environment:
    - PORT=8080
    - HOST=127.0.0.1
    network_mode: "service:envoy"
    depends_on:
    - envoy

networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
      - subnet: 172.31.3.0/24

例2: http engress配置
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: engress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: web_service_1
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: web_cluster }
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: web_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: web_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 172.31.3.11, port_value: 80 }
        - endpoint:
            address:
              socket_address: { address: 172.31.3.12, port_value: 80 }

docker-compose:

version: '3.3'
services:
  envoy:
    image: envoyproxy/envoy-alpine:v1.20.0
    volumes:
    - ./envoy.yml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.3.2
        aliases:
        - front-proxy
    depends_on:
    - webserver01
    - webserver02

  client:
    image: ikubernetes/admin-toolbox:v1.0
    network_mode: "service:envoy"
    depends_on:
    - envoy

  webserver01:
    image: ikubernetes/demoapp:v1.0
    hostname: webserver01
    networks:
      envoymesh:
        ipv4_address: 172.31.3.11
        aliases:
        - webserver01

  webserver02:
    image: ikubernetes/demoapp:v1.0
    hostname: webserver02
    networks:
      envoymesh:
        ipv4_address: 172.31.3.12
        aliases:
        - webserver02

networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
      - subnet: 172.31.3.0/24 

例3:tcp代理
1)envoy.yaml
static_resources:
  listeners:
    name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.tcp_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
          stat_prefix: tcp
          cluster: local_cluster

  clusters:
  - name: local_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: local_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 172.31.1.11, port_value: 8080 }
        - endpoint:
            address:
              socket_address: { address: 172.31.1.12, port_value: 8080 }
2)docker-compose.yaml
version: '3.3'

services:
  envoy:
    image: envoyproxy/envoy-alpine:v1.18-latest
    volumes:
    - ./envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      envoymesh:
        ipv4_address: 172.31.1.2
        aliases:
        - front-proxy
    depends_on:
    - webserver01
    - webserver02

  webserver01:
    image: ikubernetes/demoapp:v1.0
    environment:
      - PORT=8080
    hostname: webserver01
    networks:
      envoymesh:
        ipv4_address: 172.31.1.11
        aliases:
        - webserver01

  webserver02:
    image: ikubernetes/demoapp:v1.0
    environment:
      - PORT=8080
    hostname: webserver02
    networks:
      envoymesh:
        ipv4_address: 172.31.1.12
        aliases:
        - webserver02

networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.1.0/24
posted @ 2023-12-08 14:48  suyanhj  阅读(248)  评论(0)    收藏  举报