我使用 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 进行工作。
一般来说,根据
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 配置。