是否可以在k8s Ingress Controller中重写HOST标头?

时间:2019-02-11 05:52:09

标签: nginx kubernetes haproxy envoyproxy

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

示例:

最终用户通过foo.com/a访问我们的网站,以访问后端a,通过foo.com/b访问后端b。但是由于ab是旧版应用,因此仅接受:

  • aHost: a.foo.com
  • 时接受连接
  • bHost: b.foo.com
  • 时接受连接

4 个答案:

答案 0 :(得分:1)

我不确定您是否可以在NGINX Ingress Controller中修改Host标头来满足您的要求。但是,您可以考虑使用nginx.ingress.kubernetes.io/configuration-snippet annotation,以便将配置代码段附加到特定Nginx控制器容器的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 www.example-host.com设置了主机标头my-app.example.com

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以在kubernetes上使用Ingress Nginx控制器,并设置head和Transer来后端和管理来自Ingress对象的服务连接。

在此处共享用于从标头重写目标的链接。

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