Envoy. 1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ! Π­Ρ‚ΠΎ нСбольшая ΡΡ‚Π°Ρ‚ΡŒΡ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π½Π° вопросы: "Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ envoy?", "Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½?" ΠΈ "с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ?".

Π§Ρ‚ΠΎ это

Envoy β€” это L4-L7 балансировщик написанный Π½Π° Π‘++, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΎΠ³ nginx ΠΈ haproxy, соизмСримый с Π½ΠΈΠΌΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΎΠ½ большС ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ ΠΌΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ Π½Π΅ Ρ…ΡƒΠΆΠ΅ балансировщиков Π½Π° java ΠΈ go, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ zuul ΠΈΠ»ΠΈ traefik.

Π’Π°Π±Π»ΠΈΡ†Π° сравнСния haproxy/nginx/envoy, ΠΎΠ½Π° Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΡƒΡŽ истину, Π½ΠΎ Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ.

nginx
haproxy
envoy
traefik

Π·Π²Π΅Π·Π΄ Π½Π° github
11.2k/mirror
1.1k/mirror
12.4k
27.6k

написан на
C
C
C++
go

API
Π½Π΅Ρ‚
socket only/push
dataplane/pull
pull

active healthcheck
Π½Π΅Ρ‚
Π΄Π°
Π΄Π°
Π΄Π°

Open tracing
внСшний плагин
Π½Π΅Ρ‚
Π΄Π°
Π΄Π°

JWT
внСшний плагин
Π½Π΅Ρ‚
Π΄Π°
Π½Π΅Ρ‚

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅
Lua/C
Lua/C
Lua/C++
Π½Π΅Ρ‚

Π—Π°Ρ‡Π΅ΠΌ

Π­Ρ‚ΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² Π½Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π½Π΅Ρ‚, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Ρ€Π°Π½Π½Π΅ΠΉ Π°Π»ΡŒΡ„Π΅. Но envoy, Π² Ρ‚ΠΎΠΌ числС Π·Π° счСт молодости, быстро развиваСтся ΠΈ ΡƒΠΆΠ΅ сСйчас ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсных возмоТностСй: Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ², простой интСрфСйс для написания своих Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ².
Из этого Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‚ области примСнСния, Π½ΠΎ для Π½Π°Ρ‡Π°Π»Π° 2 Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°:

  • ΠžΡ‚Π΄Π°Ρ‡Π° статики.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² envoy Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. РСбята ΠΈΠ· google ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. ИдСя Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π° envoy всё тонкости(Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊ Ρ…Π΅Π΄Π΅Ρ€ΠΎΠ²) соотвСтствия RFC, Π° для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ интСрфСйс. Но ΠΏΠΎΠΊΠ° это Π΄Π°ΠΆΠ΅ Π½Π΅ Π°Π»ΡŒΡ„Π°, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π² обсуТдСнии, PR ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ (ΠΏΠΎΠΊΠ° я писал ΡΡ‚Π°Ρ‚ΡŒΡŽ PR Π²ΠΌΠ΅Ρ€ΠΆΠΈΠ»ΠΈ, Π½ΠΎ этот ΠΏΡƒΠ½ΠΊΡ‚ Π΅Ρ‰Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½).

А ΠΏΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ для статики nginx.

  • БтатичСская конфигурация.

МоТно Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ envoy Π±Ρ‹Π» создан Π½Π΅ для этого. ВозмоТности Π² статичСской ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ раскрыты. ΠœΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ:

РСдактируя ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² yaml, Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ nginx/haproxy, ΠΏΡƒΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ структурированы, Π½ΠΎ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Π΅Π΅. Π’ этом ΠΈ ΡΡƒΡ‚ΡŒ. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Nginx ΠΈ Haproxy создавалась ΠΏΠΎΠ΄ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€ΡƒΠΊΠ°ΠΌΠΈ, Π° Ρƒ envoy ΠΏΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ· ΠΊΠΎΠ΄Π°. Вся конфигурация описана Π² protobuf, гСнСрируя Π΅Ρ‘ ΠΏΠΎ proto Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ canary, b/g дСплоя ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² динамичСской ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π― Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΡŽ Ρ‡Ρ‚ΠΎ это нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² статикС, ΠΌΡ‹ всС это Π΄Π΅Π»Π°Π΅ΠΌ. Но для этого Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π»ΠΎΠΆΠΈΡ‚ΡŒΡΡ костылями, Π² любом ΠΈΠ· балансСров, Π² envoy Π² Ρ‚ΠΎΠΌ числС.

Π—Π°Π΄Π°Ρ‡ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Envoy Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ:

  • Балансировка Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π² слоТных ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹Ρ… систСмах. Бюда ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ service mesh, Π½ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½.
  • ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° распрСдСлСнной трассировки, слоТной Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Π² envoy ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΈΠ»ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ рСализовываСтся, Π° Π² nginx/haproxy Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π»ΠΎΠΆΠΈΡ‚ΡŒΡΡ lua ΠΈ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ.

И Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΈ нСобходимости ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Envoy распространяСтся Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ docker ΠΎΠ±Ρ€Π°Π·. Π’ ΠΎΠ±Ρ€Π°Π·Π΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ статичСской ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Но Π½Π°ΠΌ ΠΎΠ½ интСрСсСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для понимания структуры.

envoy.yaml статичСская конфигурация

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite: www.google.com
                  cluster: service_google
          http_filters:
          - name: envoy.router
  clusters:
  - name: service_google
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_google
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.google.com
                port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
        sni: www.google.com

ДинамичСская конфигурация

РСшСниС ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ? НСльзя просто Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ балансировщика ΠΏΠΎΠ΄ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ "нСбольшиС" ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Валидация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большой, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большой, Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ вСсь Ρ€Π°Π·ΠΎΠΌ, ΡˆΠ°Π½ΡΡ‹ Ρ‡Ρ‚ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ ошибка Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‚.

  • Π”ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ соСдинСния.

ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ листСнСра, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ соСдинСниях Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π° старом, Ссли измСнСния происходят часто ΠΈ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ соСдинСния, придСтся ΠΈΡΠΊΠ°Ρ‚ΡŒ компромисс. ΠŸΡ€ΠΈΠ²Π΅Ρ‚, kubernetes ingress Π½Π° nginx.

  • АктивныС хСлсчСки.

Если Ρƒ нас Π΅ΡΡ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ хСлсчСки, Π½Π°Π΄ΠΎ Π±Ρ‹ ΠΈΡ… всС ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. Если апстримов ΠΌΠ½ΠΎΠ³ΠΎ, это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ врСмя. ΠŸΡ€ΠΈΠ²Π΅Ρ‚, haproxy.

Как это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² envoy, подгруТая ΠΊΠΎΠ½Ρ„ΠΈΠ³ динамичСски, ΠΏΠΎ ΠΏΡƒΠ» ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ которая Π½Π΅ мСнялась. НапримСр листСнСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΡ€ΠΎΠ³ΠΎ, Π° мСняСтся ΠΎΠ½ Ρ€Π΅Π΄ΠΊΠΎ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ envoy (ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π²Ρ‹ΡˆΠ΅) ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сущности:

  • listener β€” листСнСр висящий Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ip/ΠΏΠΎΡ€Ρ‚Ρƒ
  • virtual host β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ хост ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½Π°
  • route β€” ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ балансировки
  • cluster β€” Π³Ρ€ΡƒΠΏΠΏΠ° апстримов с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ балансировки
  • endpoint β€” адрСс инстанса апстрима

ΠšΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· этих сущностСй плюс Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ динамичСски, для этого Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ указываСтся адрСс сСрвиса ΠΎΡ‚ ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΊΠΎΠ½Ρ„ΠΈΠ³. БСрвис ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ REST Π»ΠΈΠ±ΠΎ gRPC, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gRPC.

БСрвисы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ соотвСтствСнно: LDS, VHDS, RDS, CDS ΠΈ EDS. МоТно ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ динамичСский рСсурс нСльзя ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² статичСском.

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡ достаточно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСдниС Ρ‚Ρ€ΠΈ сСрвиса, ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ADS (Aggregated Discovery Service), для java ΠΈ go имССтся готовая имплСмСнтация gRPC dataplane Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· своСго источника.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

envoy.yaml динамичСская конфигурация

dynamic_resources:
  ads_config:
    api_type: GRPC
    grpc_services:
      envoy_grpc:
        cluster_name: xds_clr
  cds_config:
    ads: {}
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          rds:
            route_config_name: local_route
            config_source:
              ads: {}
          http_filters:
          - name: envoy.router
  clusters:
  - name: xds_clr
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_clr
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: xds
                port_value: 6565

ΠŸΡ€ΠΈ запускС envoy с этим ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ ΠΊ control-plane ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ RDS, CDS ΠΈ EDS. Как происходит процСсс взаимодСйствия описано здСсь.

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ, envoy ΡˆΠ»Π΅Ρ‚ запрос, с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ рСсурса, вСрсиСй ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π½ΠΎΠ΄Ρ‹. Π’ ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ рСсурс ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ, Ссли Π½Π° control-plane вСрсия Π½Π΅ помСнялась, ΠΎΠ½ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚.
Π•ΡΡ‚ΡŒ 4 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° взаимодСйствия:

  • Один gRPC стрим Π½Π° всС Ρ‚ΠΈΠΏΡ‹ рСсурсов, присылаСтся ΠΏΠΎΠ»Π½ΠΎΠ΅ состояниС рСсурса.
  • Π Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ стримы, ΠΏΠΎΠ»Π½ΠΎΠ΅ состояниС.
  • Один стрим, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС.
  • Π Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ стримы, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС.

Incremental xDS позволяСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΌΠ΅ΠΆΠ΄Ρƒ control-plane ΠΈ envoy, это Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Но услоТняСт взаимодСйствиС, Π² запросС пСрСдаСтся список рСсурсов для отписки ΠΈ подписки.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ADS β€” ΠΎΠ΄ΠΈΠ½ стрим для RDS, CDS, EDS ΠΈ Π½Π΅ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ api_type: DELTA_GRPC

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² запросС Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½ΠΎΠ΄Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π° control-plane ΠΏΡ€ΠΈΡΡ‹Π»Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ рСсурсы для Ρ€Π°Π·Π½Ρ‹Ρ… инстансов envoy, это ΡƒΠ΄ΠΎΠ±Π½ΠΎ для построСния service mesh.

Warmup

На envoy ΠΏΡ€ΠΈ стартС ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ control-plane запускаСтся процСсс warmup рСсурсов. Он Ρ€Π°Π·Π΄Π΅Π»Π΅Π½, Π½Π° listener warmup ΠΈ cluster warmup. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запускаСтся ΠΏΡ€ΠΈ измСнСниях Π² RDS/LDS, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈ CDS/EDS. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ апстримы, листСнСр Π½Π΅ пСрСсоздаСтся.

Π’ процСссС ΠΏΡ€ΠΎΠ³Ρ€Π΅Π²Π°, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ зависимыС рСсурсы ΠΎΡ‚ control-plane Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°. Если Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ Π²Ρ‹ΡˆΠ΅Π», инициализация Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ, Π½ΠΎΠ²Ρ‹ΠΉ листСнСр Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚.
ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ: EDS, CDS, active health check, RDS, LDS. ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… хСлсчСках, Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π½Π° апстрим, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ хСлсчСка.

Если пСрСсоздавался листСнСр, старый ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС DRAIN, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ послС закрытия всСх соСдинСний ΠΈΠ»ΠΈ истСчСнии Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° --drain-time-s, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 10 ΠΌΠΈΠ½ΡƒΡ‚.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ слСдуСт.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com