質問: helmチャートnginx-ingressコントローラーtcp httpをhttpsにリダイレクト 私の環境はawsでホストされています。ヘルムチャートstable/nginx-ingressをtcpモードでデプロイしました(tcpモードでaws elbが必要です。正確にelbクラシックが必要です! )、また、aws acm証明書とそれなしのバックエンドを使用する必要があるため、次のようになります。tcp:80 -> tcp:30452 (kubernetes) ssl(tcp):443 -> tcp:31453 (kubernetes) 私の「nginx-ingress」は:controller: name: controller image: repository: quay.io/kubernetes-ingress-controller/nginx-ingress-controller tag: "0.27.0" pullpolicy: ifnotpresent # www-data -> uid 101 runasuser: 101 allowprivilegeescalation: true # configures the ports the nginx-controller listens on containerport: http: 80 https: 80 # will add custom configuration options to nginx https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ config: allow-backend-server-header: "true" use-proxy-protocol: "true" server-tokens: "false" use-forwarded-headers: "true" ssl-redirect: "true" http-redirect-code: "301" proxy_redirect: "off" ingressclass: websocket service: enabled: true annotations: # enable proxy protocol service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*' service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '120' # ssl service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-1:123123123123:certificate/123123123123123123123" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 'https' service.beta.kubernetes.io/aws-load-balancer-backend-protocol: 'tcp' ports: http: 80 https: 443 targetports: http: http https: http type: loadbalancer nodeports: http: "" https: "" tcp: {} udp: {} サービスの私のingress構成:ingress: enabled: true annotations: kubernetes.io/ingress.class: websocket hosts: - host: example.com paths: - / httpからhttpsへのリダイレクトを設定するにはどうすればよいですか?入力でnginx.ingress.kubernetes.io/force-ssl-redirect: "true"を使用すると、リダイレクトループが表示されます:(
回答: これは 既知の問題 tcpモード(レイヤー4))でelb classicと組み合わせてsslターミネーションを使用する場合です。次の 回避策 を使用できます。1-以下を使用して、nginx-ingressのカスタムconfigmapを作成します http-snippet :apiversion: v1 kind: configmap metadata: labels: app: ingress-nginx name: nginx-configuration namespace: <ingress-namespace> data: ssl-redirect: "false" hsts: "true" server-tokens: "false" # you may not want to use proxy_protocol here http-snippet: | server { listen 8000 proxy_protocol; server_tokens off; return 301 https://$host$request_uri; } 2- this のように、上記のconfigmapを使用するようにingressが構成されていることを確認します。3-新しいnodeportを作成し、定義をnginx入力コンテナーとサービスに追加します。例:コンテナ: - name: http containerport: 80 - name: https containerport: 443 - name: http-redirect containerport: 8000 サービス: ports: # as you are using ssl termination, note that this does service(443)-->container(80) - name: https port: 443 protocol: tcp targetport: http # <-- container port 80 nodeport: 31453 - name: http port: 8000 protocol: tcp targetport: http-redirect nodeport: 32000 4-elbのポート80がnginxイングレスサービスのポート8000を指すようにします。tcp:80 -> tcp:32000 (kubernetes) ssl(tcp):443 -> tcp:31453 (kubernetes) これにより、リダイレクトを行うことだけが目的の追加リスナーが作成されます。一度だけ到達するので、リダイレクトループは解決されます。リクエストは次のように動作します。elb(80) --> nginx service(32000) --> nginx container(8000) --redirect--> elb(443) --> nginx service(31453) -- nginx container (80)