Escriu per cercar…

Envoy

Envoy es el proxy que se encarga de localizar los servicios, repartir las peticiones y reintentarlas, para que la aplicación no lo tenga que hacer.

S'ensenya a
Seguretat i alta disponibilitatServidors ProxyASIX

Introducción

Un servicio que usa otro tiene un problema antes de enviar ninguna petición: saber dónde está.

Y cuando lo ha resuelto, tiene unos cuantos más.

Si hay tres copias del servicio, ¿a cuál llama? Si una está caída, ¿cómo se entera? Si la petición falla, ¿la vuelve a probar? ¿Cuántas veces?

Puedes escribir todo esto dentro de la aplicación. Cada aplicación, en su lenguaje, con sus errores.

O lo puedes sacar fuera, y poner un proxy que sabe hacerlo.

Envoy es ese proxy: un proxy pensado para ir entre servicios, no entre el usuario y el web.

Entorno de trabajo

Crea el directorio envoy y, dentro, el fichero compose.yaml:

yaml
services:
  envoy:
    image: envoyproxy/envoy:v1.39.0
    ports:
      - 10000:10000
      - 9901:9901
    volumes:
      - ./envoy.yaml:/etc/envoy/envoy.yaml

  web:
    image: nginx
    deploy:
      replicas: 3

Tres servidores web iguales y un Envoy delante.

La configuración

Envoy separa dos cosas que en los proxies normales van juntas: por dónde entra una petición y hacia dónde sale.

  • Un listener es un puerto donde escucha, con las reglas que dicen qué petición va a qué sitio.
  • Un cluster es un grupo de servidores que hacen el mismo trabajo.

Crea envoy.yaml:

yaml
static_resources:
  listeners:
    - name: listener_http
      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
                stat_prefix: ingress_http
                route_config:
                  virtual_hosts:
                    - name: web
                      domains: ["*"]
                      routes:
                        - match: { prefix: "/" }
                          route: { cluster: web }
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
    - name: web
      type: STRICT_DNS
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: web
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address: { address: web, port_value: 80 }

admin:
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

El type: STRICT_DNS es la parte que resuelve el problema del principio.

Envoy no tiene una lista de IPs: tiene un nombre, web, y lo vuelve a resolver cada poco tiempo.

Compose registra las tres réplicas con ese nombre, así que Envoy descubre tres.

shell
docker compose up -d
curl localhost:10000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Envoy deja su firma en la respuesta:

shell
curl -sI localhost:10000
HTTP/1.1 200 OK
server: envoy
x-envoy-upstream-service-time: 0

Estàs llegint una vista prèvia.

Inicia la sessió amb Google per llegir la pàgina sencera.

Inicia la sessió amb Google

Només et demanarem que acceptis les condicions del servei.