Разрешить шлюзу приложений Azure маршрутизировать все вложенные пути в AKS

#kubernetes-ingress #azure-aks #azure-application-gateway

#kubernetes-вход #azure-aks #azure-application-gateway

Вопрос:

У меня настроен AKS с шлюзом приложений Azure в качестве входа.

Я пытаюсь развернуть приложение .net core Angular на пути внутри кластера. Я хотел бы получить доступ к приложению http://<cluster ip>/app1 . .

Мое развертывание kubernetes (включая настройки входа) выглядит следующим образом:

 apiVersion: v1
kind: Pod
metadata:
  name: web-app-1
  labels:
    app: web-app-1
spec:
  containers:
  - image: "xxx.azurecr.io/web-app-1:latest"
    name: web-app-1
    imagePullPolicy: Always
    ports:
    - containerPort: 80
      protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: web-app-1
spec:
  selector:
    app: web-app-1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-app-1
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: web-app-1
          servicePort: 80
  

В самом приложении Angular я оставил <base href="/" /> index.html . Тем не менее, я внес изменения в сборку, чтобы теперь ng build --base-href /app1/"


Проблема

Когда это будет развернуто, и я перейду к http://<cluster ip>/app1 нему, он загрузит index.html досье. Однако он возвращает 404 для всех дополнительных сценариев, например, 404 на http://<cluster ip>/app1/main-es2015.9ae13a2658e759db61f5.js

Проблема может быть в том, как я настроил Angular, но просмотр http://<cluster ip>/app1/index.html возвращает 404, когда я знаю, что к нему можно получить доступ только с помощью /app1/ .

Я считаю, что проблема в том, что шлюз приложений не маршрутизирует запросы должным образом для чего-либо после /app1/ . Как я могу заставить его разрешить прохождение вложенных маршрутов (т.Е. Скриптов)?

Спасибо

Ответ №1:

Теперь это работает. Если я посмотрел на заголовки ответа 404, в нем говорится, что он был от kestrel, поэтому он попал в api ядра dotnet, поэтому его нужно настроить там. Все изменения, которые я внес, были:

Клиент:

  • Оставьте базовую ссылку href как / , например
  • Добавьте базовую ссылку href в аргумент сборки, например, ng build —base-href /app1/»
  • В Configure of Startup.cs , добавьте app.UsePathBase("/app1"); , что я делаю это в else of env.IsDevelopment() .

Шлюз приложений:

  • Измените путь для правил на - path: /app1* . У меня не было звездочки, поэтому я не маршрутизировал все последующие маршруты.

Ответ №2:

Вы также можете сделать что-то вроде этого

 apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: appgw-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  rules:
  - http:
      paths:
      - path: /api/*
    ....
  

Где вы обновляете форму префикса маршрутизации «/» на «/ api / *» . В частности, эта аннотация

 appgw.ingress.kubernetes.io/backend-path-prefix: "/"