【每日一个云原生小技巧 #37】Envoy 简介

2023-12-05 17:47:47 浏览数 (1)

Envoy 是一种开源边缘和服务代理,专为云原生应用程序设计。它在现代微服务架构中被广泛使用,因为它提供了灵活的网络功能,包括动态服务发现、负载均衡、TLS终止、HTTP/2和gRPC代理、健康检查、故障注入以及丰富的度量收集。以下是关于 Envoy 的更多详细信息:

使用场景

  1. 服务网格:在服务网格中,Envoy 常用作每个服务的边车代理,提供网络通信控制和观测功能。
  2. API网关:Envoy 可以作为入口网关管理入站流量,提供路由、鉴权和安全功能。
  3. 边缘代理:用于边缘服务,如处理外部流量和提供缓存功能。

使用技巧

  1. 配置管理:使用动态服务发现(例如与 Consul 集成)自动化服务注册和发现。
  2. 流量管理:利用 Envoy 的路由规则和负载均衡策略来控制流量分配。
  3. 观测性:集成 Prometheus 或其他监控工具收集和观察度量指标。
  4. 故障注入:用于测试的故障注入能力,以增强服务的弹性。

使用案例

基于 Envoy 的服务网格

  • 场景描述:在微服务架构中,使用 Envoy 作为每个服务的边车代理,以实现服务间的安全、可靠通信。
  • 示例代码:部署一个简单的服务网格配置,其中包括服务A和服务B,以及它们的 Envoy 代理。
代码语言:javascript复制
# Envoy 配置示例
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      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.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                codec_type: AUTO
                stat_prefix: ingress_http
                route_config:
                  name: local_route
                  virtual_hosts:
                    - name: backend
                      domains:
                        - "*"
                      routes:
                        - match:
                            prefix: "/"
                          route:
                            cluster: service_a
  clusters:
    - name: service_a
      connect_timeout: 0.25s
      type: LOGICAL_DNS
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: service_a
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: service_a
                      port_value: 80
  • 解释:此配置为 Envoy 启动一个 HTTP 监听器,将所有入站流量路由到名为 service_a 的服务。

API 网关

  • 场景描述:使用 Envoy 作为入口网关管理对外部 API 的访问,包括路由、鉴权和限流。
  • 示例代码:配置 Envoy 作为 API 网关,代理外部请求到后端服务。
代码语言:javascript复制
# Envoy API 网关配置示例
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
    # 监听器配置 ...
  clusters:
    # 后端服务集群配置 ...

http_filters:
  - name: envoy.filters.http.jwt_authn
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_auth

n.v3.JwtAuthentication
      providers:
        provider1:
          issuer: "https://example.com"
          audiences:
            - "api"
          forward: true
          remote_jwks:
            http_uri:
              uri: "https://example.com/.well-known/jwks.json"
              cluster: jwks_cluster
            cache_duration:
              seconds: 300
  • 解释:此配置示例展示了如何通过 JWT 鉴权集成,为 API 请求添加安全验证。

通过这些案例和技巧,可以看到 Envoy 如何灵活地应用于不同的网络和服务场景中,从而提升微服务架构的可靠性和可管理性。

0 人点赞