【问题标题】:Is it possible to rewrite HOST header in k8s Ingress Controller?是否可以在 k8s Ingress Controller 中重写 HOST 标头?
【发布时间】:2019-07-04 14:21:48
【问题描述】:

由于一些依赖 Host 标头才能正常运行的遗留应用程序,我需要一个能够重写 Host 标头并将其传递到下游(后端)的 Ingress(代理等)。是否有任何 Ingress Controller 支持此功能?

例子:

最终用户通过foo.com/a 访问我们的网站,用于后端afoo.com/b 用于后端b。但由于ab 是遗留应用程序,它只接受:

  • Host: a.foo.coma 接受连接
  • Host: b.foo.comb 接受连接

【问题讨论】:

    标签: nginx kubernetes haproxy envoyproxy


    【解决方案1】:

    这可以使用这个注解来完成:nginx.ingress.kubernetes.io/upstream-vhost: host.example.com

    【讨论】:

      【解决方案2】:

      我不确定您是否可以在 NGINX Ingress Controller 中找到适当的注释来修改主机标头以匹配您的要求。但是,您可以考虑使用 nginx.ingress.kubernetes.io/configuration-snippet annotation 将配置 sn-p 附加到特定 Nginx 控制器 pod 的 nginx.conf 内的位置块:

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        annotations:
          kubernetes.io/ingress.class: nginx
          nginx.ingress.kubernetes.io/configuration-snippet: |
            proxy_set_header Host www.example-host.com;
        name: my-app
      spec:
        rules:
        - host: my-app.example.com
          http:
            paths:
            - backend:
              path: /app
                serviceName: my-app
                servicePort: http
      

      我们在这里为目标 URL my-app.example.com 设置主机头 www.example-host.com

      【讨论】:

      • 感谢configuration-snippet 的建议。虽然它仍然没有回答我的问题,但您的回答对于其他类似的用例仍然有用。
      • 我在使用它时收到有关设置多个主机头的错误。 nginx.conf 包含带有这个 sn-p 的双 proxy_set_header 主机
      • 这不起作用。将此注解添加到入口后,Keycloak 会抛出 400 Bad request。
      【解决方案3】:

      我想将我的发现添加到我的这个问题中。

      虽然我的解决方案没有使用 k8s Ingress Controller,但我们的集群使用的是 Istio,并且 Istio 的 VirtualService 支持重写 uriauthority(主机标头),如以下链接所述:https://istio.io/docs/reference/config/istio.networking.v1alpha3/#HTTPRewrite

      要了解我是如何实现的,您可以查看此链接:https://github.com/istio/istio/issues/11668

      【讨论】:

        【解决方案4】:

        您可以在 Kubernetes 上使用入口 nginx 控制器并设置头部,还可以从入口对象传输到后端并管理服务连接。

        这里分享从标题重写目标的链接:https://kubernetes.github.io/ingress-nginx/examples/rewrite/

        ingress nginx 也可以使用 SSL 证书管理器,您可以添加它。

        使用入口注释管理其他事物。

        查看入口 SSL 设置,您可以根据需要对其进行修改:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

        入口会像最后一样

        apiVersion: extensions/v1beta1
        kind: Ingress
        metadata:
          name: ingress
          annotations:
            kubernetes.io/ingress.class: nginx
            nginx.ingress.kubernetes.io/rewrite-target: /
        spec:
          tls:
          - hosts:
            - myapp.abc.com
            secretName: ingress-tls
          rules:
          - host: myapp.abc.com
            http:
              paths:
              - path: /my-service
                backend:
                  serviceName: my-backend
                  servicePort: 80
        

        【讨论】:

        • 嗨@Harsh,对不起,但我不认为 N​​ginx Ingress Controller 支持覆盖主机头。你能举个例子吗? AFAIK,它只支持 uri 路径重写
        • 是的,它只支持uri路径...你想写吗?
        • 我认为有了这个注释你就可以做到。 nginx.ingress.kubernetes.io/rewrite-target:/
        • 您好,Harsh,我想重写 Host/Authority 标头。在 vanilla nginx 中,可以通过proxy_set_header Host <custom-host>; 完成。
        • 非常感谢您的分享,我了解了一些未使用过的 vanilla nginx ..thanks