දූතයා. 1. හැඳින්වීම

සුභ පැතුම්! මෙය "දූතයා යනු කුමක්ද?", "එය අවශ්ය වන්නේ ඇයි?" යන ප්රශ්නවලට පිළිතුරු සපයන කෙටි ලිපියකි. සහ "ආරම්භ කළ යුත්තේ කොතැනින්ද?".

මොකක්ද මේ?

එන්වෝයි යනු C++ හි ලියා ඇති L4-L7 balancer එකකි, ඉහළ කාර්ය සාධනය සහ ලබා ගැනීමේ හැකියාව කෙරෙහි අවධානය යොමු කරයි. එක් අතකින්, මෙය යම් ආකාරයකින් nginx සහ haproxy හි ප්‍රතිසමයක් වන අතර, ඒවාට කාර්ය සාධනය සමඟ සැසඳිය හැකිය. අනෙක් අතට, එය ක්ෂුද්‍ර සේවා ගෘහ නිර්මාණ ශිල්පය කෙරෙහි වැඩි නැඹුරුවක් දක්වන අතර zuul හෝ traefik වැනි java සහ go balancers වලට වඩා නරක නොවන ක්‍රියාකාරීත්වයක් ඇත.

haproxy/nginx/envoy හි සංසන්දනාත්මක වගුව, එය පරම සත්‍යය යැයි නොකියන නමුත් සාමාන්‍ය චිත්‍රයක් ලබා දෙයි.

nginx
හැපෘොකි
එවා
traefik

github මත තරු
11.2k/කැඩපත
1.1k/කැඩපත
12.4k
27.6k

ලියා ඇත
C
C
සී ++
go

API
කිසිදු
සොකට් පමණයි/තල්ලු
දත්ත තලය/අදින්න
අදින්න

ක්රියාකාරී සෞඛ්ය පරීක්ෂාව
කිසිදු
ඔව්
ඔව්
ඔව්

විවෘත ලුහුබැඳීම
බාහිර ප්ලගිනය
කිසිදු
ඔව්
ඔව්

ජේ.ඩබ්ලිව්.ටී
බාහිර ප්ලගිනය
කිසිදු
ඔව්
කිසිදු

දීර්ඝ
ලුවා/සී
ලුවා/සී
Lua/C++
කිසිදු

ඇයි

මෙය තරුණ ව්‍යාපෘතියකි, බොහෝ දේ මඟ හැරී ඇත, සමහරක් මුල් ඇල්ෆා වල ඇත. එහෙත් එවා, එහි තාරුණ්‍යය නිසා වේගයෙන් සංවර්ධනය වෙමින් පවතින අතර දැනටමත් බොහෝ රසවත් විශේෂාංග ඇත: ගතික වින්‍යාසය, බොහෝ සූදානම් කළ පෙරහන්, ඔබේම පෙරහන් ලිවීම සඳහා සරල අතුරු මුහුණතක්.
යෙදුම් ක්ෂේත්‍ර මෙයින් අනුගමනය කරයි, නමුත් පළමුව ප්‍රති රටා 2 ක් ඇත:

  • ස්ථිතික පසුබෑම.

කාරණය වන්නේ මේ මොහොතේ දී ය එවා හැඹිලි ආධාරකයක් නොමැත. ගූගල් කට්ටිය මේක ට්‍රයි කරනවා නිවැරදි කරන්න. අදහස එක් වරක් ක්රියාත්මක වනු ඇත එවා RFC අනුකූලතාවයේ සියලුම සියුම් (සත්වෝද්‍යාන ශීර්ෂ) සහ විශේෂිත ක්‍රියාත්මක කිරීම් සඳහා අතුරු මුහුණතක් සාදන්න. නමුත් දැනට එය ඇල්ෆාවත් නොවේ, ගෘහ නිර්මාණ ශිල්පය සාකච්ඡාවට ලක්ව ඇත, PR විවෘත (මම PR ලිපිය ලියන අතරතුර, PR කැටි විය, නමුත් මෙම කරුණ තවමත් අදාළ වේ).

දැනට, ස්ථිතික සඳහා nginx භාවිතා කරන්න.

  • ස්ථිතික වින්යාසය.

ඔබට එය භාවිතා කළ හැකිය, නමුත් එවා ඒ සඳහා නිර්මාණය කළ දෙයක් නොවේ. ස්ථිතික වින්‍යාසය තුළ ඇති විශේෂාංග නිරාවරණය නොවනු ඇත. බොහෝ අවස්ථා තිබේ:

yaml හි වින්‍යාසය සංස්කරණය කිරීමේදී, ඔබ වරදවා වටහා ගනු ඇත, සංවර්ධකයින්ට වාචිකත්වය සඳහා බැණ වදිනු ඇත, සහ nginx/haproxy configs, අඩු ව්‍යුහගත වුවද, වඩාත් සංක්ෂිප්ත බව සිතන්න. කාරණය එයයි. Nginx සහ Haproxy හි වින්‍යාසය අතින් සංස්කරණය කිරීම සඳහා නිර්මාණය කර ඇත, සහ එවා කේතයෙන් පරම්පරාව සඳහා. සම්පූර්ණ වින්‍යාසය විස්තර කර ඇත protobuf, ප්‍රෝටෝ ගොනු වලින් එය ජනනය කිරීම වැරදීමකට වඩා අපහසුය.

කැනරි, 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

ගතික වින්යාසය

අපි විසඳුමක් සොයන්නේ කුමන ගැටලුවකටද? ඔබට පැටවීම යටතේ පැටවුම් සමතුලිත වින්‍යාසය නැවත පූරණය කළ නොහැක; "කුඩා" ගැටළු මතු වනු ඇත:

  • වින්‍යාස වලංගුකරණය.

config එක ලොකු වෙන්න පුලුවන්, ගොඩක් ලොකු වෙන්න පුලුවන්, අපි ඔක්කොම එකපාර overload කලොත්, කොහේ හරි Error එකක් වෙන්න තියෙන ඉඩ වැඩි වෙනවා.

  • දිගුකාලීන සම්බන්ධතා.

නව සවන්දෙන්නෙකු ආරම්භ කරන විට, ඔබ පැරණි එක මත ධාවනය වන සම්බන්ධතා ගැන සැලකිලිමත් විය යුතුය; වෙනස්කම් නිතර සිදු වුවහොත් සහ දිගුකාලීන සම්බන්ධතා තිබේ නම්, ඔබට සම්මුතියක් සෙවීමට සිදුවේ. ආයුබෝවන්, nginx වෙත kubernetes ඇතුල් වේ.

  • ක්රියාකාරී සෞඛ්ය පරීක්ෂාවන්.

අපට ක්‍රියාකාරී සෞඛ්‍ය පරීක්‍ෂණ තිබේ නම්, රථවාහන යැවීමට පෙර අපි ඒවා සියල්ල නව වින්‍යාසය තුළ දෙවරක් පරීක්ෂා කළ යුතුය. උඩුගං බලා ගොඩක් තිබේ නම්, මේ සඳහා කාලය ගතවේ. හලෝ haproxy.

මෙය විසඳන්නේ කෙසේද එවාවින්‍යාසය ගතිකව පැටවීමෙන්, සංචිත ආකෘතියට අනුව, ඔබට එය වෙනම කොටස් වලට බෙදිය හැකි අතර වෙනස් නොවූ කොටස නැවත ආරම්භ නොකරන්න. උදාහරණයක් ලෙස, නැවත ආරම්භ කිරීමට මිල අධික වන සහ කලාතුරකින් වෙනස් වන සවන්දෙන්නෙකු.

වින්‍යාසය එවා (ඉහත ගොනුවෙන්) පහත ආයතන ඇත:

  • අසන්නා - සවන්දෙන්නා නිශ්චිත ip/port එකක එල්ලී ඇත
  • අතථ්‍ය සත්කාරක - වසම් නාමයෙන් අතථ්‍ය සත්කාරක
  • මාර්ගය - සමතුලිත රීතිය
  • පොකුරු - සමතුලිත පරාමිතීන් සහිත උඩු ගංවතුර සමූහයක්
  • අන්ත ලක්ෂ්‍යය - upstream උදාහරණ ලිපිනය

මෙම එක් එක් ආයතන සහ තවත් සමහරක් ගතිකව පිරවිය හැක; මේ සඳහා, වින්‍යාසය මඟින් වින්‍යාසය ලැබෙන සේවාවේ ලිපිනය සඳහන් කරයි. සේවාව REST හෝ gRPC විය හැකිය, gRPC වඩාත් සුදුසුය.

සේවාවන් පිළිවෙලින් නම් කර ඇත: LDS, VHDS, RDS, CDS සහ EDS. ඔබට ස්ථිතික සහ ගතික වින්‍යාසය ඒකාබද්ධ කළ හැකි අතර, ගතික සම්පතක් ස්ථිතික එකක සඳහන් කළ නොහැක.

බොහෝ කාර්යයන් සඳහා, අවසාන සේවා තුන ක්‍රියාත්මක කිරීම ප්‍රමාණවත් වේ, ඒවා ADS (සමස්ත සොයාගැනීම් සේවාව) ලෙස හැඳින්වේ. 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

අදහස් එක් කරන්න