我正在为 nginx 入口控制器创建 Kubernetes 入口资源。我将使用的路径有一个 ID,我需要将其提取到一个变量中,该变量可能位于路径中的不同位置。例如:
http://myservice/environment/<someenv>/room/<roomid>
http://myservice/join/<roomid>
如果我在正则表达式中使用未命名的捕获组,那么第一个路径roomid
将是$2
,第二个路径将是$1
. 理想情况下,我可以使用命名捕获组将其分配给我可以轻松使用的特定变量,但是使用命名捕获组创建具有以下路径的 Ingress 会导致错误
# ingresses.networking.k8s.io "nginx-consistent" was not valid:
# * spec.rules[0].http.paths[0].path: Invalid value: "/join/(?<roomid>.*)": must be a valid regex
是否有支持使用命名捕获组的方法?
当前的配置并没有太多有趣的地方。以下是精简的配置。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: {{.Release.Name}}-nginx-route-by-roomid
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/upstream-hash-by: "roomid-$roomid"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header ingress-handler nginx-route-by-roomid;
spec:
rules:
- http:
paths:
- backend:
serviceName: {{ .Values.service.serviceName }}
servicePort: {{ .Values.service.servicePort }}
path: /api/v1/rooms/(?<roomid>[^/]*)
- backend:
serviceName: {{ .Values.service.serviceName }}
servicePort: {{ .Values.service.servicePort }}
path: /api/v1/players/([^/]*)/rooms/(?<roomid>[^/]*)