தூதுவர். 1. அறிமுகம்

வாழ்த்துக்கள்! இந்த சிறு கட்டுரை "தூதர் என்றால் என்ன?", "எனக்கு அது ஏன் தேவை?", மற்றும் "நான் எங்கு தொடங்குவது?" போன்ற கேள்விகளுக்கு பதிலளிக்கிறது.

அது என்ன

Envoy என்பது C++ இல் எழுதப்பட்ட ஒரு L4-L7 சுமை சமநிலைப்படுத்தியாகும், இது உயர் செயல்திறன் மற்றும் கிடைக்கும் தன்மையை மையமாகக் கொண்டது. ஒருபுறம், இது nginx மற்றும் haproxy உடன் ஓரளவு ஒத்திருக்கிறது, செயல்திறனில் ஒப்பிடத்தக்கது. மறுபுறம், இது மைக்ரோ சர்வீஸ் கட்டமைப்புகளை நோக்கி அதிகம் கவனம் செலுத்துகிறது மற்றும் ஜூல் அல்லது ட்ரேஃபிக் போன்ற ஜாவா மற்றும் கோ சுமை சமநிலைப்படுத்திகளுடன் ஒப்பிடக்கூடிய செயல்பாட்டை வழங்குகிறது.

ஹாப்ராக்ஸி/என்ஜின்க்ஸ்/தூதர் ஒப்பீட்டு அட்டவணை முழுமையான உண்மை என்று கூறவில்லை, ஆனால் அது ஒரு பொதுவான படத்தை அளிக்கிறது.

Nginx
இல் haproxy
அனுப்பிய
traefik

GitHub இல் நட்சத்திரங்கள்
11.2k/கண்ணாடி
1.1k/கண்ணாடி
12.4k
27.6k

எழுதப்பட்டது
C
C
சி ++
go

ஏபிஐ
எந்த
சாக்கெட் மட்டும்/தள்ளு
தரவுத்தளம்/இழுத்தல்
இழுக்க

செயலில் உள்ள சுகாதார பரிசோதனை
எந்த
ஆம்
ஆம்
ஆம்

திறந்த தடமறிதல்
வெளிப்புற செருகுநிரல்
எந்த
ஆம்
ஆம்

ஜே.டபிள்யூ.டி
வெளிப்புற செருகுநிரல்
எந்த
ஆம்
எந்த

நீட்டிப்பு
லுவா/சி
லுவா/சி
லுவா/சி++
எந்த

என்ன

இது ஒரு இளம் திட்டம், நிறைய விஷயங்கள் விடுபட்டுள்ளன, அவற்றில் சில ஆரம்ப கட்டத்திலேயே உள்ளன. ஆனால் அனுப்பிய, அதன் இளமை காரணமாக, வேகமாக வளர்ந்து வருகிறது மற்றும் ஏற்கனவே பல சுவாரஸ்யமான அம்சங்களைக் கொண்டுள்ளது: டைனமிக் உள்ளமைவு, பல ஆயத்த வடிப்பான்கள், உங்கள் சொந்த வடிப்பான்களை எழுதுவதற்கான எளிய இடைமுகம்.
பயன்பாட்டின் பகுதிகள் இதிலிருந்து பின்பற்றப்படுகின்றன, ஆனால் முதலில், இரண்டு எதிர்ப்பு வடிவங்கள்:

  • நிலையான பின்னடைவு.

விஷயம் என்னவென்றால், தற்போது அனுப்பிய கேச்சிங் ஆதரவு இல்லை. கூகிளில் உள்ளவர்கள் அதை சரிசெய்ய முயற்சிக்கிறார்கள். исправитьஎப்போதாவது ஒருமுறை அதை செயல்படுத்துவதுதான் யோசனை. அனுப்பிய RFC இணக்கத்தின் அனைத்து நுணுக்கங்களும் (தலைப்புகளின் பெருக்கம்), குறிப்பிட்ட செயல்படுத்தல்களுக்கான இடைமுகத்தை உருவாக்குகின்றன. ஆனால் இது இன்னும் ஆல்பா கூட அல்ல; கட்டமைப்பு இன்னும் விவாதத்தில் உள்ளது. PR திறந்த (நான் கட்டுரையை எழுதிக் கொண்டிருந்தபோது, ​​PR இணைக்கப்பட்டது, ஆனால் இந்த புள்ளி இன்னும் பொருத்தமானது).

இதற்கிடையில், புள்ளிவிவரங்களுக்கு nginx ஐப் பயன்படுத்தவும்.

  • நிலையான உள்ளமைவு.

நீங்கள் அதைப் பயன்படுத்தலாம், ஆனால் அனுப்பிய இது இந்த நோக்கத்திற்காக உருவாக்கப்படவில்லை. நிலையான உள்ளமைவின் திறன்கள் முழுமையாக உணரப்படாது. பல புள்ளிகள் உள்ளன:

YAML உள்ளமைவைத் திருத்தும்போது, ​​நீங்கள் தவறுகளைச் செய்வீர்கள், டெவலப்பர்கள் மிகவும் சொற்களஞ்சியமாக இருப்பதற்காக சபிப்பீர்கள், மேலும் nginx/haproxy உள்ளமைவுகள், குறைந்த கட்டமைப்புடன் இருந்தாலும், மிகவும் சுருக்கமானவை என்று நினைப்பீர்கள். அதுதான் விஷயம். Nginx மற்றும் Haproxy உள்ளமைவுகள் கைமுறையாகத் திருத்துவதற்காக உருவாக்கப்பட்டன, அதே நேரத்தில் அனுப்பிய குறியீட்டிலிருந்து உருவாக்கம். முழு உள்ளமைவும் இதில் விவரிக்கப்பட்டுள்ளது protobuf, புரோட்டோ கோப்புகளிலிருந்து அதை உருவாக்குவது தவறு செய்வதை மிகவும் கடினமாக்குகிறது.

கேனரி காட்சிகள், b/g வரிசைப்படுத்தல்கள் மற்றும் பல விஷயங்களை டைனமிக் உள்ளமைவில் மட்டுமே சரியாக செயல்படுத்த முடியும். அவற்றை நிலையான முறையில் செய்ய முடியாது என்று நான் கூறவில்லை; நாம் அனைவரும் அதைச் செய்கிறோம். ஆனால் அவ்வாறு செய்ய, நீங்கள் சில தீர்வுகளை நாட வேண்டும், எந்த சமநிலையிலும், அனுப்பிய உட்பட.

தூதர் இன்றியமையாததாக இருக்கும் பணிகள்:

  • சிக்கலான மற்றும் மாறும் அமைப்புகளில் போக்குவரத்து சமநிலை. இதில் சேவை வலையும் அடங்கும், ஆனால் அது அவசியம் அதற்கு மட்டுப்படுத்தப்படவில்லை.
  • பரவலாக்கப்பட்ட தடமறிதல், சிக்கலான அங்கீகாரம் அல்லது கிடைக்கக்கூடிய பிற செயல்பாடுகளுக்கான தேவை அனுப்பிய இதை பெட்டிக்கு வெளியே செயல்படுத்துவது எளிது அல்லது வசதியாக இருக்கலாம், அதே நேரத்தில் nginx/haproxy இல் நீங்கள் lua மற்றும் கேள்விக்குரிய செருகுநிரல்களில் உங்களை மூடிக்கொள்ள வேண்டும்.

தேவைப்படும்போது அதிக செயல்திறனை வழங்க இரண்டும் கிடைக்கின்றன.

இது எப்படி வேலை செய்கிறது

Envoy ஒரு பைனரி டாக்கர் படமாக மட்டுமே விநியோகிக்கப்படுகிறது. படத்தில் ஏற்கனவே ஒரு மாதிரி நிலையான உள்ளமைவு உள்ளது, ஆனால் கட்டமைப்பைப் புரிந்துகொள்ள மட்டுமே நாங்கள் அதில் ஆர்வமாக உள்ளோம்.

ambassy.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

டைனமிக் உள்ளமைவு

நாம் என்ன சிக்கலை தீர்க்கப் பார்க்கிறோம்? சுமை சமநிலை உள்ளமைவை நாம் வெறுமனே மீண்டும் ஏற்ற முடியாது; சில "சிறிய" சிக்கல்கள் எழும்:

  • உள்ளமைவு சரிபார்ப்பு.

கட்டமைப்பு பெரியதாக இருக்கலாம், மிகப் பெரியதாக இருக்கலாம், நாம் அதை ஒரே நேரத்தில் ஓவர்லோட் செய்தால், எங்காவது பிழை ஏற்படுவதற்கான வாய்ப்புகள் அதிகரிக்கும்.

  • நீண்ட காலம் வாழும் கலவைகள்.

புதிய லிசனரை துவக்கும்போது, ​​பழைய இணைப்பில் இயங்கும் இணைப்புகளை நீங்கள் கவனித்துக் கொள்ள வேண்டும். மாற்றங்கள் அடிக்கடி நிகழ்ந்து, நீண்ட கால இணைப்புகள் இருந்தால், நீங்கள் ஒரு சமரசத்தைக் கண்டுபிடிக்க வேண்டும். வணக்கம், குபெர்னெட்ஸ் என்ஜின்க்ஸில் நுழைகிறார்.

  • செயலில் உள்ள சுகாதார பரிசோதனைகள்.

எங்களிடம் செயலில் உள்ள சுகாதார சோதனைகள் இருந்தால், போக்குவரத்தை அனுப்புவதற்கு முன்பு புதிய உள்ளமைவில் அவை அனைத்தையும் மீண்டும் சரிபார்க்க வேண்டும். நிறைய அப்ஸ்ட்ரீம்கள் இருந்தால், இதற்கு நேரம் எடுக்கும். வணக்கம், ஹாப்ராக்ஸி.

இது எவ்வாறு தீர்க்கப்படுகிறது அனுப்பியமாதிரி தொகுப்பைப் பயன்படுத்தி உள்ளமைவை டைனமிக் முறையில் ஏற்றுவதன் மூலம், நீங்கள் அதை தனித்தனி பகுதிகளாகப் பிரித்து, மாறாத பகுதிகளை மீண்டும் துவக்குவதைத் தவிர்க்கலாம். எடுத்துக்காட்டாக, மீண்டும் துவக்குவதற்கு விலை அதிகம் மற்றும் அரிதாகவே மாறும் ஒரு லிஸ்டனரைப் பயன்படுத்தலாம்.

கட்டமைப்பு அனுப்பிய (மேலே உள்ள கோப்பிலிருந்து) பின்வரும் நிறுவனங்களைக் கொண்டுள்ளது:

  • கேட்பவர் — ஒரு குறிப்பிட்ட ஐபி/போர்ட்டில் தொங்கும் ஒரு கேட்பவர்
  • மெய்நிகர் ஹோஸ்ட் — டொமைன் பெயரால் மெய்நிகர் ஹோஸ்ட்
  • பாதை — சமநிலை விதி
  • கொத்து — சமநிலை அளவுருக்கள் கொண்ட அப்ஸ்ட்ரீம்களின் குழு
  • இறுதிப்புள்ளி — அப்ஸ்ட்ரீம் நிகழ்வு முகவரி

இந்த ஒவ்வொரு நிறுவனத்தையும், மற்ற சிலவற்றுடன் சேர்த்து, உள்ளமைவில் உள்ளமைவு மீட்டெடுக்கப்படும் சேவை முகவரியைக் குறிப்பிடுவதன் மூலம் மாறும் வகையில் நிரப்ப முடியும். சேவை REST அல்லது gRPC ஆக இருக்கலாம், ஆனால் gRPC விரும்பத்தக்கது.

சேவைகள் அதற்கேற்ப பெயரிடப்பட்டுள்ளன: LDS, VHDS, RDS, CDS, மற்றும் EDS. நிலையான மற்றும் மாறும் உள்ளமைவுகளை இணைக்க முடியும், ஒரு நிலையான ஒன்றிற்குள் ஒரு மாறும் வளத்தைக் குறிப்பிட முடியாது என்ற எச்சரிக்கையுடன்.

பெரும்பாலான பணிகளுக்கு கடைசி மூன்று சேவைகளை செயல்படுத்தினால் போதும், அவை ADS (ஒருங்கிணைந்த கண்டுபிடிப்பு சேவை) என்று அழைக்கப்படுகின்றன, ஏனெனில் ஜாவா and go, gRPC டேட்டாபிளேனின் ஆயத்த செயல்படுத்தலைக் கொண்டுள்ளது, இதில் நீங்கள் உங்கள் மூலத்திலிருந்து பொருட்களை மட்டுமே நிரப்ப வேண்டும்.

உள்ளமைவு பின்வரும் வடிவத்தை எடுக்கிறது:

ambassy.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

கருத்தைச் சேர்