Kubernetes における Ingress と Load Balancer の役割について、かなり混乱しています。
私の理解する限り、Ingress はインターネットからの受信トラフィックをクラスター内で実行されているサービスにマッピングするために使用されます。
ロードバランサーの役割は、トラフィックをホストに転送することです。その点では、イングレスとロードバランサーの違いは何でしょうか? また、Amazon ELB や ALB と比較した Kubernetes 内のロードバランサーの概念は何でしょうか?
ベストアンサー1
ロード バランサー: Kubernetes LoadBalancer サービスは、Kubernetes クラスター内になく、他の場所に存在する外部ロード バランサーを指すサービスです。ポッドが外部にルーティング可能であると仮定すると、これらのサービスはポッドと連携できます。Google と AWS は、この機能をネイティブで提供しています。Amazon の場合、これは ELB に直接マッピングされ、AWS で実行されている Kubernetes は、展開された LoadBalancer サービスごとに ELB インスタンスを自動的にプロビジョニングおよび構成できます。
Ingress: Ingress は、実際には、それらをリッスンしているコントローラーに渡す一連のルールにすぎません。一連の Ingress ルールをデプロイすることはできますが、それらを処理できるコントローラーがなければ何も起こりません。LoadBalancer サービスは、そのように構成されている場合、Ingress ルールをリッスンできます。
クラスター外部の外部ルーティング可能な IP を持ちながら、クラスター内に存在するポッドを指すNodePortサービスを作成することもできます。これは Ingress コントローラーである可能性があります。
イングレスコントローラは、イングレスルールを解釈するように構成されたポッドです。Kubernetesでサポートされている最も人気のあるイングレスコントローラの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 クラスターを実装する方法を説明します。