You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes中Nginx Ingress Controller能否通过正则路径动态匹配服务名并使用命名端口?

Kubernetes中Nginx Ingress Controller能否通过正则路径动态匹配服务名并使用命名端口?

嘿,我来给你捋清楚这个问题哈!

首先直接给你结论:你设想的那种在Ingress规则里用service: name: foo-$1的写法,在标准Kubernetes Ingress API和Nginx Ingress Controller里都是行不通的。原因很简单——Ingress的规则是静态配置的,Kubernetes的Ingress资源设计时就没支持用路径正则的捕获组来动态生成服务名称,服务名必须是集群中已经存在的固定名称。

不过关于Nginx Ingress的正则支持,这里要补充一下:它确实支持路径的正则匹配,但这种正则只能用来修改请求路径,比如通过nginx.ingress.kubernetes.io/rewrite-target注解来重写请求路径,没办法用来动态替换服务名或者端口。而且要启用路径正则的话,你需要把pathType设为ImplementationSpecific,因为PrefixExact类型不支持正则表达式。

再说说你关心的命名端口部分:如果服务已经存在,Ingress里用port: name: user-pod-exposed是完全没问题的!只要你的Service定义里已经命名了这个端口,不管容器实际用的是哪个端口,Kubernetes都会自动帮你做好映射,这部分不用操心。

那针对你的场景,有几个可行的解决方案:

  • 自定义Lua脚本扩展Nginx Ingress:利用Nginx Ingress的Lua扩展能力,在请求到达时解析路径里的UUID,然后通过Kubernetes API或者DNS查询对应的foo-<UUID>服务,再动态转发请求。不过这个方案需要你对Nginx Ingress的配置有一定了解,还要处理服务不存在的错误情况(比如返回404),以及做好缓存避免频繁查询。
  • 中间代理服务中转:创建一个专门的中间代理服务(比如用Go/Node.js写个简单的服务,或者再部署一个Nginx),Ingress把所有/user/*的请求都转发到这个中间服务,然后由它根据路径里的UUID去动态转发到对应的foo-<UUID>服务和命名端口。这种方式更直观,不需要修改Ingress Controller的底层配置,上手门槛低一些。
  • 按端口类型分组配置Ingress:如果你的新用户Pod可以按端口类型分组(比如分成两类端口),那可以创建不同的Ingress规则,比如/user/type1/([a-z0-9]+)对应一类服务,/user/type2/([a-z0-9]+)对应另一类服务。但如果用户Pod是完全动态创建的,这个方案就不适用了。

备注:内容来源于stack exchange,提问作者CodeGorilla

火山引擎 最新活动