Ingress vs Load Balancer


212

KubernetesにおけるIngressとLoad Balancerの役割についてかなり混乱しています。

私が理解している限り、Ingressはインターネットからの着信トラフィックをクラスターで実行されているサービスにマッピングするために使用されます。

ロードバランサーの役割は、トラフィックをホストに転送することです。その点で、イングレスはロードバランサーとどのように異なりますか?また、Amazon ELBおよびALBと比較して、kubernetes内のロードバランサーの概念は何ですか?

回答:


183

ロードバランサー: kubernetes LoadBalancerサービスは、kubernetesクラスターにはないが他の場所に存在する外部ロードバランサーを指すサービスです。ポッドが外部からルーティング可能であると想定して、ポッドを操作できます。GoogleとAWSはこの機能をネイティブで提供しています。Amazonの観点から見ると、これはAWSで実行されている場合、ELBおよびkubernetesに直接マッピングされ、デプロイされた各LoadBalancerサービスのELBインスタンスを自動的にプロビジョニングおよび構成できます。

Ingress:Ingressは実際には、それらをリッスンしているコントローラーに渡す一連のルールです。一連の上りルールをデプロイできますが、それらを処理できるコントローラーがない限り、何も起こりません。LoadBalancerサービスは、構成する場合、上りルールをリッスンできます。

クラスタの外部に外部からルーティング可能なIPを持つが、クラスタ内に存在するポッドを指すNodePortサービスを作成することもできます。これはIngress Controllerである可能性があります。

イングレスコントローラーは、イングレスルールを解釈するように構成されたポッドです。kubernetesでサポートされている最も一般的なIngressコントローラーの1つはnginxです。Amazonに関しては、ALB 入力コントローラーとして使用できます

たとえば、この nginxコントローラーは、定義した上りルールを取り込み、それらをnginx.confファイルに変換して、ポッドでロードして開始することができます。

たとえば、次のように入力を定義したとします。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
   ingress.kubernetes.io/rewrite-target: /
 name: web-ingress
spec:
  rules:
  - host: kubernetes.foo.bar
    http:
      paths:
      - backend:
          serviceName: appsvc
          servicePort: 80
        path: /app

次にnginxコントローラポッドを検査すると、で定義された次のルールが表示され/etc/nginx.confます。

server {
    server_name kubernetes.foo.bar;
    listen 80;
    listen [::]:80;
    set $proxy_upstream_name "-";
    location ~* ^/web2\/?(?<baseuri>.*) {
        set $proxy_upstream_name "apps-web2svc-8080";
        port_in_redirect off;

        client_max_body_size                    "1m";

        proxy_set_header Host                   $best_http_host;

        # Pass the extracted client certificate to the backend

        # Allow websocket connections
        proxy_set_header                        Upgrade           $http_upgrade;
        proxy_set_header                        Connection        $connection_upgrade;

        proxy_set_header X-Real-IP              $the_real_ip;
        proxy_set_header X-Forwarded-For        $the_x_forwarded_for;
        proxy_set_header X-Forwarded-Host       $best_http_host;
        proxy_set_header X-Forwarded-Port       $pass_port;
        proxy_set_header X-Forwarded-Proto      $pass_access_scheme;
        proxy_set_header X-Original-URI         $request_uri;
        proxy_set_header X-Scheme               $pass_access_scheme;

        # mitigate HTTPoxy Vulnerability
        # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
        proxy_set_header Proxy                  "";

        # Custom headers

        proxy_connect_timeout                   5s;
        proxy_send_timeout                      60s;
        proxy_read_timeout                      60s;

        proxy_redirect                          off;
        proxy_buffering                         off;
        proxy_buffer_size                       "4k";
        proxy_buffers                           4 "4k";

        proxy_http_version                      1.1;

        proxy_cookie_domain                     off;
        proxy_cookie_path                       off;

    rewrite /app/(.*) /$1 break;
    rewrite /app / break;
    proxy_pass http://apps-appsvc-8080;

    }

Nginxは、クラスター内のhttp://kubernetes.foo.bar/appサービスを指すようにルーティングするルールを作成しましたappsvc

これは nginx入力コントローラを使用してkubernetesクラスタを実装する方法のです。お役に立てれば!


1
IngressとIngressコントローラーの違いとそれぞれの役割を理解します。実際、ロードバランサーは、定義された一連のルールを介してトラフィックを私のkubernetesポッドに転送する役割も果たします。その点で、ロードバランサーによってイングレスコントローラーがどのように異なるかをさらに詳しく説明してもらえますか?おそらく、イングレスとロードバランサーの両方が使用されている例が役立つはずです。
arunkjn 2017

イングレスコントローラーは公式のkubernetesタイプではありません。イングレスルールを解釈できるのは、LBイメージ(nginxは単なる例)のデプロイメントです。ほとんどの人は、イングレスコントローラーはクラスター内に存在する内部LBでもあると想定しています。実際には、上りルールを解釈する外部ロードバランサーを作成することは試みていません。私はそれが可能であると想像しますが、私は完全に間違っている可能性があります:)
Lindsay Landry

6
現在のアプリケーションでは、nginxのデプロイをGKEのLoadBalancerサービスとして公開し、nginxからクラスターで実行されている他のすべてのサービスにリバースプロキシを実行しています。上記のアプローチの代わりにイングレスを使用する必要がありますか?
リガル2017

こんにちはnginxプロキシの@rigalプロキシルールはどのように見えますか?彼らはkube-dnsによって解決されますか?
arunkjn 2017年

@arunkjnはい。ルールは次のようになります。location/ api / url / {proxy_pass service-name:80 / api / url ; }
リガル2017年

59

NodePort、LoadBalancer、Ingressの違いを説明する非常に興味深い記事を見つけました。

記事の内容から:

LoadBalancer:

LoadBalancerサービスは、サービスをインターネットに公開する標準的な方法です。GKEでは、これによりNetwork Load Balancerが起動し、すべてのトラフィックをサービスに転送する単一のIPアドレスが提供されます。

サービスを直接公開する場合は、これがデフォルトの方法です。指定したポート上のすべてのトラフィックがサービスに転送されます。フィルタリングやルーティングなどはありません。つまり、HTTP、TCP、UDP、WebSocket、gRPCなど、ほぼすべての種類のトラフィックを送信できます。

大きな欠点は、LoadBalancerで公開する各サービスが独自のIPアドレスを取得することと、公開されたサービスごとにLoadBalancerの料金を支払う必要があることです。

イングレス:

Ingressは実際には一種のサービスではありません。代わりに、複数のサービスの前に置かれ、クラスターへの「スマートルーター」またはエントリポイントとして機能します。

Ingressを使用すると、さまざまなことを実行できます。また、機能が異なるIngressコントローラーにはさまざまな種類があります。

デフォルトのGKE入力コントローラは、HTTP(S)ロードバランサを起動します。これにより、パスベースとサブドメインベースの両方のルーティングをバックエンドサービスに行うことができます。たとえば、foo.yourdomain.com上のすべてをfooサービスに送信し、yourdomain.com / bar /パスの下にあるすべてをbarサービスに送信できます。

Ingressはおそらくサービスを公開するための最も強力な方法ですが、最も複雑な場合もあります。Google Cloud Load Balancer、Nginx、Contour、Istioなど、さまざまなタイプのIngressコントローラーがあります。cert-managerのような、サービスのSSL証明書を自動的にプロビジョニングできるIngressコントローラー用のプラグインもあります。

Ingressは、同じIPアドレスで複数のサービスを公開する場合に最も便利です。これらのサービスはすべて同じL7プロトコル(通常はHTTP)を使用します。ネイティブのGCP統合を使用している場合、1つのロードバランサーに対してのみ支払います。Ingressは「スマート」であるため、多くの機能(SSL、Auth、ルーティングなど)をすぐに利用できます。


2
複数の段落を逐語的に引用する場合は、著作権を侵害しないようにしてください。私はこれについての専門家ではありません。この場合は問題ないかもしれませんが、それは間違いなく認識すべきことです。
anothernode 2018年

14

TL:DR

  1. Ingressは、パブリックネットワーク(インターネット)と、Apiの実装を公開するKubernetesサービスの間にあります。
  2. Ingressは、負荷分散、SSL終了、名前ベースの仮想ホスティングを提供できます。
  3. Ingress機能により、単一のドメイン名から複数のAPIまたはアプリケーションを安全に公開できます。

実用的なユースケースから始めましょう。単一のドメイン名でデプロイするために、サービス実装パッケージ(明快さと簡潔さのためにASIP)に裏打ちされた複数のApisがあります。あなたは最先端の開発者なので、ASIPごとに個別のデプロイメントが必要なマイクロサービスアーキテクチャを実装し、個別にアップグレードまたはスケーリングできるようにしました。もちろん、これらのASIPは個別のDockerコンテナーにカプセル化されており、コンテナーリポジトリからKubernetes(K8)で使用できます。

これをGoogleのGKE K8にデプロイするとします。持続的な可用性を実装するために、各ASIPインスタンス(レプリカ)は、各VMが独自のクラウド内部IPアドレスを持つ異なるノード(VM)にデプロイされます。各ASIPデプロイメントは、「deployment.yaml」という適切な名前のファイルで構成されます。このファイルでは、特に、特定のASIP K8のレプリカのデプロイ数を宣言的に指定します。

次のステップでは、APIを外部の世界に公開し、デプロイされたASIPインスタンスの1つにリクエストを送ります。同じASIPの多くのレプリカが異なるノードで実行されているため、これらのレプリカ間で要求を分散するものが必要です。これを解決するには、外部に公開され、IPアドレスを介してアクセスできるK8sサービス(KServ)を構成する「service.yaml」ファイルを作成して適用します。このKServは、構成されたASIP間でのAPIのリクエスト分散を担当します。ASIPのノードに障害が発生して再起動すると、KServはK8sマスターによって自動的に再構成されます。このような場合、内部IPアドレスは再利用されないため、KServに新しいASIPの配置場所を通知する必要があります。

ただし、同じドメイン名で公開される他のApiサービスパッケージがあります。新しいKServをスピンすると、新しい外部IPアドレスが作成され、同じドメイン名で公開することはできません。これがIngressの出番です。

Ingressは、インターネットと外部に公開するすべてのKServiceの間にあります。Ingressは、負荷分散、SSL終了、名前ベースの仮想ホスティングを提供できます。後者の容量では、URLを分析することにより、着信要求を適切なサービスにルーティングできます。もちろん、Ingressを構成して適用するには、「ingress.yaml」ファイルを使用して、正しいKServにリクエストを送信するために必要な書き換えとルートを指定する必要があります。

インターネット-> Ingress-> K8sサービス->レプリカ

したがって、適切なIngress、KServices、ASIP構成を使用すると、同じドメイン名を使用して多くのAPIを安全に公開できます。


9
インターネット->ロードバランサー->イングレスコントローラー->イングレスルール-> k8s-services->レプリカ
c4f4t0r

@ Kubernetesドキュメントからc4f4t0r kubernetes.io/docs/concepts/services-networking/ingress/...
softjake

@sofjake、何を言いたいですか?
c4f4t0r

9

クラスタ内のポッドが外部トラフィックを受信できるようにする方法は4つあります
。1。)HostNetworkingを使用したポッド:trueおよび(ノードごとに1つのポッドがホストノードのポートを直接リッスンすることを許可します。Minikube、ベアメタル、およびrasberry piが時々行くホストノードがポート80/443でリッスンできるようにするこのルートは、ロードバランサーまたは高度なクラウドロードバランサー構成を使用できないようにします。また、SNATを回避したり、externalTrafficPolicyの同様の効果を達成したりするのに役立つKubernetesサービスをバイパスします:シナリオのローカルAWSのようにサポートされていない場合)
。)NodePort Service
3.)LoadBalancer Service(NodePort Serviceに基づいて構築)
4.)Ingress Controller + Ingress Objects(上記に基づいて構築)

クラスターでホストされている10のWebサイトがあり、それらすべてを外部トラフィックに公開したいとします。
*タイプLoadBalancer Serviceを使用する場合、10個のHAクラウドロードバランサーを生成します(それぞれコストがかかります)
*タイプIngress Controllerを使用する場合、1個のHAクラウドロードバランサーを生成し(お金を節約)、それがIngressを指しますクラスターで実行されているコントローラー。

Ingress Controllerは次のとおりです。

  • クラスターで実行されているポッドのデプロイメントによってサポートされるタイプLoad Balancerのサービス。
  • 各ポッドは2つのことを行います。
    1. クラスター内で実行されるレイヤー7ロードバランサーとして機能します。(Nginxが人気の多くのフレーバーで来ます)
    2. クラスター内のIngressオブジェクトに基づいて動的に構成されます
      (Ingressオブジェクトは、レイヤー7ロードバランサーの宣言的な構成スニペットと考えることができます)。

クラスター内のL7 LB / Ingressコントローラーは、クラスター内のクラスターIPサービスへのトラフィックを負荷分散/リバースプロキシします。タイプTLS証明書のKubernetesシークレットとそれを参照するIngressオブジェクトがある場合、HTTPSを終了することもできます。)

ここに画像の説明を入力してください


1
誰かが詳細な回答を求めている場合は、Ingressoteemo.com
2019/

metallbとingressコントローラーの違いは何ですか?
ImranRazaKhan

1
Ingressコントローラーのアイデアは、内部クラスターネットワークで実行されているL7 LBポッドです。また、通常、LANネットワーク上に存在するLBを介してLANに公開されます。MetalLBはKubeノードにインストールできるソフトウェアであり、LANに存在するLBの役割を果たすために、LANに到達可能なLAN側のVIP /仮想IPアドレスであるかのような錯覚を与えることができます。
ネオカイル

6

Ingress:Ingress Object + Ingress Controller

Ingressオブジェクト:

サービスオブジェクトと同じですが、それ自体では何もしません。Ingressオブジェクトは、サービスオブジェクトが実際にサービスを作成する一方で、リクエストパス、リクエストドメイン、ターゲットkubernetesサービスなどを指定することにより、レイヤー7トラフィックをクラスターにルーティングする方法を説明します

入力コントローラー:

以下のサービス:

  1. listens on specific ports (usually 80 and 443) for web traffic
  2. Listens for the creation, modification, or deletion of Ingress Objects
  3. Creates internal L7 routing rules based on these Ingress Objects

たとえば、Nginx Ingress Controllerは、サービスを使用してポート80および443でリッスンし、新しいIngressオブジェクトを読み取って、それを動的にnginx.confに配置する新しいサーバー{}セクションに解析します。

LoadBalancer:外部ロードバランサープロバイダー+サービスタイプ

外部ロードバランサープロバイダー:

外部ロードバランサープロバイダーは通常、AWSやGKEなどのクラウドで構成され、外部ロードバランサーの作成を通じて外部IPを割り当てる方法を提供します。この機能は、サービスをタイプ「LoadBalancer」として指定することで使用できます。

サービスの種類:

サービスタイプがLoadBalancerに設定されている場合、Kubernetesは、Kubernetesポッドのエントリを使用して外部ロードバランサーを作成し、プログラムして、外部IPを割り当てようとします。

Kubernetesサービスコントローラーは、外部ロードバランサー、ヘルスチェック(必要な場合)、ファイアウォールルール(必要な場合)の作成を自動化し、クラウドプロバイダーによって割り当てられ、新しく作成または構成されたLoadBalancerの外部IPを取得して、サービスオブジェクト。

関係:

イングレスコントローラーサービスは多くの場合LoadBalancerタイプとしてプロビジョニングされるため、httpおよびhttpsリクエストを外部IP経由で特定の内部サービスにプロキシ/ルーティングできます。

ただし、LoadBalancerは厳密には必要ありません。なぜなら、hostNetworkまたはhostPortを使用することにより、技術的にはホスト上のポートをサービスにバインドできる(ホストの外部ip:portを介してアクセスできるようにする)からです。正式にはこれはお勧めできませんが、実際のノードのポートを使い果たすためです。

参照:

https://kubernetes.io/docs/concepts/configuration/overview/#services

https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/

https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#external-load-balancer-providers

https://kubernetes.io/docs/concepts/services-networking/ingress/


3

簡単に言うと、ロードバランサーは(同じタイプの)複数のバックエンドサービス間でリクエストを分散しますが、上りは、URLなどに基づいてリクエストを特定のバックエンドサービスにルーティングするAPIゲートウェイ(リバースプロキシ)に似ています。


あなたの答えに従うために、ロードバランスとイングレスコントローラーが分離している場合、イングレスコントローラーはすべてロードバランサーの後ろにあります。
AQuirky、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.