【问题标题】:Use Kubernetes Ingress with dynamic parameters to web API使用带有动态参数的 Kubernetes Ingress 到 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 的入口规则来实现这一点?

感谢您的帮助

【问题讨论】:

    标签: c# nginx kubernetes asp.net-web-api nginx-ingress


    【解决方案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。
    猜你喜欢
    • 2019-02-05
    • 2017-07-25
    • 2020-05-03
    • 2013-09-24
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多