如何在 Kubernetes 入口控制器中将请求 uri 的部分作为自定义标头传递



>我在ingress.yaml中有以下配置,它将带有uris的请求(如/default/demoservice/health或/custom/demoservice/health(转发到后端demoservice。我想从 uri 中检索 uri 的第一部分(即上面示例中的默认或自定义(,并将作为自定义标头传递给上游。

我已经部署了带有自定义标头的入口配置映射

X-MyVariable-Path: ${request_uri} 

但这会发送完整的请求 URI。如何拆分?

- path: "/(.*?)/(demoservice.*)$"
backend:
serviceName: demoservice
servicePort: 80

我找到了一个解决方案,对其进行了测试,它可以工作。
您所需要的只是向入口对象添加以下注释:

nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |  
proxy_set_header X-MyVariable-Path $1;  

其中$1引用path:字段中第一组正则表达式中捕获的任何内容。

我使用以下 yaml 重现了您的方案:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header  X-MyVariable-Path  $1;
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
spec:
rules:
- http:
paths:
- backend:
serviceName: echo
servicePort: 80
path: /(.*?)/(demoservice.*)$
---
apiVersion: v1
kind: Service
metadata:
labels:
run: echo
name: echo
spec:
ports:
- port: 80
targetPort: 80
selector:
run: echo
---
apiVersion: v1
kind: Pod
metadata:
labels:
run: echo
name: echo
spec:
containers:
- image: mendhak/http-https-echo
imagePullPolicy: Always
name: echo

您可以使用 curl 进行测试:

curl -k https://<your_ip>/default/demoservice/healthz

输出:

{
"path": "/default/demoservice/healthz",
"headers": {
"host": "192.168.39.129",
"x-request-id": "dfcc67a80f5b02e6fe6c647c8bf8cdf0",
"x-real-ip": "192.168.39.1",
"x-forwarded-for": "192.168.39.1",
"x-forwarded-host": "192.168.39.129",
"x-forwarded-port": "443",
"x-forwarded-proto": "https",
"x-scheme": "https",
"x-myvariable-path": "default", # your variable here
"user-agent": "curl/7.52.1",
"accept": "*/*"
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "192.168.39.129",
"ip": "::ffff:172.17.0.4",
"ips": [],
"protocol": "http",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "echo"
}
}

我希望它有帮助=(

我找到了两种方法来实现这一点。

一种是在配置映射中使用正则表达式来解析request_uri的第一部分。

若要执行上述操作,需要在执行此操作之前将nginx.ingress.kubernetes.io/use-regex: "true"注释添加到入口中。因为默认情况下将其设置为false

另一种方法是在注释本身中定义该特定标头,并添加类似以下内容$1下面是示例。

ingress.kubernetes.io/configuration-snippet: |
more_set_headers "X-MyVariable-Path: "$1;

不完全确定,这对你有用。但是我从这里的重写示例中得到了这个逻辑。

并添加路径,因为/customheader(/|$)(.*)这样的东西将创建一个捕获组。

希望它有效且有帮助。

相关内容

  • 没有找到相关文章

最新更新