将 Kubernetes 入口与两个服务和内部 Web API 路由一起使用

Posted

技术标签:

【中文标题】将 Kubernetes 入口与两个服务和内部 Web API 路由一起使用【英文标题】:Using Kubernetes ingress with two services and internal web API routing 【发布时间】:2021-06-15 06:07:18 【问题描述】:

我有两个 ASP.NET Core 应用程序 app1 和 app2。在这些应用程序中,我有这个简化代码中定义的路由:

app1:

endpoints.MapGet("/app1ep1", async context =>

    await context.Response.WriteAsync("x1");
);

endpoints.MapGet("/app1ep2", async context =>

    await context.Response.WriteAsync("x2");
);

应用程序2:

endpoints.MapGet("/app2ep1", async context =>

    await context.Response.WriteAsync("y1");
);

endpoints.MapGet("/app2ep2", async context =>

    await context.Response.WriteAsync("y2");
);

我试图定义一个将应用以下路由的入口规则但没有成功:

myhost.com/app1/app1ep1 将路由到服务 app1,然后内部路由到 ep1 myhost.com/app2/app2ep1 将路由到服务 app2,然后内部路由到 ep1 问题继续,如果需要额外说明,请发表评论

我的入口规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: myhost.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: myservice1
            port:
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: myservice2
            port:
              number: 80

实际结果是找到了服务,但出现 404 错误。换句话说,浏览到 myhost.com/app1/app1ep1(或任何其他组合)路由到服务 (myservice1) 但内部路由丢失。 有没有什么办法解决这一问题? 感谢您的帮助

编辑: 我注意到其他一些问题。我试图将问题减少到单一服务。所以我的入口现在看起来像:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: myhost.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: myservice1
            port:
              number: 80

还将这个控制器添加到“myservice1”应用中:

endpoints.MapGet("/", async context =>

    await context.Response.WriteAsync("x");
);

转到 myhost.com/app1 返回 404。这再次意味着找到了应用程序,但在应用程序中找不到路由(尽管我定义了“/”路由)。 也许这些信息可以帮助发现问题

【问题讨论】:

从容器内部(或从集群的一个节点,使用分配给运行此类应用程序的容器之一的 IP 地址)如果您在正确的地址处 curl,您将获得正确的响应还是像入口一样的 404? 【参考方案1】:

我已经通过以下入口规则解决了这个问题:

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: /app1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: myservice1
            port:
              number: 80
      - path: /app2(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: myservice2
            port:
              number: 80

【讨论】:

以上是关于将 Kubernetes 入口与两个服务和内部 Web API 路由一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 入口 |无法解析主机名

Kubernetes服务组件

Kubernetes 集群中两个服务之间使用 Ingress 作为 API 网关的通信

负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态

Kubernetes:通过入口将非 HTTP 请求路由到容器

Kubernetes(k8s)亲和性调度