KubernetesでのIngressとLoad Balancerの役割についてはかなり混乱しています。
私が理解している限りでは、Ingressはインターネットからの着信トラフィックをクラスタ内で実行されているサービスにマッピングするために使用されます。
ロードバランサの役割は、トラフィックをホストに転送することです。その点で、イングレスはロードバランサーとどう違うのですか?また、Amazon ELBおよびALBと比較した場合の、kubernetes内のロードバランサーの概念は何ですか?
Load Balancer:kubernetes LoadBalancerサービスは、kubernetesクラスタには存在しないが他の場所に存在する外部ロードバランサを指すサービスです。あなたのポッドは外部からルーティング可能であると仮定して、彼らはあなたのポッドと連携することができます。 GoogleとAWSはこの機能をネイティブに提供しています。 Amazonに関しては、これは、AWSで実行されているときにELBおよびkubernetesと直接マッピングされ、デプロイされた各LoadBalancerサービスに対してELBインスタンスを自動的にプロビジョニングおよび設定できます。
イングレス:イングレスは、実際にはそれらをlistenしているコントローラーに渡すための一連の規則です。あなたはたくさんのイングレスルールを展開することができますが、それらを処理できるコントローラがなければ何も起こりません。 LoadBalancerサービスは、それがそうするように構成されている場合、入力ルールをlistenすることができます。
また、NodePortサービスを作成することもできます。これは、クラスタの外部に外部からルーティング可能なIPを持っていますが、クラスタ内に存在するポッドを指しています。これはイングレスコントローラかもしれません。
入力コントローラは、単に入力ルールを解釈するように構成されたポッドです。 kubernetesでサポートされている最も一般的なイングレスコントローラの1つはnginxです。 Amazonでは、ALB を入力コントローラとして を使用できます。
たとえば、 this nginxコントローラは、定義した入力ルールを取り込み、それをpodでロードして開始する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は、クラスタ内のサービスappsvc
を指すようにhttp://kubernetes.foo.bar/app
をルーティングするルールを作成しました。
Nginxイングレスコントローラでkubernetesクラスタを実装する方法の 例 です。お役に立てれば!
NodePort、LoadBalancer、Ingressの違いを説明している この非常に興味深い記事 を見つけました。
記事の内容から:
LoadBalancer:
LoadBalancerサービスは、インターネットにサービスを公開するための標準的な方法です。 GKEでは、これによりNetwork Load Balancerが起動し、すべてのトラフィックをサービスに転送する単一のIPアドレスが提供されます。
サービスを直接公開したい場合は、これがデフォルトの方法です。指定したポート上のトラフィックはすべてサービスに転送されます。フィルタリング、ルーティングなどはありません。つまり、HTTP、TCP、UDP、Webソケット、gRPCなど、あらゆる種類のトラフィックを送信できます。
大きな欠点は、LoadBalancerを使って公開する各サービスがそれぞれ独自のIPアドレスを取得することです。また、公開されるサービスごとにLoadBalancerを支払う必要があります。
入力:
イングレスは実際には一種のサービスではありません。代わりに、それは複数のサービスの前に位置し、「スマートルーター」またはあなたのクラスタへの入口として機能します。
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コントローラ用のプラグインもあります。
同じIPアドレスで複数のサービスを公開したい場合、これらのサービスがすべて同じL7プロトコル(通常はHTTP)を使用する場合は、入力が最も便利です。ネイティブGCP統合を使用している場合は1つのロードバランサーに対してのみ支払います。Ingressは「スマート」であるため、多くの機能(SSL、認証、ルーティングなど)をそのまま使用できます。
TL:DR
実用的なユースケースから始めましょう:一つの単一ドメイン名の下にデプロイするためのサービス実装パッケージ(明確さと簡潔さのための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アドレスが作成され、同じドメイン名に公開することはできなくなります。まあ、これはイングレスが入ってくるところです。
侵入は、インターネットと私たちが外部の世界に公開するすべてのKサービスの間にあります。 Ingressは、ロードバランシング、SSL終了、および名前ベースの仮想ホスティングを提供できます。後者の機能は、そのURLを分析することによって、着信要求を適切なサービスにルーティングすることができます。もちろん、Ingressは、正しいKServにリクエストを送信するのに必要な書き換えとルートを指定する... "ingress.yaml"ファイルを設定して適用する必要があります。
インターネット - >入力 - > K8sサービス - >レプリカ
そのため、正しい入力、KServices、およびASIPの設定により、同じドメイン名を使用して多くのAPIを安全に公開できます。
簡単に言うと、ロードバランサは複数のバックエンドサービス(同じ種類の)にリクエストを分散しますが、イングレスは、URLなどに基づいてリクエストを特定のバックエンドサービスにルーティングするAPIゲートウェイ(リバースプロキシ)に似ています。
入力:入力オブジェクト+入力コントローラ
入力オブジェクト:
サービスオブジェクトとまったく同じですが、それ自体では何もしません。 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オブジェクトを読み取り、それらを新しいserver {}セクションに解析して動的に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/concepts/services-networking/ingress/
クラスター内のポッドが外部トラフィックを受信できるようにする方法は3つあります。
1。)NodePortサービス
2。)LoadBalancerサービス(NodePortサービス上に構築)
3。)入力コントローラー+入力オブジェクト(LoadBalancerサービスに基づいて構築)
クラスターでホストされている10のWebサイトがあり、それらすべてを外部トラフィックに公開したいとします。
*タイプLoadBalancer Serviceを使用すると、10個のHAクラウドロードバランサーが生成されます(それぞれ費用がかかります)
*タイプIngress Controllerを使用する場合、HAクラウドロードバランサーを1つ生成し(お金を節約します)、クラスターで実行されているIngress Controllerを指します。
イングレスコントローラー:
クラスター内のL7 LB /入力コントローラーは、クラスター内のクラスターIPサービスへのトラフィックをロードバランス/リバースプロキシします。また、タイプTLS証明書のKubernetes Secretとそれを参照するIngressオブジェクトがある場合、HTTPSを終了することもできます)