Envoy的全面介绍

发布时间:2023-05-24

Envoy是一个开源的云原生代理,它可以扩展和定制,以适应现代应用程序的需求。它是Cloud Native Computing Foundation(CNCF)的一部分,广泛用于云原生应用程序。Envoy代理作为一个独立的服务模块运行,它通过HTTP和其他协议在应用程序之间进行通信,并提供了一些高级功能。本文将从多个方面介绍Envoy代理。

一、基本介绍

Envoy是一个使用C++编写的高性能、现代化的代理,可扩展性极高,并且可以处理大量的网络流量,同时支持TCP、HTTP/1.1、HTTP/2和gRPC。除此之外,Envoy还支持多语言,并且可以用于多种部署环境,如Kubernetes、Mesos和Amazon ECS等。如果你想使用Envoy作为sidecar,那么你可以轻松地在它提供的各种配置选项中进行选择,还可以对其进行个性化定制。

二、主要特性

Envoy有许多特点,其中一些是:

  1. 智能路由:它可以自动选择最佳的路由来处理应用程序流量,这有助于保持网络的可用性和可扩展性。
  2. 流量管理:Envoy可以有效地控制和管理网络流量,这有助于避免服务器或网络上的过载问题。
  3. 服务发现:它提供了一种动态服务发现机制,以便在运行时自动将请求路由到所需的服务。
  4. 安全性:Envoy提供了高级安全功能,如服务之间的认证和授权、加密和解密、负载均衡以及漏洞和拒绝服务攻击的防护等。

三、Envoy的主要用途

Envoy代理被广泛应用于以下方面:

  1. Service Mesh:它可以在Service Mesh中作为sidecar部署,从而提供透明的流量管理和安全功能。
  2. API Gateway:Envoy代理可以作为API Gateway来提供API管理服务,如路由、身份验证、限流等。
  3. 边缘代理:Envoy代理可以用作边缘代理,在边缘处管理网络流量,以便更好地控制网络和应用程序流量。

四、示例代码

下面是一个使用Envoy作为Sidecar的基本示例。

# Sidecar 部署
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    name: myapp-pod
spec:
  containers:
    - name: myapp-container
      image: myapp
      ports:
        - containerPort: 80
    - name: envoy-container
      image: envoyproxy/envoy
      command: ['/usr/local/bin/envoy']
      args:
        - '-c'
        - '/etc/envoy/envoy.yaml'
      ports:
        - containerPort: 8000
        - containerPort: 8443
      volumeMounts:
        - name: envoy-config
          mountPath: /etc/envoy
  volumes:
    - name: envoy-config
      configMap:
        name: envoy-config
        items:
          - key: envoy.yaml
            path: envoy.yaml
# Envoy 配置
static_resources:
  listeners:
    - name: listener_0
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 8000
      filter_chains:
        - filters:
            - name: envoy.http_connection_manager
              config:
                codec_type: auto
                stat_prefix: ingress_http
                route_config:
                  virtual_hosts:
                    - name: myapp_vhost
                      domains:
                        - "*"
                      routes:
                        - match:
                            prefix: "/api"
                          route:
                            cluster: myapp_cluster
                            timeout: 0s
                          retry_policy:
                            retry_on: connect-failure
                        - match:
                            prefix: "/"
                          route:
                            cluster: myapp_cluster
                            timeout: 0s
                          retry_policy:
                            retry_on: connect-failure
                http_filters:
                  - name: envoy.router
  clusters:
    - name: myapp_cluster
      connect_timeout: 0.25s
      type: strict_dns
      lb_policy: round_robin
      http2_protocol_options: {}
      hosts:
        - socket_address:
            address: myapp-service
            port_value: 80

Envoy代理作为一个可扩展和高性能的代理,为现代应用程序的网络处理提供了一种可靠的解决方案。无论是在Service Mesh、API Gateway还是边缘代理等方面,Envoy代理在很多情况下都表现得非常优秀,特别是在处理高流量和复杂场景的网络请求时。