Элч. 1. Танилцуулга

Мэндчилгээ! Энэ бол "элч гэж юу вэ?", "Яагаад хэрэгтэй вэ?" гэсэн асуултуудад хариулсан богино нийтлэл юм. болон "хаанаас эхлэх вэ?".

Энэ юу вэ

Envoy нь C++ хэл дээр бичигдсэн, өндөр гүйцэтгэл, хүртээмжтэй байдалд чиглэсэн L4-L7 тэнцвэржүүлэгч юм. Нэг талаараа энэ нь nginx ба haproxy-ийн аналог бөгөөд гүйцэтгэлийн хувьд тэдэнтэй харьцуулж болно. Нөгөөтэйгүүр, энэ нь микро үйлчилгээний архитектурт илүү чиглэсэн бөгөөд zuul эсвэл traefik гэх мэт java, go тэнцвэржүүлэгчээс муугүй функцтэй.

Haproxy/nginx/envoy-ийн харьцуулсан хүснэгт, энэ нь туйлын үнэн гэж мэдэгддэггүй, гэхдээ ерөнхий дүр зургийг өгдөг.

nginx
haproxy
элч
траффик

github дээрх одууд
11.2к/толин тусгал
1.1к/толин тусгал
12.4k
27.6k

-д бичсэн
C
C
C ++
go

API
ямар ч
зөвхөн залгуур/түлхэх
мэдээллийн хавтгай/татах
Татах

идэвхтэй эрүүл мэндийн үзлэг
ямар ч
Хэрэв тийм бол
Хэрэв тийм бол
Хэрэв тийм бол

Мөрийг нээх
гадаад залгаас
ямар ч
Хэрэв тийм бол
Хэрэв тийм бол

J.W.T.
гадаад залгаас
ямар ч
Хэрэв тийм бол
ямар ч

өргөтгөл
Луа/С
Луа/С
Lua/C++
ямар ч

Яагаад

Энэ бол залуу төсөл, маш олон зүйл дутуу байна, зарим нь альфа эхний шатанд байна. Гэхдээ элч, мөн залуу наснаасаа болоод хурдацтай хөгжиж байгаа бөгөөд олон сонирхолтой шинж чанаруудтай: динамик тохиргоо, олон бэлэн шүүлтүүр, өөрийн шүүлтүүрийг бичих энгийн интерфейс.
Хэрэглээний талбарууд нь үүнээс үүдэлтэй боловч эхлээд 2 эсрэг загвар байдаг:

  • Статик ухрах.

Яг үнэндээ бол яг одоо элч кэш хийх дэмжлэг байхгүй. Google-ийн залуус үүнийг оролдож байна засах. Санаа нэг л удаа хэрэгжинэ элч RFC-ийн нийцлийн бүх нарийн ширийн зүйлийг (амьтны хүрээлэнгийн толгой), тодорхой хэрэгжилтийн хувьд интерфэйс хийдэг. Гэхдээ одоохондоо альфа ч биш, архитектурын талаар хэлэлцэж байна. PR нээлттэй (би PR нийтлэл бичиж байх үед PR царцсан, гэхдээ энэ нь хамааралтай хэвээр байна).

Одоохондоо nginx-ийг статикийн хувьд ашигла.

  • Статик тохиргоо.

Та үүнийг ашиглаж болно, гэхдээ элч Үүний тулд бүтээгдээгүй. Статик тохиргооны онцлогууд ил гарахгүй. Олон мөчүүд байдаг:

Yaml дээр тохиргоог засварлахдаа та андуурч, хөгжүүлэгчдийг нарийн ярилаа гэж загнаж, nginx/haproxy тохиргоонууд нь бүтэц багатай ч илүү товч юм гэж бодоорой. Гол нь энэ. Nginx болон Haproxy-ийн тохиргоог гараар засварлах зорилгоор бүтээсэн бөгөөд элч кодоос үүсгэх. Бүх тохиргоог дотор тайлбарласан болно протобуф, үүнийг прото файлуудаас үүсгэх нь алдаа гаргахад илүү хэцүү байдаг.

Canary, b/g байршуулах хувилбарууд болон бусад зүйлсийг ихэвчлэн зөвхөн динамик тохиргоонд хэрэгжүүлдэг. Үүнийг статик байдлаар хийх боломжгүй гэж би хэлээгүй, бид бүгд үүнийг хийдэг. Гэхдээ үүний тулд та аль ч тэнцвэржүүлэгчид таяг зүүх хэрэгтэй элч орно.

Төлөөлөгчийн зайлшгүй хийх ёстой ажлууд:

  • Нарийн төвөгтэй, динамик систем дэх хөдөлгөөний тэнцвэржүүлэх. Үүнд үйлчилгээний тор багтсан боловч энэ нь цорын ганц байх албагүй.
  • Хуваарилагдсан мөрдөх функц, нарийн төвөгтэй зөвшөөрөл эсвэл бусад функциональ хэрэгцээ элч хайрцагнаас гарсан эсвэл тохиромжтой байдлаар хэрэгжсэн боловч nginx/haproxy-д та lua болон эргэлзээтэй залгаасуудаар хүрээлэгдсэн байх хэрэгтэй.

Шаардлагатай бол хоёулаа өндөр гүйцэтгэлийг хангана.

Яаж энэ ажлыг хийдэг

Элчийг хоёртын файлд зөвхөн докерын дүрс хэлбэрээр тараадаг. Зураг нь статик тохиргооны жишээг агуулж байна. Гэхдээ бид зөвхөн бүтцийг ойлгохын тулд үүнийг сонирхож байна.

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 nginx дээр нэвтэрч байна.

  • Эрүүл мэндийн идэвхтэй үзлэг.

Хэрэв бид эрүүл мэндийн үзлэгт идэвхтэй хамрагдсан бол урсгалыг илгээхээсээ өмнө бүгдийг нь шинэ тохиргоонд давхар шалгах хэрэгтэй. Хэрэв дээд урсгал ихтэй бол энэ нь цаг хугацаа шаарддаг. Сайн уу гапрокси.

Үүнийг яаж шийдэж байна элчПул загварын дагуу тохиргоог динамикаар ачаалснаар та үүнийг салангид хэсгүүдэд хувааж, өөрчлөгдөөгүй хэсгийг дахин эхлүүлэхгүй байх боломжтой. Жишээлбэл, дахин эхлүүлэхэд үнэтэй, ховор өөрчлөгддөг сонсогч.

Тохиргоо элч (дээрх файлаас) дараах байгууллагуудтай:

  • сонсогч - тодорхой ip/порт дээр өлгөөтэй сонсогч
  • виртуал хост - домэйн нэрээр виртуал хост
  • маршрут - тэнцвэржүүлэх дүрэм
  • кластер - тэнцвэржүүлэх параметр бүхий дээд урсгалын бүлэг
  • төгсгөлийн цэг - дээд талын жишээ хаяг

Эдгээр нэгж бүрийг болон бусад заримыг динамикаар бөглөх боломжтой бөгөөд үүний тулд тохиргоо нь тохиргоог хүлээн авах үйлчилгээний хаягийг зааж өгдөг. Үйлчилгээ нь REST эсвэл gRPC байж болно, gRPC нь илүү тохиромжтой.

Үйлчилгээг LDS, VHDS, RDS, CDS, EDS зэрэг нэрлэсэн. Та статик болон динамик тохиргоог нэгтгэж болно, гэхдээ динамик нөөцийг статик дээр зааж өгөх боломжгүй гэсэн хязгаарлалттай.

Ихэнх ажлуудын хувьд сүүлийн гурван үйлчилгээг хэрэгжүүлэхэд хангалттай бөгөөд тэдгээрийг ADS (Aggregated Discovery Service) гэж нэрлэдэг. java болон тэнд очиж gRPC өгөгдлийн самбарын бэлэн хэрэгжилт байгаа бөгөөд та зөвхөн эх сурвалжаасаа объектуудыг бөглөх хэрэгтэй.

Тохиргоо нь дараах хэлбэртэй байна.

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

Эхэлж байхдаа элч Энэ тохиргооны тусламжтайгаар энэ нь хяналтын хавтгайд холбогдож, RDS, CDS болон EDS тохиргоог хүсэхийг оролдох болно. Харилцааны үйл явц хэрхэн явагддагийг тайлбарласан болно энд.

Товчхондоо, элч Хүсэж буй нөөцийн төрөл, зангилааны хувилбар, параметрүүдийг харуулсан хүсэлтийг илгээдэг. Хариуд нь энэ нь эх сурвалж болон хувилбарыг хүлээн авдаг бөгөөд хэрэв хяналтын хавтгай дээрх хувилбар өөрчлөгдөөгүй бол хариу өгөхгүй.
Харилцааны 4 сонголт байдаг:

  • Бүх төрлийн нөөцөд зориулсан нэг gRPC урсгал, нөөцийн бүрэн статусыг илгээдэг.
  • Тусдаа урсгалтай, бүрэн нөхцөлтэй.
  • Нэг урсгал, өсөлтийн төлөв.
  • Тусдаа урсгал, өсөлтийн төлөв.

Өсөн нэмэгдэж буй xDS нь удирдлагын хавтгай ба хоорондын хөдөлгөөнийг багасгах боломжийг олгодог элч, энэ нь том тохиргоонд хамааралтай. Гэхдээ энэ нь харилцан үйлчлэлийг улам хүндрүүлдэг; хүсэлт нь бүртгэлийг цуцлах, бүртгүүлэх нөөцийн жагсаалтыг агуулдаг.

Манай жишээнд ADS ашигладаг - RDS, CDS, EDS болон нэмэгдэлгүй горимд зориулсан нэг урсгал. Нэмэлт горимыг идэвхжүүлэхийн тулд та зааж өгөх хэрэгтэй api_type: DELTA_GRPC

Хүсэлт нь зангилааны параметрүүдийг агуулж байгаа тул бид өөр өөр тохиолдлуудад өөр өөр нөөцийг хяналтын хавтгай руу илгээж болно элч, энэ нь үйлчилгээний тор барихад тохиромжтой.

Халуун дулаан

дээр элч эхлүүлэх үед эсвэл удирдлагын хавтгайгаас шинэ тохиргоог хүлээн авах үед нөөцийг халаах процессыг эхлүүлнэ. Үүнийг сонсогч халаалт, кластер халаалт гэж хуваадаг. Эхнийх нь RDS/LDS-д өөрчлөлт гарсан үед, хоёр дахь нь CDS/EDS-д өөрчлөлт орсон үед нээгддэг. Энэ нь зөвхөн дээд урсгал өөрчлөгдвөл сонсогч дахин бий болохгүй гэсэн үг юм.

Халаалтын явцад хяналтын хавтгайгаас завсарлагааны үед хамааралтай нөөцийг хүлээж байна. Хэрэв хугацаа дууссан бол эхлүүлэх ажиллагаа амжилтгүй болж, шинэ сонсогч порт дээр сонсож эхлэхгүй.
Эхлэх дараалал: EDS, CDS, идэвхтэй эрүүл мэндийн үзлэг, RDS, LDS. Идэвхтэй эрүүл мэндийн үзлэгийг идэвхжүүлсэн үед зөвхөн нэг удаа эрүүл мэндийн үзлэг амжилттай болсны дараа замын хөдөлгөөн дээшээ гарна.

Хэрэв сонсогчийг дахин үүсгэсэн бол хуучин нь DRAIN төлөвт шилжих бөгөөд бүх холболт хаагдсан эсвэл хугацаа дууссаны дараа устах болно. --drain-time-s, анхдагч 10 минут.

Үргэлжлүүлэх.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх