Ingress-NGINX - 根据路径动态设置主机头

问题描述 投票:0回答:1

我使用 Ingress-nginx,我需要根据原始请求的

Host
重写发送到代理 Kubernetes 服务的
path
标头。这必须基于某些变量或正则表达式来发生。我无法对路径进行硬编码,因为这需要自动适用于任何路径

基本上我需要这样的东西:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-ns
annotations:
    # below what's commented out almost works but adds a leading "/" to header
    # nginx.ingress.kubernetes.io/upstream-vhost: $request_uri.example.com;
    nginx.ingress.kubernetes.io/upstream-vhost: $PATH.example.com;
spec:
  ingressClassName: nginx
  rules:
    - host: 'example.com'
      http:
        paths:
        - backend:
            service:
              name: my-svc
              port:
                number: 80
          path: /$PATH
          pathType: Prefix

我想知道这是否可以通过注释

nginx.ingress.kubernetes.io/configuration-snippet
nginx.ingress.kubernetes.io/server-snippet
来实现,但我对这些注释的理解不够好。我已经通过传入
location
尝试了这些注释,并且还尝试使用
map
模块,但到目前为止没有运气。

上下文:此反向代理设置在 Knative 前面,Knative 的路由通过

Host
header 进行工作。

kubernetes nginx nginx-reverse-proxy nginx-ingress
1个回答
0
投票

一般来说,根据

Host
设置
path
标题可以这样实现:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-ns
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      location ~* "^/(?<myvar>.+)$" {
        proxy_set_header        Host $myvar.example.com;
        proxy_pass              http://my-svc.my-ns.svc.cluster.local;        
        proxy_http_version      1.1;
      }
spec:
  rules:
    - host: "example.com"
      http:
        paths:
        - backend:
            service:
              name: thisisignored
              port:
                number: 80
          path: /
          pathType: Prefix

所以我们需要

nginx.ingress.kubernetes.io/server-snippet
,而且必须加上
proxy_http_version 1.1;
,否则不行。

请注意,显然

server-snippet
推翻了规范中
service
的定义 -
backend.service.name
的值被忽略。因此,使用
server-snippet
注释时要小心,因为它可能会以某种方式破坏 Ingress 配置。

© www.soinside.com 2019 - 2024. All rights reserved.