使用带有动态参数的 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路径的路由无法按预期工作

如何让 SSH 在 Kubernetes 上运行?

使用 react json 的动态组件

使用 React Native 在 Firebase 中使用动态链接设置带有查询参数的动态深层链接

将数组动态分配到带有指针参数的函数中

Laravel:如何通过javascript加载带有动态参数的命名路由