将 Kubernetes 入口与两个服务和内部 Web API 路由一起使用
Using Kubernetes ingress with two services and internal web API routing
我有两个 ASP.NET 核心应用程序 app1 和 app2。在这些应用程序中,我有在这个简化代码中定义的路由:
app1:
endpoints.MapGet("/app1ep1", async context =>
{
await context.Response.WriteAsync("x1");
});
endpoints.MapGet("/app1ep2", async context =>
{
await context.Response.WriteAsync("x2");
});
app2:
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");
});
Going to myhost.com/app1 returns 404. 这再次意味着找到了应用程序,但在应用程序中找不到路由(尽管我定义了“/”路由)。
也许这些信息可以帮助发现问题
我已经使用以下入口规则解决了这个问题:
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: /
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
我有两个 ASP.NET 核心应用程序 app1 和 app2。在这些应用程序中,我有在这个简化代码中定义的路由:
app1:
endpoints.MapGet("/app1ep1", async context =>
{
await context.Response.WriteAsync("x1");
});
endpoints.MapGet("/app1ep2", async context =>
{
await context.Response.WriteAsync("x2");
});
app2:
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");
});
Going to myhost.com/app1 returns 404. 这再次意味着找到了应用程序,但在应用程序中找不到路由(尽管我定义了“/”路由)。 也许这些信息可以帮助发现问题
我已经使用以下入口规则解决了这个问题:
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: /
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