zoukankan      html  css  js  c++  java
  • Envoy 配置

    1. envoy 配置概述

    启动时从Bootstrap配置文件中加载初始配置

    • 支持动态配置:

      • xDS API

        ◆ 从配置文件加载配置

        ◆ 从管理服务器(Management Server)基于xds协议加载配置

      • runtime

        ◆ 某些关键特性(Feature flags)保存为key/value数据

        ◆ 支持多层配置和覆盖机制

      • 启用全动态配置机制后,仅极少数场景需要重新启动Envoy进程

    ​ ◆ 支持热重启

    2. Envoy的配置方式

    Envoy的架构支持非常灵活的配置方式:简单部署场景可以使用纯静态配置,而更复杂的部署场景则可以逐步添加需要的动态配置机制;

    • 纯静态配置:用户自行提供侦听、过滤器链、集群及HTTP路由(http代理场景),上游端点的发

    • 现仅可通过DNS服务进行,且配置的重新加载必须通过内置的热重启(hot restart)完成;

    • 仅使用EDS:EDS提供的端点发现功能可有效规避DNS的限制(响应中的最大记录数等);

    • 使用EDS和CDS:CDS能够让Envoy以优雅的方式添加、更新和删除上游集群,于是,初始配置时,Envoy无须事先了解所有上游集群;

    • EDS、CDS和RDS:动态发现路由配置;RDS与EDS、CDS一起使用时,为用户提供了构建复杂路由拓扑的能力(流量转移、蓝/绿部署等);

    • EDS、CDS、RDS和LDS:动态发现侦听器配置,包括内嵌的过滤器链;启用此四种发现服务后,除了较罕见的配置变动、证书轮替或更新Envoy程序之外,几乎无须再热重启Envoy;

    • EDS、CDS、RDS、LDS和SDS:动态发现侦听器密钥相关的证书、私钥及TLS会话票据,以及对证书验证逻辑的配置(受信任的根证书和撤销机制等);

    3. envoy配置中的重要概念

    Bootstrap配置中几个重要的基础概念

    • node:节点标识,以呈现给管理服务器并且例如用于标识目的;

    • static_resources:静态配置的资源,用于配置静态的listener、cluster和secret;

    • dynamic_resources:动态配置的资源,用于配置基于xDS API获取listener、cluster和secret配 置的lds_config、cds_config和ads_config;

    • admin:Envoy内置的管理接口;

    • tracing:分布式跟踪;

    • layered_runtime:层级化的运行时,支持使用RTDS从管理服务器动态加载;

    • hds_config:使用HDS从管理服务器加载上游主机健康状态检测相关的配置;

    • overload_manager:过载管理器;

    • stats_sinks:统计信息接收器;

      {
      "node": "{...}",
      "static_resources": "{...}",
      "dynamic_resources": "{...}",
      "cluster_manager": "{...}",
      "hds_config": "{...}",
      "flags_path": "...",
      "stats_sinks": [],
      "stats_config": "{...}",
      "stats_flush_interval": "{...}",
      "stats_flush_on_admin": "...",
      "watchdog": "{...}",
      "watchdogs": "{...}",
      "tracing": "{...}",
      "layered_runtime": "{...}",
      "admin": "{...}",
      "overload_manager": "{...}",
      "enable_dispatcher_stats": "...",
      "header_prefix": "...",
      "stats_server_version_override": "{...}",
      "use_tcp_for_dns_lookups": "...",
      "bootstrap_extensions": [],
      "fatal_actions": [],
      "default_socket_interface": "..."
      }
      

    4. 侦听器和集群配置基础

    侦听器

    • 接收客户端请求的入口端点,通常由监听的套接字及调用的过滤器链所定义

    • 代理类的过滤器负责路由请求,例如tcp_proxy和http_connection_manager等

    集群

    • 一组上游主机的逻辑组合

    • 每个主机映射为集群中的一个端点

    • 下游的请求被调度至上游主机

    listeners

    监听器是可以接受来自下游客户端的连接的命名网络位置(如port,unix domain socket等)。Envoy配置支持在单个进程内有任意数量的监听器。通常我们建议每台机器运行一个Envoy,无论配置的监听器数量如何。这样可以更容易的操作,并有单一的统计来源

    备注:目前 Envoy 只支持 TCP /udp 监听器

    Listener配置

    监听器配置可以在引导程序配置中静态声明,也可以通过监听器发现服务(Listerner Discovert Service/LDS)动态声明。

    顶级 Envoy 配置包含一个监听器列表。每个独立的监听器配置具有以下格式:

    {
    "name": "...",
    "address": "{...}",
    "stat_prefix": "...",
    "filter_chains": [],
    "use_original_dst": "{...}",
    "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": "{...}"
    }
    

    network(L3/L4)filters

    网络过滤器访问和操作L4连接上的原始数据,即TCP数据包

    ◼ 例如,TCP代理过滤器将客户端连接数据路由到上游主机,并生成连接统计信息等

    Enovy内置了许多L3/L4过滤器,例如

    ◼代理类:TCP Proxy、HTTP connection manager、Thrift Proxy、Mongo proxy、Dubbo Proxy、ZooKeeper proxy、MySQL proxy和Redis proxy等,

    ◼其它:Client TLS authentication、Rate limit、Role Based Access Control (RBAC) Network Filter和Upstream Cluster from SNI等;

    HTTP connection manager

    ◼ HTTP connection manager自身是L3/L4过路器,它能够将原始字节转换为HTTP级别消息

    和事件(例如,headers和body等)

    ◼ 它还处理所有HTTP连接和请求共有的功能,例如访问日志记录、请求ID生成和跟踪、

    请求/响应头操作、路由表管理和统计信息等;

    ◼ 与L3/L4过滤器堆栈相似,Envoy还支持在HTTP连接管理器中使用HTTP级过滤器堆栈;

    • HTTP过滤器在L7运行,它们访问和操作HTTP请求和响应;例如,gRPC-JSON Transcoder Filter为gRPC后端公开REST API,并将请求和响应转换为相应的格式;

    • 常用的HTTP过路器有Router、Rate limit、Health check、Gzip和Fault Injection等;

    upstream clusters

    Envoy可配置任意数量的上游集群,并使用Cluster Manager进行管理;

    ◼ 由集群管理器负责管理的各集群可以由用户静态配置,也可借助于CDS API动态获取;

    ◼集群中的每个成员由endpoint进行标识,它可由用户静态配置,也可通过EDS或DNS服务动态发现;

    • Static:静态配置

    • Strict DNS:严格DNS,Envoy将持续和异步地解析指定的DNS目标,并将DNS结果中的返回的每

    个IP地址视为上游集群中可用成员;

    • Logical DNS:逻辑DNS,集群仅使用在需要启动新连接时返回的第一个IP地址,而非严格获取

    DNS查询的结果并假设它们构成整个上游集群;适用于必须通过DNS访问的大规模Web服务集群;

    • Original destination:当传入连接通过iptables的REDIRECT或TPROXY target或使用代理协议重定向到Envoy时,可以使用原始目标集群;

    • Endpoint discovery service (EDS):EDS是一种基于GRPC或REST-JSON API的xDS管理服务器获取集群成员的服务发现方式;

    • Custom cluster:Envoy还支持在集群配置上的cluster_type字段中指定使用自定义集群发现机制;

    ◼ 每个Cluster主要由集群名称,以及集群中的端点(通常是提供服务的IP地址和端口)所组成

    ◼ Envoy Cluster支持纯静态定义方式来指定端点,也允许以动态方式发现各端点,甚至还支持自定义的发现机制

    ◼ 支持用户定义多种高级功能,例如,负载均衡策略、主动健康状态检查、被动健康状态检查和断路器等;

    {
    "transport_socket_matches": [],
    "name": "...",
    "alt_stat_name": "...",
    "type": "...",
    "cluster_type": "{...}",
    "eds_cluster_config": "{...}",
    "connect_timeout": "{...}",
    "per_connection_buffer_limit_bytes": "{...}",
    "lb_policy": "...",
    "load_assignment": "{...}",
    "health_checks": [],
    "max_requests_per_connection": "{...}",
    "circuit_breakers": "{...}",
    "upstream_http_protocol_options": "{...}",
    "common_http_protocol_options": "{...}",
    "http_protocol_options": "{...}",
    "http2_protocol_options": "{...}",
    "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": "{...}",
    "cleanup_interval": "{...}",
    "upstream_bind_config": "{...}",
    "lb_subset_config": "{...}",
    "ring_hash_lb_config": "{...}",
    "maglev_lb_config": "{...}",
    "original_dst_lb_config": "{...}",
    "least_request_lb_config": "{...}",
    "common_lb_config": "{...}",
    "transport_socket": "{...}",
    "metadata": "{...}",
    "protocol_selection": "...",
    "upstream_connection_options": "{...}",
    "close_connections_on_host_health_failure": "...",
    "ignore_health_on_host_removal": "...",
    "filters": [],
    "track_timeout_budgets": "...",
    "upstream_config": "{...}",
    "track_cluster_stats": "{...}",
    "preconnect_policy": "{...}",
    "connection_pool_per_downstream_connection": "..."
    }
    
    

    Envoy 线程模型

    Envoy使用单进程/多线程的架构模型,一个主线程(Main thread)负责实现各类管理任务,而一些工作线程(Worker threads)则负责执行监听、过滤和转发等代理服务器的核心功能

    ◼ 主线程:负责Envoy程序的启动和关闭、xDS API调用处理(包括DNS、健康状态检测和集群管理等)、运行时配置、统计数据刷新、管理接口维护和其它线程管理(信号和热重启等)等,相关的所有事件均以异步非阻塞模式完成;

    ◼ 工作线程:默认情况下,Envoy根据当前主机CPU核心数来创建等同数量的工作线程,不过,管理员也可以通过程序选项--concurrency具体指定;每个工作线程运行一个非阻塞型事件循环,负责为每个侦听器监听指定的套接字、接收新请求、为每个连接初始一个过滤器栈并处理此连接整个生命周期中的所有事件;

    ◼ 文件刷写线程:Envoy写入的每个文件都有一个专用、独立的阻塞型刷写线程,当工作线程需要写入文件时,数据实际上被移入内存缓冲区,最终通过文件刷写线程同步至文件中

    Envoy连接处理

    Envoy通过侦听器监听套接字并接收客户端请求,而Envoy的所有工作线程会同时共同监听用户配置的所有套接字,对于某次连接请求,由内核负责将其派发至某个具体的工作线程处理; 随后,相关的工作线程基于特定的处理逻辑分别由相关组件依次完成连接管理;

  • 相关阅读:
    有向无环图描述表达式 (a+b)*((a+b)/a)至少需要的顶点数目
    图的深度优先是 树的先序遍历的推广。 广度优先
    leader failed to send out heartbeat on time; took too long, leader is overloaded likely from slow disk
    优化 并发
    最终一致和强一致性缓存实践
    Go语言逆向初探 原创 半个大西瓜 看雪学院 2021-06-23
    中通快递的云原生改造之路 施尧 InfoQ 2021-06-23
    Stable Minimum Storage Merging by Symmetric Comparisons Pok-Son Kim1? and Arne Kutzner2
    A Method for the Construction of Minimum-Redundancy Codes
    滴滴基于Binlog的采集架构与实践 原创 滴滴技术团队 滴滴技术 2021-06-22
  • 原文地址:https://www.cnblogs.com/baozexu/p/15634531.html
Copyright © 2011-2022 走看看