web-dev-qa-db-ja.com

nginxイングレスでカスタムヘッダーを正しく設定するにはどうすればよいですか?

次の構成があります。

デーモンセット:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
spec:
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:1.4.2-Alpine
        imagePullPolicy: Always
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: https
          containerPort: 443
          hostPort: 443
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret 

主な設定:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx-ingress
data:
  proxy-set-headers: "nginx-ingress/custom-headers"
  proxy-connect-timeout: "11s"
  proxy-read-timeout: "12s"
  client-max-body-size: "5m"
  gzip-level: "7"
  use-gzip: "true"
  use-geoip2: "true"

カスタムヘッダー:

apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-headers
  namespace: nginx-ingress
data:
  X-Forwarded-Host-Test: "US"
  X-Using-Nginx-Controller: "true"
  X-Country-Name: "UK" 

次の状況が発生しています。

  • 「proxy-connect-timeout」、「proxy-read-timeout」、または「client-max-body-size」のいずれかを変更すると、コントローラーポッドの生成された構成に変更が表示されます
  • 「gzip-level」(「use-gzip」を試した場合でも)または「use-geoip2」のいずれかを変更した場合、生成された構成に変更がありません(例:「gzip on;」は常にコメント化されており、他はありませんZipについて言及すると、gzipレベルはどこにも表示されません)
  • 「ingress-nginx/custom-headers」からのカスタムヘッダーはまったく追加されません(geoip2から値を渡すためにそれらを使用する予定でした)

それ以外の場合は、すべてが順調です。コントローラーログは、唯一のバックエンド(ヘッダーをダンプするexpressJsアプリ)がサーバーであることを示しており、期待どおりの応答が得られます。

Githubの例からできる限り多くをコピーして、最小限の変更を加えましたが、結果はありませんでした(カスタムヘッダーの例を確認する場合も含む)。

任意のアイデアやポインタがいただければ幸いです。

ありがとう!

3
Andrei Dascalu

コミュニティnginxイングレスコントローラーである ingress-nginx の代わりに、NGINX自体から kubernetes-ingress を使用しているようです。

サポートされているConfigMapキー がkubernetes-ingressに表示されている場合、gzipオプションはサポートされていません。 ConfigMap options がingress-nginxに表示される場合は、構成可能なすべてのgzipキーが表示されます。

community nginx入力コントローラーに切り替えてみてください。

2
Rico

Ingressルールのアノテーションを使用します。

Example:
 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "server: hide";
      more_set_headers "X-Content-Type-Options: nosniff";
      more_set_headers "X-Frame-Options: DENY";
      more_set_headers "X-Xss-Protection: 1";
  name: myingress
  namespace: default
spec:
  tls:
  - hosts:

Nginxサーバー1.15.9を使用しました

8
Petr Šejn

後世の場合:nginxコミュニティコントローラ=> quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0

nginx kubernetesコントローラー=> nginx/nginx-ingress:Edge(ドキュメントに表示)

コミュニティのカスタムヘッダーconfigmap => proxy-set-headers: "nginx-ingress/custom-headers"

kubernetesのカスタムヘッダーconfigmap => add-headers: "nginx-ingress/custom-headers"

1
Andrei Dascalu