Search code examples
kubernetes-ingressazure-aksazure-application-gateway

Allow Azure Application Gateway to route all sub paths in AKS


I have AKS configured with Azure Application Gateway as my ingress.

I am trying to deploy a .net core Angular app to a path within the cluster. I would like to access the app on http://<cluster ip>/app1.

My kubernetes deployment (including ingress settings) is as follows:

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

In the Angular app itself, I have left <base href="/" /> in index.html. However, I have amended the build to now be ng build --base-href /app1/"


Issue

When this is deployed and I browse to http://<cluster ip>/app1 then it loads the index.html file. However it returns a 404 for all the additional scripts e.g. 404 on http://<cluster ip>/app1/main-es2015.9ae13a2658e759db61f5.js

The issue could be with how I've configured Angular, but browsing to http://<cluster ip>/app1/index.html returns a 404 when I know it can be accessed just using /app1/.

I believe the issue is that Application Gateway is not routing requests properly for anything after /app1/. How can I get it to allow sub routes through (i.e. the scripts)?

Thanks


Solution

  • Got this working now. If I looked at the 404 response headers it says it was from kestrel, so was hitting the dotnet core api, so it needs configuring there. All the changes I made were:

    Client:

    • Leave the base href as / e.g.
    • Add the base href to the build argument e.g. ng build --base-href /app1/"
    • In Configure of Startup.cs, add app.UsePathBase("/app1"); I do this in the else of env.IsDevelopment().

    Application Gateway:

    • Change the path for the rules to - path: /app1*. I didn't have the asterisk so wasn't routing all subsequent routes.