Kubernetes nginx入口控制器不转发带有下划线的标头

Posted

技术标签:

【中文标题】Kubernetes nginx入口控制器不转发带有下划线的标头【英文标题】:Kubernetes nginx ingress controller not forwarding headers with underscores 【发布时间】:2020-11-06 23:58:23 【问题描述】:

我的 kubernetes nginx 入口控制器转发带有下划线的标头时遇到问题。

我使用以下条目创建了一个名为 my-release-ingress-nginx-controller 的 configMap。

    enable-underscores-in-headers: "true"

在此之后,我通过描述 nginx 入口控制器 pod 使用此命令 kubectl exec -it my-release-ingress-nginx-controller-d7648bcc8-6lfxv cat nginx.conf 检查了 nginx.conf 文件。我在那里找到了这个underscores_in_headers on;。即使在此切换之后,nginx 仍然不会转发带有下划线的标头。

配置映射:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-release-ingress-nginx-controller
  namespace: default
data:
  enable-underscores-in-headers: "true"
  ignore-invalid-headers: "false"

ConfigMap 描述:

Name:         my-release-ingress-nginx-controller
Namespace:    default
Labels:       <none>
Annotations:  
Data
====
enable-underscores-in-headers:
----
true
ignore-invalid-headers:
----
false
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  27s   nginx-ingress-controller  ConfigMap default/my-release-ingress-nginx-controller

部署描述

Args:
  /nginx-ingress-controller
  --publish-service=default/my-release-ingress-nginx-controller
  --election-id=ingress-controller-leader
  --ingress-class=nginx
  --configmap=default/my-release-ingress-nginx-controller

入口描述:

Name:             ingress-resource-1
Namespace:        default
Address:          172.31.14.220
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                                               Path  Backends
  ----                                               ----  --------
  api.dev.com  
                                                     /   faq-dev:10013 (172.17.0.3:10013)
Annotations:                                         kubernetes.io/ingress.class: nginx
                                                     nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age                     From                      Message
  ----    ------  ----                    ----                      -------
  Normal  UPDATE  3m10s (x2443 over 20h)  nginx-ingress-controller  Ingress default/ingress-resource-1
  Normal  UPDATE  2m10s (x2483 over 20h)  nginx-ingress-controller  Ingress default/ingress-resource-1

PS:我在 AWS ec2 服务器内使用 minikube 设置了一个单节点 kubernetes 集群。此外,入口被配置为部署而不是守护程序集。配置的入口是来自此存储库的 kubernetes 之一 - https://github.com/kubernetes/ingress-nginx

【问题讨论】:

【参考方案1】:

请试试这个

apiVersion: v1
kind: ConfigMap
data:
  enable-underscores-in-headers: "true"
  ignore-invalid-headers: "false"
metadata:
  name: nginx-configuration
  namespace: default

并在 nginx-ingress-controller-deployment 中包含相同的内容

containers:
  - name: nginx-ingress-controller
    image: <YOUR NGINX INGRSS IMAGE_NAME>
    args:
      - /nginx-ingress-controller
      - --configmap=$(POD_NAMESPACE)/nginx-configuration
    env:
      - name: POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace

【讨论】:

您知道您可以编辑原始答案以改进或扩展它 @DashrathMundkar 我收到此错误 - cannot parse 'enable-underscores-in-headers' as bool: strconv.ParseBool: parsing "on": invalid syntax @PremkumarTejnani 尝试使用“true” @DashrathMundkar 我将 "on" 更改为 "true" ,并创建了 configMap,但问题仍然存在 @PremkumarTejnani,您是否将exec 放入入口以确保正确添加configmap【参考方案2】:
apiVersion: v1
kind: ConfigMap
data:
  enable-underscores-in-headers: "true"
metadata:
  name: nginx-configuration
  namespace: default

enabling underscore in headers

将此添加到配置后,需要滚动重启才能获取配置。

【讨论】:

以上是关于Kubernetes nginx入口控制器不转发带有下划线的标头的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx 入口控制器的 minikube Kubernetes 集群上没有入口地址

Kubernetes NGINX 入口控制器未获取 TLS 证书

Kubernetes nginx入口控制器不转发带有下划线的标头

自定义界面上自托管 Kubernetes 的入口

Nginx Ingress 给 404 未找到任何入口资源

Nginx 入口控制器 websocket 支持