服务网格剖析

Istio是怎么做的流量治理,执行的操作:

  • 使用istioctl为pod注入了sidecar
  • 创建了virtualservice和destinationrule

如何最终影响到了pod的访问行为?

回顾Nginx的流量转发

http {
    upstream backend {
        server backend1.example.com weight=2;
        server backend2.example.com weight=2;
        server backend3.example.com weight=1;
    }

    server {
        listen 80;
        server_name www.yuchaoit.cn;

        location / {
            proxy_pass http://backend;
        }
    }
}

因为nginx是代理层,可以转发请求,istio也实现了流量转发的效果,肯定也有代理层,并且识别了前面创建的虚拟服务中定义的规则。

sidecar代理

 1060  istioctl kube-inject -f bill.yml |kubectl apply -f -
 1061  istioctl kube-inject -f bill-v2.yml |kubectl apply -f -
 1062  istioctl kube-inject -f front-tomcat.yml |kubectl apply -f -

# 查看istio用了哪些镜像
image: docker.io/istio/proxyv2:1.15.3
name: istio-proxy

图解Istio进程

image-20230521154324816

[root@k8s-master ~/servicemesh]#kubectl -n istio-demo exec -it bill-service-v2-7d547769fc-h2g5x -c istio-proxy  -- sh
$ 
$ ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
istio-p+      1      0  0 05:38 ?        00:00:01 /usr/local/bin/pilot-agent proxy sidecar --domain istio-demo.svc.cluster.local 
istio-p+     17      1  0 05:38 ?        00:00:14 /usr/local/bin/envoy -c etc/istio/proxy/envoy-rev.json --drain-time-s 45 --drai
istio-p+     32      0  0 07:40 pts/0    00:00:00 sh
istio-p+     38     32  0 07:40 pts/0    00:00:00 ps -ef
$

istio-proxy 容器中有两个进程,即 pilot-agentenvoy。在上面的输出中,可以看到以下进程:

  1. pilot-agent 进程,PID 为 1,它是 Istio 的 Pilot Agent 组件,负责与 Istio 控制平面通信,获取配置信息并将其传递给 Envoy。
  2. envoy 进程,PID 为 17,它是 Istio 中的 Envoy 组件,负责处理进出 Pod 的网络流量。它根据 Pilot Agent 提供的配置信息进行路由、负载均衡和流量管理等操作。

这两个进程共同工作,使得 Istio 能够实现流量控制、策略管理和观测功能。

流量治理进程

在 Istio 中,当一个 Pod 被注入 Istio 时,会添加一个名为 istio-proxy 的 sidecar 容器。这个 sidecar 容器中包含了两个重要的进程:Pilot Agent 和 Envoy。

  1. Pilot Agent:Pilot Agent 是 Istio 的控制平面组件之一,负责与 Istio 控制平面通信,获取配置信息并将其传递给 Envoy。它监视服务注册表中的服务和实例变化,并为 Envoy 提供路由、负载均衡和流量管理等配置信息。
  2. Envoy:Envoy 是一个高性能、开源的边缘和服务代理。它是 Istio 中的数据平面组件,负责处理进出 Pod 的网络流量。Envoy 提供了丰富的流量管理功能,如负载均衡、故障恢复、故障注入、路由控制、熔断器、金丝雀发布等。

这种 sidecar 模式使得 Istio 能够对服务之间的流量进行控制和管理,实现了服务网格的功能,如流量路由、故障恢复、指标收集和安全策略等。 Istio 的控制平面通过 Pilot Agent 更新 Envoy 的配置,从而实现对流量的精确控制和管理。

image-20230521155317121

目前已知

  • 在istio网格内,每个Pod都会被注入一个envoy代理
  • envoy充当nginx的角色,做为proxy代理,负责接管pod的入口和出口流量

需要搞清楚几个问题

  • envoy是什么,如何工作
  • 为什么不用大家更熟悉的nginx

  • istio-init初始化容器作用是什么?

  • istio-proxy如何接管业务服务的出入口流量?

k8s资源转换理解

image-20230521160208945

查看sidecar与istiod通信

istiod控制平面

进程内的socket连接信息

[root@k8s-master ~/servicemesh]#kubectl -n istio-system exec -it istiod-64775594cd-qj46r -- sh
$ netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9876          0.0.0.0:*               LISTEN      1/pilot-discovery   
tcp6       0      0 :::8080                 :::*                    LISTEN      1/pilot-discovery   
tcp6       0      0 :::15010                :::*                    LISTEN      1/pilot-discovery   
tcp6       0      0 :::15012                :::*                    LISTEN      1/pilot-discovery   
tcp6       0      0 :::15014                :::*                    LISTEN      1/pilot-discovery   
tcp6       0      0 :::15017                :::*                    LISTEN      1/pilot-discovery

根据您提供的信息,以下是这些端口的作用:

  • 9876 端口:这是 Pilot Discovery 使用的本地监听地址,用于接收来自 Envoy 代理的服务发现请求和数据。
  • 8080 端口:这是 Pilot Discovery 使用的 IPv6 监听地址,用于接收来自 Envoy 代理的服务发现请求和数据。
  • 15010 端口:这是 Pilot Discovery 使用的 IPv6 监听地址,用于接收来自 Envoy 代理的运行时数据和指标信息。
  • 15012 端口:这是 Pilot Discovery 使用的 IPv6 监听地址,用于与 Envoy 代理进行配置和控制通信。
  • 15014 端口:这是 Pilot Discovery 使用的 IPv6 监听地址,用于接收来自 Envoy 代理的遥测数据。
  • 15017 端口:这是 Pilot Discovery 使用的 IPv6 监听地址,用于接收来自 Envoy 代理的追踪数据。

这些端口是 Istio 的控制平面组件 Pilot Discovery 使用的端口,用于与 Envoy 代理进行通信、配置和管理服务网格中的流量管理和控制。

pilot组件

Pilot 是 Istio 的一个核心组件之一,用于管理和控制服务网格中的流量路由、负载均衡、故障恢复和监控等功能。Pilot 负责与服务网格中的 Envoy 代理进行通信,并为它们提供配置和路由信息。

具体而言,Pilot 的主要功能包括:

  1. 服务发现:Pilot 通过与 Kubernetes、Consul 或其他服务发现机制集成,动态地发现和注册服务实例,并维护服务的网络拓扑结构。
  2. 路由管理:Pilot 定义和管理服务之间的流量路由规则,可以基于请求的源、目标、协议等属性进行灵活的路由配置。
  3. 负载均衡:Pilot 为服务实例提供负载均衡策略,根据配置和实时的运行时数据,将请求分发到可用的后端实例上,实现流量均衡。
  4. 故障恢复:Pilot 监控服务实例的健康状态,当出现故障或不可用情况时,能够自动进行故障转移和服务降级,保障服务的可用性和可靠性。
  5. 流量监控和追踪:Pilot 收集来自 Envoy 代理的遥测数据,用于监控和诊断服务的性能和行为,并与其他监控系统集成。

总之,Pilot 充当着服务网格中的流量管理和控制平面,通过与 Envoy 代理进行交互,提供灵活的流量路由和负载均衡策略,同时监控和管理服务的运行状态,以实现更高级别的服务治理和管理能力。

微服务pod信息

[root@k8s-master ~/servicemesh]#kubectl -n istio-demo get po -owide
NAME                               READY   STATUS    RESTARTS   AGE    IP             NODE         NOMINATED NODE   READINESS GATES
bill-service-v1-86b7c5cf4-2dx8x    2/2     Running   0          149m   10.244.2.171   k8s-slave1   <none>           <none>
bill-service-v2-7d547769fc-h2g5x   2/2     Running   0          149m   10.244.1.218   k8s-slave2   <none>           <none>
front-tomcat-v1-74b8ff99db-lbk79   2/2     Running   0          148m   10.244.2.172   k8s-slave1   <none>           <none>
[root@k8s-master ~/servicemesh]#

image-20230521160728612

探索envoy

Envoy 是为云原生应用设计的代理。

Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高,它通过一款单一的软件满足了我们的众多需求,而不需要我们去搭配一些工具混合使用。

image-20230521195118659

Sidecar 模式

在软件架构中,Sidecar 附加到主应用,或者叫父应用上,以扩展/增强功能特性,同时 Sidecar 与主应用是松耦合的。

这就像是如下图所示的边三轮摩托车那样,将边车(Sidecar)安装在一辆摩托车上,就变成了边三轮摩托车。

每辆边三轮摩托车都有自己的边车。类似同样的方式,Sidecar 服务共享其父应用程序的主机。

对于应用程序的每个实例,边车的实例被部署并与其一起托管。

img

使用 Sidecar 模式的好处有很多:

  • 通过将服务治理相关功能抽象到不同的层来降低微服务的代码复杂性
  • 在运行时环境和编程语言方面,Sidecar 独立于其主要应用程序,不需要为每个微服务编写服务治理功能的代码,减少了微服务架构中的代码重复。
  • Sidecar 可以访问与主应用程序相同的资源。例如,Sidecar 可以监视 Sidecar 本身和主应用程序使用的系统资源。
  • 由于它靠近主应用程序,因此在它们之间进行通信时没有明显的延迟。
  • 降低了应用与底层平台的耦合度。

Envoy是什么

Envoy 是为云原生应用设计的代理,可以在服务旁运行,以平台无关的方式提供必要的特性,所有到服务的流量都通过 Envoy 代理,这里 Envoy 扮演的就是 Sidecar 的角色。

Envoy 是一个开源的高性能边缘和服务代理,由 Lyft 公司开发并于2017年发布。它是 CNCF(Cloud Native Computing Foundation)的毕业项目之一,也是 Istio 服务网格的核心代理组件之一。

Envoy 的设计目标是提供一个可扩展、灵活和高性能的代理,用于处理微服务架构中的网络通信。它具有以下特点和功能:

  1. 基于事件驱动的异步架构:Envoy 使用事件驱动的架构,采用异步处理模型,能够处理大量并发连接和高吞吐量的请求。
  2. 功能丰富的代理:Envoy 支持多种网络协议和功能,包括 HTTP/1.1、HTTP/2、gRPC、TCP、TLS、WebSocket 等,能够满足复杂的通信需求。
  3. 负载均衡和流量路由:Envoy 提供灵活的负载均衡算法和流量路由规则,可以根据各种条件和策略,将请求分发到后端服务实例,并支持动态的配置更新。
  4. 故障恢复和超时控制:Envoy 能够监测后端服务的健康状态,实时调整流量路由,进行故障转移和负载均衡,同时支持超时控制和断路器模式,提高服务的可靠性和稳定性。
  5. 安全和认证:Envoy 提供强大的安全功能,包括传输层安全(TLS)加密、身份认证、访问控制、流量加密等,保护服务通信的安全性。
  6. 可观测性和遥测数据收集:Envoy 支持实时的请求级别的统计数据收集,包括请求流量、延迟、错误率等指标,可以与监控和追踪系统集成,提供丰富的运维和故障排查能力。

总之,Envoy 是一个功能强大、高性能和可扩展的代理,广泛应用于云原生环境中的微服务架构中,为服务间通信提供可靠、安全和高效的网络代理功能。它作为 Istio 服务网格的核心代理之一,发挥着重要的作用,支持流量管理、故障恢复、安全控制和可观测性等关键功能。

Envoy对比Nginx理解

Envoy 和 Nginx 是两种常用的代理服务器,用于处理网络通信和负载均衡,但在设计和功能上存在一些区别。

  1. 架构和异步处理:Envoy 是基于事件驱动的异步架构设计,采用多线程和非阻塞的方式处理请求,具有高并发和高吞吐量的能力。而 Nginx 则采用多进程或多线程的模型,每个请求都会被阻塞处理,适合处理较少的连接数和低延迟要求。
  2. 功能特性:Envoy 是一个功能丰富的代理,支持多种协议和功能,包括 HTTP/1.1、HTTP/2、gRPC、TCP、TLS、WebSocket 等,并提供了负载均衡、流量路由、故障恢复、超时控制、安全认证等功能。Nginx 主要专注于 HTTP 和反向代理功能,并提供了缓存、压缩、SSL/TLS 支持等特性。
  3. 配置和动态更新:Envoy 支持动态配置,可以通过配置中心实时更新代理的路由规则、负载均衡策略等信息,具有较强的灵活性和可扩展性。Nginx 的配置一般静态化,需要手动修改配置文件并重载才能生效。
  4. 可观测性和管理接口:Envoy 提供了丰富的管理接口和统计指标,可以实时监测和收集请求级别的数据,方便运维和故障排查。Nginx 也提供了一些基本的统计信息和管理接口,但相对较少。
  5. 社区和生态系统:Envoy 是 CNCF(Cloud Native Computing Foundation)的毕业项目,拥有活跃的社区支持和广泛的应用案例,与云原生技术和容器编排平台紧密结合。Nginx 则具有更长的历史和广泛的应用场景,特别在 Web 服务器领域有较高的知名度和用户基础。

总体而言,Envoy 更适用于复杂的微服务架构和服务网格环境,提供了更丰富的功能和灵活的配置管理能力。Nginx 则更适合用作传统的 Web 服务器和反向代理,具有简单易用和高性能的特点。选择使用哪种代理取决于具体的需求和场景。

Envoy和nginx使用区别

Envoy和Nginx在使用上有一些区别,主要取决于它们的设计和功能特性。

  1. 用途和场景:Envoy主要用于构建高度可扩展和灵活的服务网格架构,适用于微服务和容器化环境,它提供了丰富的功能和强大的配置管理能力。Nginx主要用作Web服务器和反向代理,适用于传统的Web应用程序和静态内容的分发。
  2. 配置和动态更新:Envoy支持动态配置,可以使用配置中心实时更新代理的路由规则、负载均衡策略等信息,而Nginx的配置一般静态化,需要手动修改配置文件并重载才能生效。
  3. 协议和功能支持:Envoy支持多种协议和功能,包括HTTP/1.1、HTTP/2、gRPC、TCP、TLS、WebSocket等,并提供了负载均衡、流量路由、故障恢复、超时控制、安全认证等功能。Nginx主要专注于HTTP和反向代理功能,并提供了缓存、压缩、SSL/TLS支持等特性。
  4. 架构和性能:Envoy采用事件驱动的异步架构设计,具有高并发和高吞吐量的能力,适应于大规模的网络流量处理。Nginx采用多进程或多线程的模型,每个请求都会被阻塞处理,适用于较少的连接数和低延迟要求。
  5. 可观测性和管理接口:Envoy提供了丰富的管理接口和统计指标,可以实时监测和收集请求级别的数据,方便运维和故障排查。Nginx也提供了一些基本的统计信息和管理接口,但相对较少。

综上所述,Envoy更适用于构建复杂的微服务架构和服务网格,具有更丰富的功能和灵活的配置管理能力。Nginx更适用于传统的Web服务器和反向代理,具有简单易用和高性能的特点。在选择使用哪种代理时,需要根据具体的需求和场景进行评估和决策。

理解静态Envoy作用

好比你用nginx

  • 写proxy配置
  • 启动nginx
  • 访问nginx
$ docker run -d --name envoy -v `pwd`/envoy.yaml:/etc/envoy/envoy.yaml -p 10000:10000 envoyproxy/envoy-alpine:v1.15.2

$ curl localhost:10000

具体envoy.yml

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.router
  clusters:
  - name: some_service
    connect_timeout: 2s
    type: STATIC
    lb_policy: ROUND_ROBIN
    hosts: [{ socket_address: { address: 10.104.245.11, port_value: 9999 }}]

这段配置是Envoy的配置文件示例,其中包含了admin和static_resources两个部分。

  • admin部分定义了Envoy的管理接口相关配置。access_log_path指定了访问日志的路径,这里是/tmp/admin_access.log。address定义了Envoy管理接口的地址,使用的是本地地址127.0.0.1和端口9901。
  • static_resources部分定义了Envoy的静态资源配置,包括listeners和clusters。在这个示例中,只定义了一个listener和一个cluster。
    • listener定义了Envoy监听的地址和端口。这里监听的是0.0.0.0的地址和端口号10000。filter_chains定义了过滤器链,这里只有一个过滤器envoy.http_connection_manager,用于处理HTTP连接管理。其中的config定义了该过滤器的配置,包括stat_prefix用于指定统计信息的前缀,codec_type表示编解码类型,route_config定义了路由配置。
    • route_config定义了路由配置,包括name、virtual_hosts和http_filters。在这里只定义了一个虚拟主机local_service,用于匹配所有的域名。该虚拟主机下有一个路由,使用的是prefix匹配方式,当请求的路径为"/"时,会被路由到名为some_service的cluster。
    • http_filters定义了HTTP过滤器,这里只使用了envoy.router过滤器,用于进行请求的路由。
    • clusters定义了集群配置,这里定义了名为some_service的集群。connect_timeout指定了连接超时时间,type为STATIC表示静态集群,lb_policy指定了负载均衡策略为ROUND_ROBIN,hosts指定了该集群下的后端主机,这里是10.104.245.11的地址和端口号9999。

总体而言,这段配置示例定义了一个Envoy实例,监听端口10000,并通过路由将请求转发到名为some_service的后端集群。

图解静态配置

image-20230521202202372

访问envoy

通过这个实验,可以理解,envoy用起来,nginx作用很类似。

[root@k8s-master ~/servicemesh]#kubectl -n istio-demo get svc -owide
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE    SELECTOR
bill-service   ClusterIP   10.104.245.11   <none>        9999/TCP   2d1h   service=bill-service

[root@k8s-master ~/servicemesh]#docker run -d --name envoy -v `pwd`/envoy.yml:/etc/envoy/envoy.yaml -p 10000:10000 envoyproxy/envoy-alpine:v1.15.2
3710bcde1935599c84e63c32224981e5b90e722d2120d6c1f64bafb906adea9e
[root@k8s-master ~/servicemesh]#


[root@k8s-master ~/servicemesh]#docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS        PORTS                                           NAMES
3710bcde1935   envoyproxy/envoy-alpine:v1.15.2   "/docker-entrypoint.…"   2 seconds ago   Up 1 second   0.0.0.0:10000->10000/tcp, :::10000->10000/tcp   envoy

[root@k8s-master ~/servicemesh]#curl 127.0.0.1:10000
hello, this is bill-service-v2

envoy网络代理流程

  1. 监听器(Listener):代理程序通过监听指定的地址和端口,等待客户端的请求。监听器可以配置多个,用于监听不同的地址和端口。
  2. 过滤器(Filter):过滤器是代理程序的核心逻辑处理单元,它可以对请求数据进行微处理。根据请求的层次(L3/L4/L7),过滤器可以进行不同级别的处理,例如添加或校验请求头部信息。
  3. 路由配置(Route Config):路由配置决定了将请求转发到哪个后端集群。它包括定义路由规则和匹配条件,使得代理程序能够根据请求的特征进行智能路由。
  4. 集群(Cluster):集群表示服务提供方的后端服务器集群。通过服务发现机制,代理程序可以定位集群中的成员,并从中选择一个成员来转发请求。负载均衡策略决定了如何选择后端成员,以实现请求的负载均衡。

综合起来,网络代理程序通过监听器获取请求流量,使用过滤器对请求进行微处理,根据路由配置将请求转发到后端集群,然后通过负载均衡策略选择一个后端成员来处理请求。

这样,代理程序就起到了中间层的作用,能够提供流量控制、负载均衡、安全校验等功能。

Envoy架构

image-20230521202346286

Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。

其中每一个环节可以静态配置,也可以动态服务发现,也就是所谓的 xDS。这里的 x 是一个代词,类似云计算里的 XaaS 可以指代 IaaS、PaaS、SaaS 等。

配置结构

Envoy 的整体配置结构如下:

{
  "node": "{...}",
  "static_resources": "{...}",
  "dynamic_resources": "{...}",
  "cluster_manager": "{...}",
  "hds_config": "{...}",
  "flags_path": "...",
  "stats_sinks": [],
  "stats_config": "{...}",
  "stats_flush_interval": "{...}",
  "watchdog": "{...}",
  "tracing": "{...}",
  "runtime": "{...}",
  "layered_runtime": "{...}",
  "admin": "{...}",
  "overload_manager": "{...}",
  "enable_dispatcher_stats": "...",
  "header_prefix": "...",
  "stats_server_version_override": "{...}",
  "use_tcp_for_dns_lookups": "..."
}
  • node : 节点标识,配置的是 Envoy 的标记信息,management server 利用它来标识不同的 Envoy 实例。参考 core.Node
  • static_resources : 定义静态配置,是 Envoy 核心工作需要的资源,由 ListenerClusterSecret 三部分组成。参考 config.bootstrap.v2.Bootstrap.StaticResources
  • dynamic_resources : 定义动态配置,通过 xDS 来获取配置。可以同时配置动态和静态。
  • cluster_manager : 管理所有的上游集群。它封装了连接后端服务的操作,当 Filter 认为可以建立连接时,便调用 cluster_manager 的 API 来建立连接。cluster_manager 负责处理负载均衡、健康检查等细节。
  • hds_config : 健康检查服务发现动态配置。
  • stats_sinks : 状态输出插件。可以将状态数据输出到多种采集系统中。一般通过 Envoy 的管理接口 /stats/prometheus 就可以获取 Prometheus 格式的指标,这里的配置应该是为了支持其他的监控系统。
  • stats_config : 状态指标配置。
  • stats_flush_interval : 状态指标刷新时间。
  • watchdog : 看门狗配置。Envoy 内置了一个看门狗系统,可以在 Envoy 没有响应时增加相应的计数器,并根据计数来决定是否关闭 Envoy 服务。
  • tracing : 分布式追踪相关配置。
  • runtime : 运行时状态配置(已弃用)。
  • layered_runtime : 层级化的运行时状态配置。可以静态配置,也可以通过 RTDS 动态加载配置。
  • admin : 管理接口。
  • overload_manager : 过载过滤器。
  • header_prefix : Header 字段前缀修改。例如,如果将该字段设为 X-Foo,那么 Header 中的 x-envoy-retry-on 将被会变成 x-foo-retry-on
  • use_tcp_for_dns_lookups : 强制使用 TCP 查询 DNS。可以在 Cluster 的配置中覆盖此配置。

过滤器

Envoy 进程中运行着一系列 Inbound/Outbound 监听器(Listener),Inbound 代理入站流量,Outbound 代理出站流量。Listener 的核心就是过滤器链(FilterChain),链中每个过滤器都能够控制流量的处理流程。过滤器链中的过滤器分为两个类别:

  • 网络过滤器(Network Filters): 工作在 L3/L4,是 Envoy 网络连接处理的核心,处理的是原始字节,分为 ReadWriteRead/Write 三类。
  • HTTP 过滤器(HTTP Filters): 工作在 L7,由特殊的网络过滤器 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 请求。它将原始字节转换成 HTTP 格式,从而可以对 HTTP 协议进行精确控制。

除了 HTTP connection manager 之外,还有一种特别的网络过滤器叫 Thrift ProxyThrift 是一套包含序列化功能和支持服务通信的 RPC 框架,详情参考维基百科。Thrift Proxy 管理了两个 Filter:RouterRate Limit

除了过滤器链之外,还有一种过滤器叫监听器过滤器(Listener Filters),它会在过滤器链之前执行,用于操纵连接的元数据。这样做的目的是,无需更改 Envoy 的核心代码就可以方便地集成更多功能。例如,当监听的地址协议是 UDP 时,就可以指定 UDP 监听器过滤器。

根据上面的分类,Envoy 过滤器的架构如下图所示:

image-20230521202458219

envoy的xDS(发现服务)

Envoy使用xDS作为一种动态配置机制,用于实现服务发现和配置管理。xDS是可扩展的,其中的"x"代表了不同的服务发现和配置管理协议,如ADS(Aggregated Discovery Service)和CDS(Cluster Discovery Service)。

启动配置文件可以采用静态配置或动态配置方式。静态配置将所有配置信息直接写入配置文件中,在启动时加载。动态配置需要提供一个xDS服务端,用于动态生成Envoy所需的配置信息。xDS服务端提供服务发现接口,使Envoy能够根据服务的实时变化动态调整配置。

当Envoy接收到请求时,它会经过一系列的FilterChain,包括L3/L4/L7的过滤器。这些过滤器对请求进行微处理,如校验请求头部、修改请求内容等。然后,请求会被路由到指定的集群,并通过负载均衡策略选择一个目标地址。最后,请求会被转发到选定的目标地址。

在整个过程中,每个环节都可以使用静态配置或动态服务发现来配置。通过xDS机制,Envoy能够根据实时的服务发现信息进行动态调整和配置管理,实现灵活的流量控制、负载均衡和安全管理等功能。

image-20230521202812049

解释xDS种类

在Envoy中,LDS(Listener Discovery Service)、CDS(Cluster Discovery Service)和EDS(Endpoint Discovery Service)是xDS(服务发现)协议的一部分,用于动态配置和更新Envoy的监听器、集群和端点信息。

  • LDS(Listener Discovery Service):LDS用于配置和更新Envoy的监听器。它通过向Envoy提供监听器的配置信息,包括监听地址、协议和过滤器链等,来动态地更新Envoy的监听器配置。当监听器配置发生变化时,LDS会通知Envoy进行相应的更新。
  • CDS(Cluster Discovery Service):CDS用于配置和更新Envoy的集群。它通过向Envoy提供集群的配置信息,包括集群的名称、负载均衡策略和后端地址等,来动态地更新Envoy的集群配置。当集群配置发生变化时,CDS会通知Envoy进行相应的更新。
  • EDS(Endpoint Discovery Service):EDS用于配置和更新Envoy的端点信息。它通过向Envoy提供端点的配置信息,包括每个集群的后端地址和健康状态等,来动态地更新Envoy的端点配置。当端点配置发生变化时,EDS会通知Envoy进行相应的更新。

通过使用LDS、CDS和EDS,Envoy可以实现动态的服务发现和负载均衡。它可以与服务注册中心(如Kubernetes的Service、Consul等)集成,根据服务的动态变化来自动更新Envoy的配置,以便正确地路由请求到后端服务的实例。这种动态配置的能力使得Envoy在大规模和动态变化的环境中具有高度的灵活性和可扩展性。

小结

在 Istio 中,LDS、CDS 和 EDS 的配置是通过 Istio Pilot(istiod)来提供的。

  • LDS(Listener Discovery Service):Envoy 通过 LDS 获取监听器配置信息,包括监听地址和对应的 filter chain 配置。
  • CDS(Cluster Discovery Service):Envoy 通过 CDS 获取集群配置信息,包括每个集群的名称、类型、负载均衡策略以及后端服务的主机和端口信息。
  • EDS(Endpoint Discovery Service):Envoy 通过 EDS 获取端点配置信息,包括每个集群的后端服务的实例和地址信息。

这些配置信息由 Istio Pilot(istiod)收集和管理。Pilot 通过与服务注册和发现组件(如 Kubernetes API Server、Consul)进行交互,获取服务的详细信息,然后将其转化为 Envoy 所需的配置格式,并通过 xDS 协议提供给 Envoy。

通过这种方式,Istio 可以动态地管理和更新 Envoy 的配置,以适应服务实例的变化、路由规则的变更和负载均衡策略的调整。Istio Pilot 充当着配置中心的角色,为 Envoy 提供了配置信息,使其能够正确地路由流量和与后端服务进行通信。

这里我们初学可以不用去看,其背后都是由envoy从istiod控制平面读取信息,自动更新代理配置

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2024-03-31 19:43:52

results matching ""

    No results matching ""