すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Nginx Ingress FAQ

最終更新日:Nov 17, 2024

このトピックでは、Ingressに関するよくある質問に対する回答を提供します。

IngressでサポートされているSSLまたはTLSプロトコルバージョン

Ingress-nginxは、トランスポート層セキュリティ (TLS) 1.2とTLS 1.3をサポートしています。 ブラウザまたはモバイルクライアントで使用されるTLSプロトコルのバージョンが1.2より前の場合、クライアントとingress-nginx間のハンドシェイク中にエラーが発生する可能性があります。

ingress-nginxでより多くのTLSプロトコルバージョンをサポートする場合は、kube-system/nginx-configuration configmapに次の設定を追加します。 詳細は、「TLS/HTTPS」をご参照ください。

説明

NGINX Ingressコントローラー1.7.0以降のTLS 1.0または1.1を有効にする場合は、ssl-ciphersパラメーターに @ SECLEVEL=0を指定する必要があります。

image.png

ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"

Ingressはデフォルトでレイヤ7リクエストヘッダーをバックエンドサーバーに渡しますか?

デフォルトでは、ingress-nginxはレイヤ7リクエストヘッダーをバックエンドサーバーに渡します。 ただし、HTTPルールに準拠しないリクエストヘッダーは、リクエストがバックエンドサーバーに転送される前に除外されます。 例えば、モバイルバージョン要求ヘッダはフィルタリングされる。 これらのリクエストヘッダーを除外しない場合は、kubectl edit cm -n kube-system nginx-configurationコマンドを実行して、関連する設定をnginx-configuration ConfigMapに追加します。 詳細については、「ConfigMap」をご参照ください。

enable-underscores-in-headers: true

ingress-nginxはリクエストをバックエンドHTTPSサーバーに転送できますか?

ingress-nginxがバックエンドHTTPSサーバーにリクエストを転送できるようにするには、次のコマンドを実行して、Ingress設定に必要なアノテーションを追加します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xxxx
  annotations:
    # You must specify HTTPS as the protocol that is used by the backend server. 
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

Ingressはレイヤー7でクライアントIPアドレスを渡しますか?

デフォルトでは、ingress-nginxはX-Forward-ForおよびX-Real-IPヘッダーフィールドを追加して、クライアントIPアドレスを渡します。 ただし、X-Forward-ForおよびX-Real-IPヘッダーフィールドがクライアントによるリクエストにすでに追加されている場合、バックエンドサーバーはクライアントのIPアドレスを取得できません。

コマンドkubectl edit cm -n kube-system nginx-configurationを実行し、ConfigMapに設定を追加します。 これにより、ingress-nginxはレイヤー7でクライアントIPアドレスを渡すことができます。

compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"

NGINX ingressに到達する前に複数のプロキシサーバーが存在する場合、proxy-real-ip-cidrに従って設定を調整する必要があります。 これらのプロキシサーバーのCIDRブロックをproxy-real-ip-cidrフィールドに追加します。 カンマ (,) で複数の CIDR ブロックを区切ります。 詳細については、「WAFまたは透過WAFの使用」をご参照ください。

proxy-real-ip-cidr:  "0.0.0.0/0,::/0"  

IPv6ネットワークで、NGINX Ingressが空のX-Forwarded-Forヘッダーを受信し、NGINX Ingressに到達する前にClassic Load Balancer (CLB) インスタンスがある場合、CLBのProxyプロトコルを有効にしてクライアントIPアドレスを取得できます。 プロキシプロトコルの詳細については、「レイヤー4リスナーを有効にしてクライアントIPアドレスを保持する」をご参照ください。

NGINX IngressコントローラーはHSTSをサポートしていますか?

デフォルトでは、HTTP Strict Transport Security (HSTS) はnginx-ingress-controllerに対して有効になっています。 ブラウザーが初めて単純なHTTPリクエストを送信する場合、バックエンドサーバー (HSTSが有効) からのレスポンスヘッダーには非権限-理由: HSTSが含まれます。 これは、バックエンドサーバーがHSTSをサポートしていることを示します。 クライアントがHSTSもサポートしている場合、最初のアクセス試行が成功した場合、クライアントはHTTPSリクエストを送信し続けます。 次の図に示すように、バックエンドサーバーからの応答の本文には、307内部リダイレクトステータスコードが含まれています。1

クライアント要求をバックエンドHTTPSサーバーに転送しない場合は、nginx-ingress-controllerのHSTSを無効にします。 詳細については、「HSTS」をご参照ください。

説明

デフォルトでは、HSTS設定はブラウザによってキャッシュされます。 nginx-ingress-controllerのHSTSを無効にした後、ブラウザのキャッシュを手動で削除する必要があります。

ingress-nginxでサポートされている書き換えルールはどれですか?

ingress-nginxでは、単純な書き換えルールのみがサポートされています。 詳細については、「書き換え」をご参照ください。 複雑な書き換えルールを設定する場合は、次の方法を使用します。

  • configuration-snippet: このアノテーションをIngressの位置設定に追加します。 詳細については、「設定スニペット」をご参照ください。

  • server-snippet: このアノテーションをIngressのサーバー構成に追加します。 詳細については、「サーバースニペット」をご参照ください。

次の図に示すように、他のスニペットを使用してグローバル設定を追加できます。 詳細については、「main-snippet」をご参照ください。2

ACKコンソールの [アドオン] ページでNGINX Ingressコントローラーを更新した後、システムで何が更新されますか?

NGINX Ingressコントローラーのバージョンが0.44より前の場合、コンポーネントには次のリソースが含まれます。

  • serviceaccount/ingress-nginx

  • configmap/nginx-設定

  • configmap/tcp-services

  • configmap/udp-services

  • clusterrole.rbac.authorization.k8s.io/ingress-nginx

  • clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx

  • role.rbac.authorization.k8s.io/ingress-nginx

  • rolebinding.rbac.authorization.k8s.io/ingress-nginx

  • service/nginx-ingress-lb

  • deployment.apps/nginx-ingress-controller

NGINX Ingressコントローラーのバージョンが0.44以降の場合、コンポーネントには上記のリソースに加えて次のリソースが含まれます。

  • validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-入場

  • サービス /ingress-nginx-controller-admission

  • serviceaccount/ingress-nginx-入場

  • clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission

  • clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission

  • role.rbac.authorization.k8s.io/ingress-nginx-承認

  • rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission

  • job.batch/ingress-nginx-admission-create

  • job.batch/ingress-nginx-admission-patch

Container Service for Kubernetes (ACK) コンソールの [アドオン] ページでNGINX Ingressコントローラーを更新しても、次のリソースの設定は変更されません。

  • configmap/nginx-設定

  • configmap/tcp-services

  • configmap/udp-services

  • service/nginx-ingress-lb

他のリソースの設定はデフォルト値にリセットされます。 たとえば、deployment.apps/nginx-ingress-controllerリソースのreplicasパラメーターのデフォルト値は2です。 NGINX Ingressコントローラーを更新する前にレプリカの値を5に設定した場合、ACKコンソールの [アドオン] ページからコンポーネントを更新した後、レプリカパラメーターはデフォルト値2を使用します。

ingress-nginxのレイヤー4リスナーをレイヤー7 HTTPまたはHTTPSリスナーに変更するにはどうすればよいですか?

デフォルトでは、ingress-nginxポッドのServer Load Balancer (SLB) インスタンスはTCPポート443と80でリッスンします。 リスナーのプロトコルをHTTPまたはHTTPSに変更することで、レイヤー4リスナーをレイヤー7リスナーに変更できます。

説明

システムがリスナーを変更すると、サービスは一時的に中断されます。 そのため、ピーク時間外に操作を実行することを推奨します。

  1. 証明書を作成し、証明書ID (cert-id) を記録します。 詳細については、「証明書管理サービスの証明書の使用」をご参照ください。

  2. アノテーションを使用して、Ingressが使用するSLBインスタンスのリスナーをレイヤー4からレイヤー7に変更します。

    1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [サービス] を選択します。

    3. [サービス] ページの上部で、名前空間をkube-systemに設定します。 ingress-nginx-lbを見つけて、[操作] 列の [YAMLの編集] をクリックします。

    4. [YAMLで表示] パネルで、[ports] セクションのポート443に対してtargetPortを80に設定します。

        - name: https
          port: 443
          protocol: TCP
          targetPort: 80 # Set targetPort to 80 for port 443.

      annotationsパラメーターに次の設定を追加し、[更新] をクリックします。

      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80,https:443"
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
  3. 結果を確認します。

    1. On theサービスページを検索し、ingress-nginx-lbサービスをクリックし、imageのアイコンタイプ列を作成します。

    2. [リスナー] タブをクリックします。 [フロントエンドプロトコル /ポート] 列にHTTP:80およびHTTPS:443が表示されている場合、SLBインスタンスのリスナーはレイヤー4からレイヤー7に変更されます。

ackコンソールのMarketplaceページからデプロイされたACK-ingress-nginxに既存のSLBインスタンスを指定するにはどうすればよいですか?

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  2. On theアプリカタログタブを選択します。ack-ingress-nginxまたはack-ingress-nginx-v1.

    • クラスターがKubernetes 1.20以前を実行している場合は、ack-ingress-nginxを選択します。

    • クラスターが1.20以降のバージョンのKubernetesを実行する場合は、ack-ingress-nginx-v1を選択します。

  3. Ingressコントローラーをデプロイします。 詳細については、「クラスターへの複数のIngressコントローラーのデプロイ」をご参照ください。

    [パラメーター] ウィザードページで、元の注釈を削除してから、新しい注釈を追加します。

    1. のすべての注釈を削除します。controller.service.annotationsセクションにアクセスします。

      image..png

    2. 新しい注釈を追加します。

      Specify the SLB instance that you want to use.
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
      # Overwrite the listeners of the SLB instance.
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"

      image..png

  4. クリックOKIngressコントローラーを展開します。

  5. Ingressコントローラーのデプロイ後、IngressコントローラーのIngressクラスを設定します。 詳細については、「クラスターへの複数のIngressコントローラーのデプロイ」をご参照ください。

複数のIngressコントローラーからアクセスログを収集する方法?

前提条件

  • Logtailがクラスターにインストールされています。 デフォルトでは、Logtailはクラスター作成時にインストールされます。 Logtailがクラスターにインストールされていない場合は、手順1: Logtailのインストールを参照して、Logtailをクラスターに手動でインストールします。

  • デフォルトのIngressコントローラーでログ収集が有効になっています。

  • 他のIngressコントローラのポッドに追加されたラベルが取得されます。 詳細については、「」をご参照ください。コンテナのラベルと環境変数を取得するにはどうすればよいですか?

手順:

  1. にログインします。ACKコンソールをクリックし、クラスター左側のナビゲーションウィンドウに表示されます。

  2. On theクラスターページで、管理するクラスターの名前をクリックし、クラスター情報左側のナビゲーションウィンドウに表示されます。

  3. [クラスター情報] ページで、[クラスターリソース] タブをクリックします。 [クラスターリソース] タブで、[Log Serviceプロジェクト] の右側にあるIDをクリックします。

    image

  4. ACKコンソールのLogstoreページで、Logstoreを作成します。 詳細については、「Logstoreの管理」をご参照ください。 ログ収集が繰り返されないように、IngressコントローラーごとにLogstoreを作成することを推奨します。

    • Logstoreを使用するIngressコントローラーの名前に基づいて、Logstoreに名前を付けることができます。

    • データ収集ウィザードのメッセージで、[キャンセル] をクリックします。

  5. Logstoresページの左側のナビゲーションウィンドウで、nginx-ingress > Logtailの設定を選択します。 [Logtailの設定] 列で、[k8s-nginx-ingress] をクリックして設定ページに移動します。

  6. [Logtail設定] ページで、[コピー] をクリックします。 Logtail Replicationページで、ドロップダウンリストから作成したLogstoreを選択します。 [コンテナーフィルター] セクションで、[コンテナーラベルホワイトリスト] 列の [追加] をクリックし、Ingressコントローラーのラベルをキーと値のペアとして追加します。 Logtailレプリケーションページで、[送信] をクリックします。

    image

  7. Logstoresページの左側のナビゲーションウィンドウで、作成したLogstoreをクリックします。 ページの右上隅にある [有効化] をクリックします。 次に、検索と分析パネルで [OK] をクリックします。 Logstoreの設定が完了しました。

  8. Logstoresページの左側のナビゲーションウィンドウで、作成したLogstore > Logtailの設定を選択します。 [Logtail設定] ページで、[操作] 列の [Logtail設定の管理] をクリックします。 [設定の詳細] タブで、[プロセッサ名] 列の [正確なフィールド (正規表現モード)] をクリックして、抽出されたログフィールドを表示します。

    8184e5bd055d3c2d8add99ce8a285eb0

  9. [Logtail設定] ページで、[エディター設定に切り替え] をクリックします。 [Logtail設定] の下の [編集] をクリックします。 [プラグインの設定] セクションで、要件に基づいてKeysおよびRegexパラメーターを設定します。 次に、[保存] をクリックします。

    説明

    異なるNGINX Ingressコントローラーが異なるログ形式を使用する場合は、異なるLogstoreのLogtail設定のprocessorsパラメーターを変更する必要があります。

nginx ingressコントローラーのTCPリスナーを有効にするにはどうすればよいですか。

デフォルトでは、Ingressは外部HTTPおよびHTTPSリクエストのみをクラスター内のサービスに転送します。 ingressが関連するConfigMapで指定されたTCPポートで受信した外部TCP要求を転送できるように、Ingress-nginxを設定できます。

手順:

  1. tcp-echoテンプレートを使用して、サービスと展開を展開します。

  2. 次のテンプレートを使用してConfigMapを作成します。

    1. tcp-services-cm.yamlファイルを変更します。 次に、変更を保存して終了します。

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: tcp-services
        namespace: kube-system 
      data:
        9000: "default/tcp-echo:9000" # This configuration indicates that external TCP requests received on port 9000 are forwarded to the tcp-echo Service in the default namespace. 
        9001:"default/tcp-echo:9001" 
    2. 次のコマンドを実行して、ConfigMapを作成します。

      kubectl apply -f tcp-services-cm.yaml
  3. nginx-ingress-controllerによって使用されるサービスのTCPポートを開きます。 次に、変更を保存して終了します。

    kubectl edit svc nginx-ingress-lb -n kube-system 
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx-ingress-lb
      name: nginx-ingress-lb
      namespace: kube-system
    spec:
      allocateLoadBalancerNodePorts: true
      clusterIP: 192.168.xx.xx
      ipFamilies:
      - IPv4
      ports:
      - name: http
        nodePort: 30xxx
        port: 80
        protocol: TCP
        targetPort: 80
      - name: https
        nodePort: 30xxx
        port: 443
        protocol: TCP
        targetPort: 443
      - name: tcp-echo-9000       # The port name.
        port: 9000                # The port number.
        protocol: TCP             # The protocol.
        targetPort: 9000          # The destination port.
      - name: tcp-echo-9001       # The port name.
        port: 9001                # The port number.
        protocol: TCP             # The protocol.
        targetPort: 9001
    selector:
        app: ingress-nginx
      sessionAffinity: None
      type: LoadBalancer
  4. 設定が有効かどうかを確認します。

    1. 次のコマンドを実行して、Ingressに関する情報を照会します。 Ingressに関連付けられているSLBインスタンスのIPアドレスを取得できます。

       kubectl get svc -n kube-system| grep nginx-ingress-lb 

      期待される出力:

      nginx-ingress-lb      LoadBalancer   192.168.xx.xx  172.16.xx.xx   80:31246/TCP,443:30298/TCP,9000:32545/TCP,9001:31069/TCP   
    2. ncコマンドを実行して、ポート9000に対応するIPアドレスにhelloworldを送信します。 応答が返されない場合、設定は有効になります。

      echo "helloworld" |  nc <172.16.xx.xx> 9000
      
      echo "helloworld" |  nc <172.16.xx.xx> 9001

NGINX Ingressに設定された証明書の一致ロジックとは

Ingressは、spec.tlsパラメーターを使用してTLS設定を指定し、spec.ru les.hostパラメーターを使用してIngressのドメイン名を指定します。 NGINX Ingressコントローラーは、Luaテーブルを使用してドメイン名と証明書の間のマッピングを格納します。

クライアントがHTTPSリクエストをNGINXに送信すると、リクエストには、リクエストの送信先のホストを指定するServer Name Indication (SNI) フィールドが含まれます。 NGINX Ingressは、certificate.ca ll() メソッドを使用して、証明書がドメイン名に関連付けられているかどうかを確認します。 証明書が見つからない場合、の証明書が返されます。

サンプルNGINX設定:


    ## start server _
    server {
        server_name _ ;
        listen 80 default_server reuseport backlog=65535 ;
        listen [::]:80 default_server reuseport backlog=65535 ;
        listen 443 default_server reuseport backlog=65535 ssl http2 ;
        listen [::]:443 default_server reuseport backlog=65535 ssl http2 ;
        set $proxy_upstream_name "-";
        ssl_reject_handshake off;
        ssl_certificate_by_lua_block {
            certificate.call()
        }
   ...
   }
    
    
    ## start server www.example.com
    server {
        server_name www.example.com ;
        listen 80  ;
        listen [::]:80  ;
        listen 443  ssl http2 ;
        listen [::]:443  ssl http2 ;
        set $proxy_upstream_name "-";
        ssl_certificate_by_lua_block {
            certificate.call()
        }
    ...
    }

ingress-nginxは、証明書のステータスを確認するために使用されるオンライン証明書ステータスプロトコル (OCSP) ステープル機能をサポートしています。 この機能を有効にすると、クライアントは認証局 (CA) で証明書のステータスを確認する必要がなくなります。 これにより、証明書の検証が高速化され、NGINXへのアクセスが高速化されます。 詳細については、「OCSPステープルの設定」をご参照ください。

NGINX Ingressと一致する証明書がない場合はどうすればよいですか?

証明書を格納するシークレットを見つけ、Base64-decoded証明書の内容を新しいファイルに保存します。 次に、opensslコマンドを実行して証明書を復号します。

kubectl get secret  <YOUR-SECRET-NAME>  -n <SECRET-NAMESPACE>  -o jsonpath={.data."tls\.crt"} |base64 -d  | openssl x509  -text -noout

アクセスしたドメイン名が [共通名 (CN)] フィールドに含まれているかどうかを確認します。 ドメイン名がCNフィールドに含まれていない場合は、新しい証明書を作成する必要があります。

NGINXポッドが高負荷シナリオでヘルスチェックに失敗した場合はどうすればよいですか?

ヘルスチェックは、NGINXのポート10246を介して /healthzパスにリクエストを送信することによって実行されます。

NGINXがヘルスチェックに失敗すると、次のメッセージが返されます。

I0412 11:01:52.581960       7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:01:55 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:01:55.895683       7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:02.582247       7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:05 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:05.896126       7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:12.582687       7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:15 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:15.895719       7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:22.582516       7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:25 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:25.896955       7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:28.983016       7 nginx.go:408] "NGINX process has stopped"
I0412 11:02:28.983033       7 sigterm.go:44] Handled quit, delaying controller exit for 10 seconds
I0412 11:02:32.582587       7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:35 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:35.895853       7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:38.986048       7 sigterm.go:47] "Exiting" code=0

過度の負荷のシナリオでは、NGINXのCPU使用率が急上昇し、100% に近づくことさえあります。 この場合、NGINXはヘルスチェックに失敗します。 この問題を解決するには、NGINXポッドをスケールアウトしてポッドを別のノードに展開することを推奨します。

cert-managerエラーが原因で証明書の発行に失敗した場合はどうすればよいですか?

この問題は、Web Application Firewall (WAF) が有効になっている場合に発生する可能性があります。 WAFは、証明書の発行を中断するHTTP01リクエストに干渉する可能性があります。 この問題を解決するには、WAFを無効にすることを推奨します。 WAFを無効にする前に、WAFを無効にした後の影響を評価します。

ピーク時のNGINXメモリ使用量の急増に対処するにはどうすればよいですか?

NGINXのピーク時にメモリ使用量の急増やメモリ不足 (OOM) エラーが発生した場合は、NGINXポッドにログインし、過剰なメモリを消費するプロセスを特定します。 ほとんどの場合、メトリック収集プロセスはメモリリークにつながります。 この問題は、NGINX Ingressコントローラー1.6.4で検出されます。 NGINX Ingressコントローラーを最新バージョンに更新し、スタートアップパラメーターに -- enable-metrics=falseを追加してメトリック収集を無効にすることを推奨します。 nginx_ingress_controller_ingress_upstream_latency_秒など、メモリ使用量が大幅に増加するメトリックの収集を無効にすることを推奨します。 詳細については、「Ingressコントローラーストレステスト」、「Prometheusメトリックコレクターメモリリーク」、および「Metrics PR」をご参照ください。

NGINX Ingressコントローラーのアップグレードの問題を修正

Nginx Ingressコントローラーカナリアアップグレードプロセス中に、プロセスが検証で停止し、「操作は失敗状態のタスクが禁止されています」というメッセージで続行できない場合、ほとんどの場合、コンポーネントのアップグレードタスクがシステムによって4日間の有効期間を超えた後にクリアされたためです。 コンポーネントのカナリアステータスを手動で調整する必要があります。

コンポーネントのアップグレードプロセスがリリースフェーズに達したら、次の手順をスキップします。 有効期間が4日を超えたために現在のタスクが自動的に停止するまで待つことができます。

手順:

パラメーターを変更すると、コンポーネントのアップグレードが自動的に再開され、古いポッドが置き換えられてカナリアのアップグレードが完了します。 ただし、ステータスはACKコンソールの [アドオン] ページに「進行中」と表示され、約2週間後に正常に戻ります。

  1. 次のコマンドを実行して、nginx-ingress-controllerの展開を変更します。

    kubectl edit deploy -n kube-system  nginx-ingress-controller
  2. 次のパラメーターを指定した値に設定します。

    • spec.minReadySeconds: 0

    • spec.progressDeadlineSeconds: 600

    • spec.strategy.rollingUpdate.maxSurge: 25%

    • spec.strategy.rollingUpdate.maxUnavailable: 25%

    image

  3. 設定後にファイルを保存します。

なぜchunked転送エンコーディングが機能しなくなるのですか?

コードがHTTPリクエストヘッダーTransfer-Encoding: chunkedを構成し、コントローラーログに重複ヘッダーに関連するエラーが表示された場合、NGINXの更新が原因である可能性があります。 詳細については、「NGINX更新ログ」をご参照ください。 v1.10以降、NGINXはHTTP応答の検証を強化しました。 その結果、複数のTransfer-Encoding: chunkedヘッダーを含むバックエンド応答は無効と見なされます。 バックエンドサービスがTransfer-Encoding: chunkedヘッダーを1つだけ返すようにする必要があります。 詳細については、『GitHub Issue #11162』をご参照ください。

NGINX IngressでIPアドレスのホワイトリストとブラックリストに基づいてアクセス制御を設定するにはどうすればよいですか?

NGINX Ingressのブラックリストまたはホワイトリストを設定して、特定のIPアドレスからのリクエストを拒否または許可するには、ConfigMapにキーと値のペアを追加するか、Ingressルーティングルールでアノテーションを使用します。 ConfigMapはグローバルに適用され、Ingress設定はルーティングレベルで有効になります。 Ingressルーティング設定は、グローバル設定よりも優先度が高くなります。 Ingressでアノテーションを追加する方法については、以下の表を参照してください。 詳細については、「Denylistソース範囲」および「ホワイトリストソース範囲」をご参照ください。

注釈

説明

nginx.ingress.kubernetes.io/denylist-source-range

特定のルートのIPアドレスブラックリストを指定します。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。

nginx.ingress.kubernetes.io/whitelist-source-range

特定のルートのIPアドレスホワイトリストを指定します。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。

NGINX Ingress v1.2.1の既知の問題

IngressにdefaultBackendフィールドがある場合、NGINXのデフォルトサーバーブロックのdefaultBackend設定が上書きされることがあります。 詳細については、『GitHub Issue #8823』をご参照ください。

この問題を解決するには、NGINX Ingressコントローラーをv1.3以降に更新することを推奨します。 更新方法の詳細については、「NGINX Ingressコントローラーの更新」をご参照ください。

アクセス時に接続リセットを処理する方法インターネットサービスは、カールコマンド?

curlコマンドを使用してHTTPプロトコルを使用して中国本土以外のインターネットサービスにアクセスすると、curl: (56) Recv failure: Connection reset by peerというエラーメッセージが表示されることがあります。 通常、これは、HTTPプレーンテキスト要求に機密キーワードが含まれている可能性があり、要求がブロックされたり、応答がリセットされたりするためです。 IngressルールのTLS証明書を設定して、暗号化を使用して通信が行われるようにすることができます。 TLS証明書を設定する方法の詳細については、「高度なNGINX Ingress設定」をご参照ください。