【问题标题】:Application Gateway Ingress Controller only works with root path /应用程序网关入口控制器仅适用于根路径 /
【发布时间】:2021-08-15 00:55:34
【问题描述】:

我已经从以下 YAML 部署了来自 Microsoft 的标准 aspnet 应用程序:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: microservicesapp
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: aspnetapp
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: aspnetapp
spec:
  selector:
    app: aspnetapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: aspnetapp
  labels:
    app: aspnetapp
spec:
  containers:
  - image: "mcr.microsoft.com/dotnet/core/samples:aspnetapp"
    name: aspnetapp-image
    ports:
    - containerPort: 80
      protocol: TCP

当我调用与我的 AGW 资源关联的公共 IP 时,一切正常。但是,我想配置入口的路径,使其为/test。像这样:

  - http:
      paths:
      - path: /test
        backend:
          serviceName: aspnetapp
          servicePort: 80

当我尝试从集群外部调用端点时,这会导致 502 Bad Gateway。上述 YAML 中资源部署后的 Controller 日志:

I0918 17:25:16.798265       1 health_probes.go:55] Created default HTTP probe defaultprobe-Http
I0918 17:25:16.798272       1 health_probes.go:56] Created default HTTPS probe defaultprobe-Http
I0918 17:25:16.798279       1 ingress_rules.go:148] Found backend:default/aspnetapp
I0918 17:25:16.798405       1 health_probes.go:70] Created probe pb-default-aspnetapp-80-microservicesapp for ingress default/microservicesapp at service default/aspnetapp
I0918 17:25:16.798613       1 backendhttpsettings.go:190] Created backend http settings bp-default-aspnetapp-80-80-microservicesapp for ingress default/microservicesapp and service default/aspnetapp
I0918 17:25:16.798671       1 backendaddresspools.go:37] Created default backend pool defaultaddresspool
I0918 17:25:16.798698       1 backendaddresspools.go:48] Created backend pool pool-default-aspnetapp-80-bp-80 for service default/aspnetapp
I0918 17:25:16.798709       1 frontend_listeners.go:121] Processing Rules for Ingress: default/microservicesapp
I0918 17:25:16.798828       1 requestroutingrules.go:349] Attached pool pool-default-aspnetapp-80-bp-80 and http setting bp-default-aspnetapp-80-80-microservicesapp to path rule: pr-default-microservicesapp-0
I0918 17:25:16.798861       1 requestroutingrules.go:107] Bound path-based rule: rr-e1903c8aa3446b7b3207aec6d6ecba8a to listener: fl-e1903c8aa3446b7b3207aec6d6ecba8a ([    ], 80) and url path map url-e1903c8aa3446b7b3207aec6d6ecba8a
I0918 17:25:16.808144       1 mutate_app_gateway.go:174] Generated config:
...

设置路径的正确方法是什么,例如/test,以便将所有流向该路径的流量定向到 aspnetapp 服务?

【问题讨论】:

  • 你这里使用了微软管理的镜像,你怎么知道应用中有/test的路径。您是否从某处确认应用程序将在发送路径为/test 的请求时成功响应。如果是,您可以在此处发布该链接。
  • 通常,如果您提供路径 /test 并链接它后面的服务,当我们输入 appgw ip/test 到该服务或它后面的 pod 时,应该转发请求我不明白您为什么要问应用程序是否已配置 /测试。
  • /test 在应用程序网关级别对吗?您能否参考下面文档中的应用程序网关图片,如果我说错了,请告诉我。 docs.microsoft.com/en-us/azure/application-gateway/…
  • @vishal.k 有什么想法吗?
  • @DevOpsGeek 这里需要对应用网关的作用和502错误的含义有更深入的了解。您已将 /test 配置到 appgw 中的所述后端池。现在 appgw 会将请求转发到正确的后端,但是如果您的应用程序对这样的路径没有任何响应,那么它不会发回任何会导致 502 的响应。正如我在下面已经说过的,构建您自己的简单 nginx 映像/test 的 html 页面并尝试相同的情况,您就会明白这里发生了什么。

标签: kubernetes kubernetes-ingress azure-application-gateway


【解决方案1】:

在入口资源中添加路径前缀注释appgw.ingress.kubernetes.io/backend-path-prefix: "/"。该注释告诉应用程序网关创建一个HTTP设置,该设置将为路径/test/提供路径前缀覆盖

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: microservicesapp
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  rules:
  - http:
      paths:
      - path: /test
        backend:
          serviceName: aspnetapp
          servicePort: 80

【讨论】:

  • 我做到了。结果相同。
  • 查看 azure 应用网关入口控制器 pod 的日志
  • 我用日志更新了 OP。我也尝试了您在我的另一篇文章中建议的方法,但没有奏效。
  • @DevOpsGeek 它是在没有 HTML 和 CSS 的情况下加载的,因为应用程序被配置为只有当请求来自 / 时才能成功响应。这就是应用程序的设计方式。 AGIC在这里没问题。要自己确认这一点,请使用 nginx 构建一个自定义 docker 映像,该映像在路径 /test 处提供请求。然后问题中发布的入口配置将起作用。
  • 它以这种方式工作,但对于其他子路径会失败;这个相同的应用程序有一个链接“隐私”;使用您的入口设置,如果您单击链接“隐私”,它会为您提供 502。如果您有带有 rewrite-target 注释的 nginx,类似的入口效果很好 - 比如路径:/test(|/*) 和 rewrite-target:/在 webapp 的情况下,即使 css 也会加载 1 美元;只是AGIC处于非常早期的阶段。
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多