使用带有动态参数的 Kubernetes Ingress 到 Web API
Posted
技术标签:
【中文标题】使用带有动态参数的 Kubernetes Ingress 到 Web API【英文标题】:Use Kubernetes Ingress with dynamic parameters to web API 【发布时间】:2021-06-14 18:05:26 【问题描述】:我在使用 Kubernetes Ingress 和 ASP.NET 核心 Web API 时遇到问题。
假设我有一个带有三个控制器的 Web API(用于演示三个路由 /、/ep1、/ep2 的简化代码):
endpoints.MapGet("/", async context =>
await context.Response.WriteAsync("##");
);
endpoints.MapGet("/ep1", async context =>
await context.Response.WriteAsync("1");
);
endpoints.MapGet("/ep2", async context =>
await context.Response.WriteAsync("2");
);
我想要的是定义一个将内部路由传递给应用程序的入口规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: myhost.com
http:
paths:
- path: /(/|$)(.*)
pathType: Prefix
backend:
service:
name: myservice
port:
number: 80
然后我期望发生的是浏览到 myhost.com/ 将返回“##”,myhost.com/ep1 将返回“1”,myhost.com/ep2 将返回“2” 但是,所有三个路由都返回“##”
我在配置入口时是否做错了什么?使用入口规则时它甚至可能吗?如果没有,您如何创建使用动态参数的控制器?假设我想要一个 Web API 来返回某个用户 ID 的银行金额,当在 GET 路径中指定其 ID 时:myhost.com/balance/1312323,我如何使用 Web API 和 Kubernetes 的入口规则来实现这一点?
感谢您的帮助
【问题讨论】:
【参考方案1】:应用内的路由应由应用处理。因此,应该不需要定义动态路径。试试这个。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myhost.com
http:
paths:
- path: /
backend:
service:
name: myservice
port:
number: 80
【讨论】:
谢谢,这确实解决了我最初提出的问题。但是,似乎以这种方式对入口 http 路由没有任何意义。如果我有两个要路由的服务怎么办?示例:myhost.com/app1/ep1 将被路由到服务“app1”,应用程序将处理 ep1 路由。 myhost.com/app2/ep1 将被路由到服务“app2”,应用程序将处理 ep1 路由。这可能吗? 是的,那么您将在路径下定义两个项目。每个服务一个。示例:raw.githubusercontent.com/kubernetes/website/master/content/en/… 这对我不起作用。我收到 404 错误。这意味着找到了应用程序,但内部路由 (ep1) 不起作用。我将尝试简化我的问题:我需要的是 myhost.com/app/ep1 将路由到应用程序内部配置的 ep1 路由。 '/app' 将路由到应用程序本身。 尝试删除重写目标注释 这仍然不起作用。我已删除所有注释。该规则现在具有 - path: /app 和 pathType: Prefix。转到 myhost.com/app/ep1 返回 404。以上是关于使用带有动态参数的 Kubernetes Ingress 到 Web API的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes入口中基于Traefik路径的路由无法按预期工作