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.
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:
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: 3Tres 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:
static_resources:
listeners:
- name: listener_http
address:
socket_address:
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:
route:
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:
admin:
address:
socket_address: 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.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>Envoy deja su firma en la respuesta:
HTTP/1.1 200 OK
server: envoy
x-envoy-upstream-service-time: 0Estàs llegint una vista prèvia.
Inicia la sessió amb Google per llegir la pàgina sencera.
Inicia la sessió amb GoogleNomés et demanarem que acceptis les condicions del servei.