[英]When using ingress-nginx in Kubernetes, is is possible to configure backends with captured groups from the path?
是否可以在 Kube.netes 中配置一个nginx
class 入口,后端引用来自路径正则表达式的捕获组? 在 ingress-nginx 文档https://kube.netes.github.io/ingress-nginx/user-guide/ingress-path-matching/中没有任何指示
我正在尝试降低入口路径/后端定义的复杂性,例如:
...
spec:
rules:
- http:
paths:
- path: /some/backend1/*
backend:
serviceName: backend1
- path: /some/otherbackend/*
backend:
serviceName: otherbackend
像这样:
spec:
rules:
- http:
paths:
- path: /some/([^/]+)/(.+)
backend:
serviceName: $1 # or \1 - possible to ref a capture group here?
在上面的示例中, path
的匹配正则表达式匹配“任何不是'/'重复的字符” - 即它将匹配下一个 URI 部分直到'/'。 然后我想传递给serviceName
。
这可能吗?
编辑
我找到了一种方法来解决这个问题。 这不是一种理想的实现方式,因为我将覆盖直接注入到 nginx 配置中。 与此类似的功能是否值得作为 nginx controller 功能请求?
我已经发布了一个解决方案来让它在下面工作,即使它有问题 - 请参阅下面的免责声明/问题。
免责声明:在重现之前,了解直接使用 nginx 配置的一些问题是很有用的 - 请看这个-
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dynamic-routing-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
set $proxy_upstream_name "default-$BackendService-8088";
spec:
rules:
- http:
paths:
- path: /dynamci/(?<BackendService>[^/]+)(.+)?
pathType: ImplementationSpecific
backend:
service:
name: backendservice
port:
number: 8088
现在,对/dynamic/x-backend
请求将被路由到x-backend
服务(如果存在)。 严重警告 - 假设您对服务定义有一致的规范(例如主机/端口/名称空间等)。
上面讨论缺乏健壮性的链接是 nginx controller 以相关方式转换为 nginx 配置,现在您正在进行 + 健全性检查(例如,通过准入验证程序),以及了解进入入口的内部 controller 命名约定定义。 如果没有configuration-snippet
注释, nginx 位置块会将proxy_upstream_name
设置为类似default-backendservice-8088
东西,但是配置片段稍后会注入另一set $proxy_upstream_name
参数,该参数与正则表达式中捕获的组的名称相匹配 - 所以你必须知道如何创建反向引用并手动维护它,同时确保覆盖代理参数与所有服务的定义方式一致(例如,如果您在不同端口上运行不同的后端服务,这将无法解决它它很快就会变得更加复杂)。
虽然它确实获得了所需的功能,但由于可靠性/稳健性问题,我不确定我是否会继续推进它......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.