Utusan. 1. Pengenalan

salam sejahtera! Ini adalah artikel pendek yang menjawab soalan: "apa itu utusan?", "mengapa ia diperlukan?" dan "di mana untuk bermula?".

Apa ini?

Envoy ialah pengimbang L4-L7 yang ditulis dalam C++, memfokuskan pada prestasi tinggi dan ketersediaan. Di satu pihak, ini dalam beberapa cara adalah analog nginx dan haproxy, setanding dengan prestasinya. Sebaliknya, ia lebih berorientasikan kepada seni bina perkhidmatan mikro dan mempunyai fungsi yang tidak lebih buruk daripada pengimbang java dan go, seperti zuul atau traefik.

Jadual perbandingan haproxy/nginx/utusan, ia tidak mendakwa sebagai kebenaran mutlak, tetapi memberikan gambaran umum.

nginx
haproksi
utusan
traefik

bintang di github
11.2k/cermin
1.1k/cermin
12.4k
27.6k

tertulis dalam
C
C
C + +
go

API
tiada
soket sahaja/tolak
dataplane/tarik
tarik

pemeriksaan kesihatan aktif
tiada
ya
ya
ya

Penjejakan terbuka
pemalam luaran
tiada
ya
ya

J.W.T.
pemalam luaran
tiada
ya
tiada

lanjutan
Lua/C
Lua/C
Lua/C++
tiada

Apa untuk

Ini adalah projek muda, terdapat banyak perkara yang hilang, beberapa dalam alfa awal. Tetapi utusan, juga disebabkan oleh masa mudanya, sedang berkembang pesat dan sudah mempunyai banyak ciri menarik: konfigurasi dinamik, banyak penapis siap sedia, antara muka mudah untuk menulis penapis anda sendiri.
Bidang aplikasi mengikuti dari ini, tetapi pertama-tama terdapat 2 antipattern:

  • Gegaran statik.

Hakikatnya pada masa ini dalam utusan tiada sokongan caching. Orang Google sedang mencuba ini untuk membetulkan. Idea akan dilaksanakan sekali masuk utusan semua kehalusan (tajuk zoo) pematuhan RFC, dan untuk pelaksanaan tertentu buat antara muka. Tetapi buat masa ini ia bukan alpha, seni bina sedang dalam perbincangan, PR terbuka (semasa saya menulis artikel PR, PR membeku, tetapi perkara ini masih relevan).

Buat masa ini, gunakan nginx untuk statik.

  • Konfigurasi statik.

Anda boleh menggunakannya, tetapi utusan Bukan untuk itu ia dicipta. Ciri dalam konfigurasi statik tidak akan didedahkan. Terdapat banyak detik:

Apabila mengedit konfigurasi dalam yaml, anda akan tersilap, memarahi pembangun kerana verbosity dan berfikir bahawa konfigurasi nginx/haproxy, walaupun kurang berstruktur, adalah lebih ringkas. Itulah maksudnya. Konfigurasi Nginx dan Haproxy dicipta untuk mengedit dengan tangan, dan utusan untuk penjanaan daripada kod. Keseluruhan konfigurasi diterangkan dalam protobuf, menjananya daripada fail proto adalah lebih sukar untuk membuat kesilapan.

Canary, senario penggunaan b/g dan banyak lagi biasanya dilaksanakan hanya dalam konfigurasi dinamik. Saya tidak mengatakan bahawa ini tidak boleh dilakukan secara statik, kita semua melakukannya. Tetapi untuk ini anda perlu memakai tongkat, dalam mana-mana pengimbang, dalam utusan termasuk.

Tugas yang penting bagi Utusan:

  • Pengimbangan trafik dalam sistem yang kompleks dan dinamik. Ini termasuk jaringan perkhidmatan, tetapi ia tidak semestinya satu-satunya.
  • Keperluan untuk fungsi pengesanan teragih, kebenaran kompleks atau fungsi lain yang tersedia dalam utusan di luar kotak atau dilaksanakan dengan mudah, tetapi dalam nginx/haproxy anda perlu dikelilingi oleh lua dan pemalam yang meragukan.

Kedua-duanya, jika perlu, memberikan prestasi tinggi.

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

Utusan diedarkan dalam binari sahaja sebagai imej docker. Imej itu sudah mengandungi contoh konfigurasi statik. Tetapi kami berminat dengannya hanya untuk memahami strukturnya.

konfigurasi statik utusan.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

Konfigurasi dinamik

Apakah masalah yang kita cari penyelesaian? Anda tidak boleh hanya memuatkan semula konfigurasi pengimbang beban di bawah beban; masalah "kecil" akan timbul:

  • Pengesahan konfigurasi.

Konfigurasi boleh menjadi besar, ia boleh menjadi sangat besar, jika kita membebankan semuanya sekaligus, kemungkinan ralat di suatu tempat meningkat.

  • Sambungan berpanjangan.

Apabila memulakan pendengar baharu, anda perlu menjaga sambungan yang berjalan pada yang lama; jika perubahan berlaku dengan kerap dan terdapat sambungan yang tahan lama, anda perlu mencari kompromi. Hello, kubernetes masuk ke nginx.

  • Pemeriksaan kesihatan aktif.

Jika kami mempunyai pemeriksaan kesihatan yang aktif, kami perlu menyemak semula kesemuanya dalam konfigurasi baharu sebelum menghantar trafik. Kalau di hulu banyak, ini mengambil masa. Hello haproxy.

Bagaimana ini diselesaikan dalam utusanDengan memuatkan konfigurasi secara dinamik, mengikut model pool, anda boleh membahagikannya kepada bahagian yang berasingan dan tidak memulakan semula bahagian yang tidak berubah. Contohnya, pendengar, yang mahal untuk dimulakan semula dan jarang berubah.

Konfigurasi utusan (daripada fail di atas) mempunyai entiti berikut:

  • pendengar β€” pendengar tergantung pada ip/port tertentu
  • hos maya - hos maya dengan nama domain
  • laluan - peraturan pengimbangan
  • kelompok β€” sekumpulan hulu dengan parameter pengimbangan
  • titik akhir β€” alamat contoh huluan

Setiap entiti ini serta beberapa entiti lain boleh diisi secara dinamik; untuk ini, konfigurasi menentukan alamat perkhidmatan dari mana konfigurasi akan diterima. Perkhidmatan ini boleh REST atau gRPC, gRPC adalah lebih baik.

Perkhidmatan tersebut dinamakan masing-masing: LDS, VHDS, RDS, CDS dan EDS. Anda boleh menggabungkan konfigurasi statik dan dinamik, dengan had bahawa sumber dinamik tidak boleh ditentukan dalam satu statik.

Untuk kebanyakan tugas, sudah cukup untuk melaksanakan tiga perkhidmatan terakhir, ia dipanggil ADS (Aggregated Discovery Service), untuk Java dan pergi ke sana adalah pelaksanaan siap sedia bagi pesawat data gRPC di mana anda hanya perlu mengisi objek daripada sumber anda.

Konfigurasi mengambil bentuk berikut:

konfigurasi dinamik utusan.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

Pada permulaan utusan dengan konfigurasi ini, ia akan menyambung ke satah kawalan dan cuba meminta konfigurasi RDS, CDS dan EDS. Bagaimana proses interaksi berlaku diterangkan di sini.

Pendek kata, utusan menghantar permintaan yang menunjukkan jenis sumber yang diminta, versi dan parameter nod. Sebagai tindak balas, ia menerima sumber dan versi; jika versi pada satah kawalan tidak berubah, ia tidak bertindak balas.
Terdapat 4 pilihan interaksi:

  • Satu aliran gRPC untuk semua jenis sumber, status penuh sumber dihantar.
  • Aliran berasingan, keadaan penuh.
  • Satu aliran, keadaan tambahan.
  • Aliran berasingan, keadaan tambahan.

xDS tambahan membolehkan anda mengurangkan trafik antara satah kawalan dan utusan, ini berkaitan untuk konfigurasi besar. Tetapi ia merumitkan interaksi; permintaan itu mengandungi senarai sumber untuk berhenti melanggan dan melanggan.

Contoh kami menggunakan ADS - satu aliran untuk RDS, CDS, EDS dan mod bukan tambahan. Untuk mendayakan mod tambahan, anda perlu menentukan api_type: DELTA_GRPC

Memandangkan permintaan mengandungi parameter nod, kami boleh menghantar sumber yang berbeza ke satah kawalan untuk keadaan yang berbeza utusan, ini sesuai untuk membina jaringan perkhidmatan.

Warmup

Pada utusan pada permulaan atau apabila menerima konfigurasi baharu daripada satah kawalan, proses pemanasan sumber dilancarkan. Ia dibahagikan kepada pemanasan pendengar dan pemanasan kelompok. Yang pertama dilancarkan apabila terdapat perubahan dalam RDS/LDS, yang kedua apabila CDS/EDS. Ini bermakna jika hanya hulu berubah, pendengar tidak dicipta semula.

Semasa proses memanaskan badan, sumber bergantung dijangka daripada satah kawalan semasa tamat masa. Jika tamat masa berlaku, permulaan tidak akan berjaya dan pendengar baharu tidak akan mula mendengar pada port.
Perintah permulaan: EDS, CDS, pemeriksaan kesihatan aktif, RDS, LDS. Dengan pemeriksaan kesihatan aktif didayakan, trafik akan naik ke hulu hanya selepas satu pemeriksaan kesihatan yang berjaya.

Jika pendengar dicipta semula, yang lama akan masuk ke dalam keadaan PARIT dan akan dipadamkan selepas semua sambungan ditutup atau tamat masa tamat --drain-time-s, lalai 10 minit.

Untuk diteruskan.

Sumber: www.habr.com

Tambah komen