Kubernetes のカスタム エンドポイントへの nginx-ingress で 502 エラーが発生する

Kubernetes のカスタム エンドポイントへの nginx-ingress で 502 エラーが発生する

Kubernetes クラスターの外部にあるカスタム エンドポイントにルーティングする Ingress があります。サービスはポート 8006 の HTTPS のみをリッスンします。

apiVersion: v1
kind: Service
metadata:
  name: pve
spec:
  ports:
    - protocol: TCP
      port: 8006
---
apiVersion: v1
kind: Endpoints
metadata:
  name: pve
subsets:
  - addresses:
      - ip: 10.0.1.2
    ports:
      - port: 8006
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: pve

  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "off"
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"

spec:
  tls:
    - hosts:
        - pve.example.com
      secretName: pve-tls
  rules:
    - host: pve.example.com
      http:
        paths:
          - backend:
              serviceName: pve
              servicePort: 8006
            path: /

nginx ポッドでエラーが発生します:

10.0.0.25 - - [2020/08/28:01:17:58 +0000] "GET / HTTP/1.1" 502 157 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0" "-"

2020/08/28 01:17:58 [エラー] 2609#2609: *569 アップストリームは、アップストリームからの応答ヘッダーの読み取り中に接続を途中で閉じました。クライアント: 10.0.0.25、サーバー: pve.example.com、リクエスト: "GET / HTTP/1.1"、アップストリーム: "http://10.0.1.2:8006/"、ホスト: "pve.example.com"

編集

プロキシプロトコルを削除した後、エラーが発生します

10.0.10.1 - - [2020/08/28:02:19:18 +0000] "GET / HTTP/1.1" 400 59 "-" "curl/7.58.0" "-"

2020/08/28 02:19:26 [エラー] 2504#2504: *521 アップストリームは、アップストリームからの応答ヘッダーの読み取り中に接続を途中で閉じました。クライアント: 10.0.10.1、サーバー: pve.example.com、リクエスト: "GET / HTTP/1.1"、アップストリーム: "http://10.0.1.2:8006/"、ホスト: "pve.example.com"

10.0.10.1 - - [2020/08/28:02:19:26 +0000] "GET / HTTP/1.1" 502 157 "-" "curl/7.58.0" "-"

 

関連する場合、私のnginx設定はhelm charを通じて展開されますnginx-stable/nginx-ingress

  ## nginx configuration
  ## Ref: https://github.com/kubernetes/ingress/blob/master/controllers/nginx/configuration.md
  ##
  controller:
    config:
      entries:
        hsts-include-subdomains: "false"
        ssl-ciphers: "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"
        ssl-protocols: "TLSv1.1 TLSv1.2"
    ingressClass: nginx
    service:
      externalTrafficPolicy: Local
      annotations:
        metallb.universe.tf/address-pool: default
  defaultBackend:
    enabled: true
  tcp:
    22: "gitlab/gitlab-gitlab-shell:22"

答え1

この注釈が問題の原因である可能性があります。

    nginx.ingress.kubernetes.io/use-proxy-protocol: "true"

ドキュメント州:

HAProxy や Amazon Elastic Load Balancer (ELB) などのプロキシ サーバーやロード バランサーを介して渡されるクライアント接続 (実際の IP アドレス) 情報を受信するための PROXY プロトコルを有効または無効にします。

Ingress の前に PROXY プロトコルを使用して接続を渡すロード バランサーがない場合、これは必要なことではないため、このアノテーションは存在しないはずです (または存在するべきです"false")。

答え2

これはコミュニティ ウィキの回答です。自由に拡張してください。

表示されるエラーはupstream prematurely closed connection while reading response header from upstreamNginx から発生し、「アップストリーム」によって接続が閉じられたことを意味します。

必要な詳細がなければ、この問題の正確な原因を特定することは困難ですが、とにかくできることは、タイムアウト値を増やすことです。このドキュメント、 具体的には:

  • proxy_read_timeout

  • proxy_connect_timeout

ユースケースに応じて、「アップストリーム」のコード/構成を調整することもできます。

関連情報