سفير. 1. تعارف

سلام! هي هڪ مختصر مضمون آهي جيڪو سوالن جو جواب ڏئي ٿو: "ايلچي ڇا آهي؟"، "ڇو ضرورت آهي؟" ۽ "ڪٿي شروع ڪجي؟"

هي ڇا آهي

Envoy هڪ L4-L7 بيلنس آهي جيڪو C++ ۾ لکيل آهي، اعليٰ ڪارڪردگي ۽ دستيابي تي مرکوز آهي. هڪ پاسي، هي ڪجهه طريقي سان نينڪس ۽ هپروڪسي جو هڪ اينالاگ آهي، انهن جي ڪارڪردگي جي مقابلي ۾. ٻئي طرف، اهو مائڪرو سروس آرڪيٽيڪچر ڏانهن وڌيڪ مبني آهي ۽ ڪارڪردگي جاوا ۽ گو بيلنسرز کان وڌيڪ خراب ناهي، جهڙوڪ زوول يا ٽرافيڪ.

haproxy/nginx/envoy جي مقابلي واري جدول، اهو مطلق سچ هجڻ جي دعوي نٿو ڪري، پر هڪ عام تصوير ڏئي ٿو.

نگنڪس
هاپروڪس
موڪليو
پيچرو

github تي تارا
11.2k / آئينو
1.1k / آئينو
12.4k
27.6k

۾ لکيل آهي
C
C
C ++
go

API
في
صرف ساکٽ / ڌڪ
ڊيٽا جهاز / ڇڪڻ
ڇڪيو

فعال صحت جي چڪاس
في
ها
ها
ها

اوپن ٽريڪنگ
خارجي پلگ ان
في
ها
ها

جي وي ٽي
خارجي پلگ ان
في
ها
في

واڌ
لوا/سي
لوا/سي
لوا/سي++
في

ڇو

هي هڪ نوجوان منصوبو آهي، اتي ڪيتريون ئي شيون غائب آهن، ڪجهه شروعاتي الفا ۾. پر موڪليوپڻ، ان جي نوجوانن جي ڪري، تيزيء سان ترقي ڪري رهيو آهي ۽ اڳ ۾ ئي ڪيترائي دلچسپ خاصيتون آهن: متحرڪ ترتيب، ڪيترائي تيار ڪيل فلٽر، توهان جي پنهنجي فلٽر لکڻ لاء هڪ سادي انٽرفيس.
ايپليڪيشن جا علائقا هن جي پيروي ڪندا آهن، پر پهريان 2 مخالف نمونا آهن:

  • جامد موٽڻ.

حقيقت اها آهي ته هن وقت ۾ موڪليو ڪابه ڪيشنگ سپورٽ. گوگل وارا هي ڪوشش ڪري رهيا آهن حل. اهو خيال هڪ ڀيرو لاڳو ڪيو ويندو موڪليو آر ايف سي جي تعميل جي سڀني ذيلي ذخيري (زو هيڊرز)، ۽ مخصوص عملن لاءِ هڪ انٽرفيس ٺاهيو. پر هينئر تائين اهو الفا به ناهي، فن تعمير تي بحث هيٺ آهي، PR کليل (جڏهن مان پي آر آرٽيڪل لکي رهيو هوس، پي آر منجمد ٿي ويو، پر اهو نقطو اڃا به لاڳاپيل آهي).

ھاڻي، استعمال ڪريو nginx لاءِ statics.

  • جامد ترتيب.

توهان ان کي استعمال ڪري سگهو ٿا، پر موڪليو اهو نه آهي جنهن لاء اهو ٺاهيو ويو آهي. جامد تشڪيل ۾ خاصيتون بي نقاب نه ٿينديون. اتي ڪيترائي لمحا آھن:

جڏهن yaml ۾ ترتيب ترتيب ۾ ترميم ڪندي، توهان کي غلطي ٿيندي، ڊولپرز کي فعل لاء ڊاهي ۽ سوچيو ته nginx/haproxy ترتيبون، جيتوڻيڪ گهٽ ٺهيل آهن، وڌيڪ جامع آهن. اها ڳالهه آهي. Nginx ۽ Haproxy جي ترتيب هٿ سان ايڊٽ ڪرڻ لاء ٺاهي وئي، ۽ موڪليو ڪوڊ مان نسل لاء. سڄي تشڪيل ۾ بيان ڪيو ويو آهي protobuf, ان کي پروٽوڪول فائلن مان پيدا ڪرڻ تمام گهڻو ڏکيو آهي غلطي ڪرڻ.

ڪينري، b/g جي ترتيب واري منظرنامي ۽ گهڻو ڪجهه عام طور تي صرف هڪ متحرڪ ترتيب ۾ لاڳو ڪيو ويندو آهي. مان اهو نه چئي رهيو آهيان ته اهو جامد طور تي نٿو ٿي سگهي، اسان سڀ اهو ڪندا آهيون. پر ان لاءِ توهان کي ڪچري تي رکڻ جي ضرورت آهي، ڪنهن به بيلنس ۾، اندر موڪليو سميت.

اهي ڪم جن لاءِ سفير لازمي آهي:

  • پيچيده ۽ متحرڪ سسٽم ۾ ٽرئفڪ جي توازن. ھن ۾ سروس ميش شامل آھي، پر اھو لازمي طور تي ھڪڙو ئي نه آھي.
  • تقسيم ٿيل ٽريڪنگ ڪارڪردگي جي ضرورت، پيچيده اختيار يا ٻي ڪارڪردگي جيڪا موجود آهي موڪليو دٻي کان ٻاهر يا آساني سان لاڳو ڪيو ويو آهي، پر nginx/haproxy ۾ توهان کي لوا ۽ مشڪوڪ پلگ ان سان گهيرو ڪرڻ جي ضرورت آهي.

ٻئي، جيڪڏهن ضروري هجي ته، اعلي ڪارڪردگي مهيا ڪن.

ڪيئن هن ڪم ڪندو

سفير صرف هڪ ڊاکر تصوير جي طور تي بائنري ۾ ورهايو ويو آهي. تصوير اڳ ۾ ئي هڪ جامد تشڪيل جو هڪ مثال تي مشتمل آهي. پر اسان ان ۾ دلچسپي رکون ٿا صرف ساخت کي سمجهڻ لاءِ.

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

متحرڪ ترتيب

اسان ڪهڙي مسئلي جو حل ڳولي رهيا آهيون؟ توهان صرف لوڊ بيلنس جي ترتيب کي لوڊ ڪرڻ جي تحت لوڊ نه ٿا ڪري سگهو؛ "ننڍا" مسئلا پيدا ٿيندا:

  • ٺاھ جوڙ جي تصديق.

ترتيب وڏي ٿي سگهي ٿي، اهو تمام وڏو ٿي سگهي ٿو، جيڪڏهن اسان اهو سڀ هڪ ڀيرو اوورلوڊ ڪريون ٿا، غلطي جا موقعا ڪٿي وڌندا آهن.

  • ڊگھي رابطا.

نئين ٻڌندڙ جي شروعات ڪرڻ وقت، توهان کي پراڻي تي هلندڙ ڪنيڪشنن جو خيال رکڻو پوندو؛ جيڪڏهن تبديليون اڪثر ٿينديون رهن ٿيون ۽ اهي لاڳاپا لاڳاپا آهن، توهان کي سمجهوتو ڳولڻو پوندو. هيلو، ڪبرنيٽس نينڪس تي داخل ٿيو.

  • فعال صحت جي چڪاس.

جيڪڏهن اسان وٽ فعال صحت جي چڪاس آهي، اسان کي انهن سڀني کي ٻه ڀيرا چيڪ ڪرڻ جي ضرورت آهي نئين ترتيب ۾ ٽرئفڪ موڪلڻ کان پهريان. جيڪڏهن اتي تمام گهڻا اپ اسٽريم آهن، اهو وقت وٺندو آهي. هيلو هيپروڪسي.

ان ۾ ڪيئن حل ڪيو ويو آهي موڪليوترتيب کي متحرڪ طور تي لوڊ ڪندي، پول ماڊل جي مطابق، توھان ان کي جدا جدا حصن ۾ ورهائي سگھو ٿا ۽ ان حصي کي ٻيهر شروع نه ڪري سگھو ٿا جيڪو تبديل نه ٿيو آھي. مثال طور، هڪ ٻڌندڙ، جنهن کي ٻيهر شروع ڪرڻ قيمتي آهي ۽ گهٽ ۾ گهٽ تبديليون.

ڪنفگريشن موڪليو (مٿي ڏنل فائل مان) ھيٺيون ادارا آھن:

  • ٻڌندڙ - ٻڌندڙ هڪ مخصوص ip / بندرگاهه تي پھانسي
  • مجازي ميزبان - ڊومين جي نالي سان مجازي ميزبان
  • رستو - توازن جو ضابطو
  • غاليچا - اپ اسٽريم جو هڪ گروپ توازن جي ماپن سان
  • آخرڪار - اپ اسٽريم مثال پتو

انهن ادارن مان هر هڪ ۽ ڪجهه ٻين کي متحرڪ طور تي ڀريو وڃي ٿو؛ ان لاءِ، تشڪيل انهي خدمت جو پتو بيان ڪري ٿي جتان ترتيب وصول ڪئي ويندي. خدمت REST يا gRPC ٿي سگهي ٿي، gRPC افضل آهي.

خدمتن جا نالا ترتيب ڏنل آهن: LDS، VHDS، RDS، CDS ۽ EDS. توهان جامد ۽ متحرڪ ترتيبن کي گڏ ڪري سگهو ٿا، ان حد سان ته هڪ متحرڪ وسيلن کي جامد هڪ ۾ بيان نٿو ڪري سگهجي.

اڪثر ڪمن لاءِ، آخري ٽن خدمتن کي لاڳو ڪرڻ لاءِ ڪافي آھي، انھن کي ADS (مجموعي دريافت سروس) چئبو آھي، لاءِ. جيا ۽ وڃو اتي 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

شروعات ۾ موڪليو هن ترتيب سان، اهو ڪنٽرول جهاز سان ڳنڍيندو ۽ RDS، CDS ۽ EDS ترتيب جي درخواست ڪرڻ جي ڪوشش ڪندو. رابطي جو عمل ڪيئن ٿئي ٿو بيان ڪيو ويو آهي هتي.

مختصر ۾، موڪليو هڪ درخواست موڪلي ٿو جنهن ۾ وسيلن جي قسم جي درخواست ڪئي پئي وڃي، نوڊ جو نسخو ۽ پيٽرول. جواب ۾، اهو هڪ وسيلو ۽ هڪ نسخو حاصل ڪري ٿو؛ جيڪڏهن ڪنٽرول جهاز تي نسخو تبديل نه ڪيو آهي، اهو جواب نٿو ڏئي.
هتي 4 رابطي جا اختيار آهن:

  • وسيلن جي سڀني قسمن لاء هڪ GRPC وهڪرو، وسيلن جي مڪمل حيثيت موڪلي وئي آهي.
  • الڳ وهنوار ، پوري حالت.
  • هڪ وهڪرو، وڌندڙ حالت.
  • علحدو وهڪرو ، وڌندڙ حالت.

واڌارو xDS توهان کي ڪنٽرول جهاز جي وچ ۾ ٽرئفڪ کي گهٽائڻ جي اجازت ڏئي ٿو ۽ موڪليو, هي لاڳاپيل آهي وڏي ٺاھ جوڙ لاء. پر اهو تعامل کي پيچيده ڪري ٿو؛ درخواست ۾ رڪنيت ختم ڪرڻ ۽ رڪنيت حاصل ڪرڻ لاءِ وسيلن جي هڪ فهرست شامل آهي.

اسان جو مثال ADS استعمال ڪري ٿو - ھڪڙو وهڪرو RDS، CDS، EDS ۽ غير وڌندڙ موڊ لاءِ. واڌاري واري موڊ کي فعال ڪرڻ لاء، توھان کي وضاحت ڪرڻ جي ضرورت آھي api_type: DELTA_GRPC

جيئن ته درخواست ۾ نوڊ پيٽرولر شامل آهن، اسان مختلف وسيلن کي ڪنٽرول جهاز ڏانهن موڪلي سگهون ٿا مختلف مثالن لاء موڪليو, هي هڪ خدمت mesh تعمير ڪرڻ لاء آسان آهي.

گرم ٿيو

تي موڪليو شروع ٿيڻ تي يا جڏهن ڪنٽرول جهاز مان هڪ نئين ترتيب حاصل ڪري، وسيلن کي گرم ڪرڻ وارو عمل شروع ڪيو ويو آهي. اهو ٻڌندڙ وارم اپ ۽ ڪلسٽر وارم اپ ۾ ورهايل آهي. پهريون شروع ڪيو ويو آهي جڏهن اتي RDS/LDS ۾ تبديليون آهن، ٻيو جڏهن CDS/EDS. هن جو مطلب آهي ته جيڪڏهن صرف اپ اسٽريم تبديل ٿئي ٿي، ٻڌندڙ کي ٻيهر نه بڻايو ويندو آهي.

گرم اپ جي عمل دوران، انحصار وسيلن جي توقع ڪئي ويندي آهي ڪنٽرول جهاز کان وقت ختم ٿيڻ دوران. جيڪڏهن وقت ختم ٿئي ٿي، شروعات ڪامياب نه ٿيندي ۽ نئون ٻڌندڙ بندرگاهه تي ٻڌڻ شروع نه ڪندو.
شروعاتي آرڊر: EDS، CDS، فعال صحت جي چڪاس، RDS، LDS. فعال صحت جي چڪاس سان گڏ، ٽرئفڪ صرف هڪ ڪامياب صحت جي چڪاس کان پوء مٿي ٿيندي.

جيڪڏهن ٻڌندڙ کي ٻيهر ٺاهيو ويو، پراڻو هڪ DRAIN رياست ۾ وڃي ٿو ۽ سڀني ڪنيڪشن بند ٿيڻ يا وقت ختم ٿيڻ کان پوء ختم ٿي ويندو. --drain-time-s، ڊفالٽ 10 منٽ.

جاري رکڻ لاء

جو ذريعو: www.habr.com

تبصرو شامل ڪريو