如何使用Nginx Ingress正确设置自定义标头?

And*_*alu 3 kubernetes nginx-ingress

我有以下配置:

守护进程:

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 
Run Code Online (Sandbox Code Playgroud)

主要配置:

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"
Run Code Online (Sandbox Code Playgroud)

自定义标题:

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" 
Run Code Online (Sandbox Code Playgroud)

我遇到以下情况:

  • 如果更改“代理连接超时”,“代理读取超时”或“客户端最大主体大小”之一,则可以看到更改显示在控制器窗格中的生成的配置中
  • 如果我更改了“ gzip级别”(甚至尝试过“ use-gzip”)或“ use-geoip2”之一,则看不到生成的配置中的任何更改(例如:“ gzip on;”总是被注释掉,并且没有其他注释)提及zip,则gzip级别不会出现在任何地方)
  • 来自“ ingress-nginx / custom-headers”的自定义标头根本没有添加(计划使用它们从geoip2传递值)

否则,一切正常,控制器日志显示我唯一的后端(转储标头的expressJs应用程序)是服务器正确的,我得到了预期的响应,依此类推。

我已经从github上的示例中复制了尽可能多的内容,进行了最少的更改,但没有结果(包括查看自定义标头的示例时)。

任何想法或指针将不胜感激。

谢谢!

Ric*_*ico 9

看起来您正在使用NGINX本身的kubernetes-ingress而不是社区 nginx 入口控制器ingress-nginx

如果您看到kubernetes-ingress支持的 ConfigMap 键,则不支持任何gzip选项。如果您看到ingress-nginx的ConfigMap 选项,您将看到所有可以配置的 gzip 密钥。

尝试切换到社区nginx 入口控制器。

更新:

您也可以使用configuration-snippet注释来做到这一点:

nginx.ingress.kubernetes.io/configuration-snippet: |
   more_set_headers "X-Forwarded-Host-Test: US";
   more_set_headers "X-Using-Nginx-Controller: true";
   more_set_headers "X-Country-Name: UK";
   more_set_headers "Header: Value";
   ...
Run Code Online (Sandbox Code Playgroud)


小智 8

使用入口规则注释。

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:
Run Code Online (Sandbox Code Playgroud)

我使用了Nginx服务器1.15.9

  • @Łukasz 入口的主要配置有一个属性:proxy-set-headers。它的值是namespace/configmap-name。其中目标配置映射是将在从入口到后端服务的请求上设置的标头映射。 (3认同)
  • @AndreiDascalu您可以通过更改为more_set_input_headers将其用于请求标头,请参阅此处https://github.com/openresty/headers-more-nginx-module#more_set_input_headers (3认同)
  • 你的例子是*响应头*,我的问题是关于后端的请求头。 (2认同)

And*_*alu 5

对于后代:nginx 社区控制器 => quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0

nginx kubernetes 控制器 => nginx/nginx-ingress:edge(如文档所示)

社区的自定义标头配置映射 => 代理集标头:“nginx-ingress/custom-headers”

kubernetes 的自定义标头配置映射 => 添加标头:“nginx-ingress/custom-headers”


Cur*_*ous 5

annotations:
  nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_input_headers "headername: value";
Run Code Online (Sandbox Code Playgroud)