web-dev-qa-db-ja.com

AWS kubernetesロードバランサーはポート443でSSLを終了し、ポート80でサービスに転送します

Nginx ingress controller を使用してAWSでEKSクラスターをセットアップしようとしています。

NginxイングレスコントローラーはタイプLoadBalancerのサービスを作成し、次にサービスのノードポートにマップされるELBインスタンスを作成します。

SSL証明書をkubernetesクラスターではなくAWSで管理したいので、AWS証明書マネージャーにインポートし、nginxサービスにアノテーションを追加しました。

service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <certificate_arn>

これまでのところ、標準的なものです。これでロードバランサーがSSLターミネーションを実行しており、ロードバランサーとクラスター間のその後の通信は暗号化されていません。唯一の問題は、これの代わりに:

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (80) -> [Service]

私はこれを手に入れます

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (443) -> [Service]

ご覧のとおり、ELBはポートを443から80に変更せず、ポート443で暗号化されていないトラフィックを受信するため、通信はNginxポッドによって拒否されます。

SSL/TCP ELBでも同様のことを試しましたが、同じ問題が発生します。

検索しましたが、暗号化されていないトラフィックをポート80に送信するようにELBに指示する方法を見つけることができませんでした。

ありがとう!

4
Michal Artazov

targetPort: httpポートを使用している場合でも、443を使用するようにIngressサービスを構成する必要があります。

例はこちら Nginx IngressとAmazon ELBをレイヤー7(HTTP/HTTPS)リスナーで使用する場合:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: http  # <--- PAY ATTENTION HERE
3