䜿者。 1. はじめに

こんにちはこれは、「Envoy ずは䜕ですか」「なぜ必芁なのですか」「どこから始めればよいですか」ずいう質問に答える短い蚘事です。

これは䜕ですか

EnvoyはC++で曞かれたL4-L7ロヌドバランサヌで、高パフォヌマンスず可甚性に重点を眮いおいたす。䞀方で、パフォヌマンス面ではnginxやhaproxyずある皋床類䌌しおおり、同等の性胜を備えおいたす。䞀方で、マむクロサヌビスアヌキテクチャに重点を眮いおおり、ZuulやTraefikずいったJavaやGoベヌスのバランサヌに劣らない機胜を備えおいたす。

haproxy/nginx/envoy の比范衚。絶察的な真実を䞻匵しおいるわけではありたせんが、抂芁を瀺しおいたす。

nginx
ハプロキシ
特䜿
トレフィク

githubのスタヌ
11.2k/ミラヌ
1.1k/ミラヌ
12.4k
27.6k

曞かれた
C
C
C + +
go

API
ノヌ
゜ケットのみ/プッシュ
デヌタプレヌン/プル
プル

アクティブヘルスチェック
ノヌ
はい
はい
はい

オヌプントレヌス
倖郚プラグむン
ノヌ
はい
はい

JWT
倖郚プラグむン
ノヌ
はい
ノヌ

拡匵
ルア/C
ルア/C
ルア/C++
ノヌ

䜕のために

これはただ若いプロゞェクトであり、倚くのものが欠けおおり、初期アルファ版のものもありたす。しかし 特䜿は、その若さゆえに急速に発展しおおり、すでに倚くの興味深い機胜を備えおいたす。動的な構成、倚数の既補のフィルタヌ、独自のフィルタヌを䜜成するためのシンプルなむンタヌフェヌスなどです。
適甚領域はこれに埓いたすが、たず 2 ぀のアンチパタヌンがありたす。

  • 静的反動。

問題は、珟時点では 特䜿 キャッシュはサポヌトされおいない。Googleが詊しおいる 修正する時々それを実装するずいうアむデアです 特䜿 RFC準拠のあらゆる埮劙な郚分ヘッダヌの山ず、特定の実装のためのむンタヌフェヌスの䜜成。しかし、ただアルファ版にも至っおおらず、アヌキテクチャは議論䞭だ。 PR オヌプンこの蚘事を曞いおいる間にPRがマヌゞされたしたが、この点はただ関連しおいたす。

その間、静的には nginx を䜿甚しおください。

  • 静的構成。

䜿うこずはできたすが、 特䜿 そのために䜜られたものではありたせん。静的蚭定の可胜性は明らかにされたせん。倚くの点がありたす。

yamlで蚭定を線集するず、ミスを犯したり、開発者の冗長さを嘆いたり、nginx/haproxyの蚭定は構造化されおいないものの、より簡朔だず思ったりするでしょう。それがポむントです。nginxずhaproxyの蚭定は手動で線集できるように䜜成されおおり、 特䜿 コヌドから生成するためのものです。蚭定党䜓は プロトブフproto ファむルから生成するず、間違いが起きにくくなりたす。

カナリアシナリオ、ブラックボックス展開など、倚くのシナリオは通垞、動的構成でのみ実装されたす。静的構成では䞍可胜だず蚀っおいるわけではありたせん。私たちは皆、これを行っおいたす。しかし、そのためには、バランサヌや、 特䜿 含む

Envoy が䞍可欠なタスク:

  • 耇雑で動的なシステムにおけるトラフィックの分散。これにはサヌビスメッシュも含たれたすが、必ずしも唯䞀の手段ではありたせん。
  • 分散トレヌス、耇雑な認蚌、たたは利甚可胜なその他の機胜の必芁性 特䜿 すぐに䜿えるものや䟿利に実装されおいるものはなく、nginx/haproxy では lua ず疑わしいプラグむンに取り囲たれる必芁がありたす。

どちらも必芁に応じお高いパフォヌマンスを提䟛するために利甚できたす。

これはどう動かすのですか

EnvoyはDockerむメヌゞずしおバむナリのみで配垃されおいたす。このむメヌゞには静的蚭定の䟋が既に含たれおいたすが、ここでは構造を理解するためだけに䜿甚したす。

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

動的構成

どのような問題を探しおいるのでしょうか? 負荷がかかっおいる状態でバランサヌ構成を再起動するだけでは䞍十分で、「軜埮な」問題が発生したす。

  • 構成の怜蚌。

構成は倧きくなる可胜性があり、非垞に倧きくなる可胜性があるため、䞀床にすべおをオヌバヌロヌドするず、どこかで゚ラヌが発生する可胜性が高くなりたす。

  • 長寿呜の接続。

新しいリスナヌを初期化する際は、叀いリスナヌで実行されおいる接続に泚意する必芁がありたす。頻繁に倉曎が発生し、長時間接続されおいる堎合、劥協点を芋぀ける必芁がありたす。こんにちは、nginx 䞊の Kubernetes Ingress です。

  • アクティブなヘルスチェック。

アクティブなヘルスチェックがある堎合は、トラフィックを送信する前に、新しい蚭定ですべおを再チェックする必芁がありたす。アップストリヌムが倚数ある堎合は、この凊理に時間がかかりたす。haproxyさん、こんにちは。

これはどのように解決されるのでしょうか 特䜿モデルプヌルに基づいお構成を動的にロヌドするこずで、構成を耇数の郚分に分割し、倉曎されおいない郚分は再初期化せずに枈みたす。䟋えば、リスナヌは再初期化にコストがかかり、倉曎頻床も䜎いため、このような凊理が䞍芁になりたす。

蚭定 特䜿 (䞊蚘のファむルから) 次の゚ンティティがありたす。

  • リスナヌ — 特定の IP/ポヌトでハングしおいるリスナヌ
  • 仮想ホスト - ドメむン名による仮想ホスト
  • route — バランスルヌル
  • — バランスパラメヌタを持぀アップストリヌムのグルヌプ
  • 終点 — アップストリヌムむンスタンスアドレス

これらの゚ンティティずその他の゚ンティティは動的に入力できたす。このため、蚭定を受け取るサヌビスのアドレスを蚭定で指定したす。サヌビスはRESTたたはgRPCですが、gRPCの䜿甚をお勧めしたす。

サヌビスはそれぞれLDS、VHDS、RDS、CDS、EDSず呜名されおいたす。静的構成ず動的構成を組み合わせるこずは可胜ですが、動的リ゜ヌスを静的リ゜ヌスに指定できないずいう制限がありたす。

ほずんどのタスクでは、最埌の3぀のサヌビスを実装するだけで十分です。これらはADSAggregated Discovery Serviceず呌ばれ、 ゞャワ Go には 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 ぀のオプションがありたす。

  • すべおのリ゜ヌス タむプに察しお 1 ぀の gRPC ストリヌムで、リ゜ヌスの完党な状態が送信されたす。
  • 別々のストリヌム、完党な状態。
  • 1 ぀のストリヌム、増分状態。
  • 個別のストリヌム、増分状態。

むンクリメンタルxDSは、コントロヌルプレヌンず 特䜿これは倧芏暡な構成に関係したす。ただし、リク゚ストは賌読解陀ず賌読のためのリ゜ヌスのリストを送信するため、やり取りが耇雑になりたす。

この䟋ではADSを䜿甚したす。これはRDS、CDS、EDS、非増分モヌドのそれぞれに1぀のストリヌムです。増分モヌドを有効にするには、以䞋を指定する必芁がありたす。 api_type: DELTA_GRPC

リク゚ストにはノヌド パラメヌタが含たれおいるため、むンスタンスごずに異なるリ゜ヌスをコントロヌル プレヌンに送信できたす。 特䜿これは、サヌビス メッシュの構築に䟿利です。

準備し始める

На 特䜿 起動時、たたはコントロヌルプレヌンから新しい蚭定を受信した際に、リ゜ヌスりォヌムアッププロセスが開始されたす。これは、リスナヌりォヌムアップずクラスタりォヌムアップに分かれおいたす。前者はRDS/LDSに倉曎があった堎合に、埌者はCDS/EDSに倉曎があった堎合に起動されたす。぀たり、アップストリヌムのみが倉曎された堎合、リスナヌは再䜜成されたせん。

りォヌムアップ䞭、コントロヌルプレヌンからの䟝存リ゜ヌスはタむムアりトたで埅機されたす。タむムアりトに達するず初期化は倱敗し、新しいリスナヌはポヌトのリッスンを開始したせん。
初期化順序EDS、CDS、アクティブヘルスチェック、RDS、LDS。アクティブヘルスチェックを有効にするず、1回のヘルスチェックが成功した堎合にのみトラフィックがアップストリヌムに送信されたす。

リスナヌが再䜜成されるず、叀いリスナヌは DRAIN 状態になり、すべおの接続が閉じられるかタむムアりトが経過するず削陀されたす。 --drain-time-sデフォルトは10分です。

継続するために。

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster