1. ホーム
  2. kubernetes

[解決済み] イングレスとロードバランサーの比較

2022-03-15 18:23:36

質問

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

私の理解では、Ingressはインターネットから入ってくるトラフィックをクラスタ内で動作しているサービスにマッピングするために使用されます。

ロードバランサーの役割は、トラフィックをホストに転送することです。その点で、イングレスはロードバランサーとどう違うのでしょうか?また、Amazon ELBやALBと比較して、kubernetes内のロードバランサーのコンセプトは何でしょうか?

解決方法は?

ロードバランサーです。 kubernetes LoadBalancerサービスは、あなたのkubernetesクラスタ内ではなく、他の場所に存在する外部のロードバランサーを指すサービスです。これらは、あなたのPodが外部ルーティング可能であることを前提に、あなたのPodと連携することができます。GoogleとAWSはこの機能をネイティブで提供しています。Amazonに関しては、これはELBに直接対応し、AWSで実行されているkubernetesは、デプロイされた各ロードバランササービスに対してELBインスタンスを自動的にプロビジョニングし、設定することができます。

イングレス イングレスとは、実際にはルールのセットを、それをリッスンしているコントローラに渡すだけのものです。たくさんのイングレスルールをデプロイすることはできますが、それを処理できるコントローラがなければ何も起こりません。LoadBalancer サービスは、そうするように設定されていれば、イングレスルールをリッスンすることができます。

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

Ingress Controllerは、単にIngressルールを解釈するように設定されたポッドです。kubernetesがサポートする最も一般的なIngress Controllerの1つがnginxです。Amazonで言えば、ALB が使用できます。 をイングレスコントローラーとして使用します。

一例として これ nginx コントローラは、定義した ingress ルールを取り込んで nginx.conf ファイルに変換し、それをロードしてそのポッドで起動することが可能です。

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

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 ingress controller を使って kubernetes cluster を実装する方法です。参考になれば幸いです。