Edit

Managed NGINX ingress with the application routing add-on

Caution

The Kubernetes SIG Network and the Security Response Committee announced the upcoming retirement of the Ingress NGINX project, with maintenance ending in March 2026. There's no immediate action required today for AKS clusters using the application routing add-on with NGINX. Microsoft will provide official support for critical security patches for application routing add-on NGINX Ingress resources through November 2026.

AKS is aligning with upstream Kubernetes by moving to Gateway API as the long-term standard for ingress and L7 traffic management. We recommend you start planning your migration path based on your current setup:

One way to route Hypertext Transfer Protocol (HTTP) and secure (HTTPS) traffic to applications running on an Azure Kubernetes Service (AKS) cluster is to use the Kubernetes Ingress object. When you enable the application routing add-on with NGINX, it creates, configures, and manages an Ingress controller in your AKS cluster.

This article shows you how to enable the managed NGINX Ingress controller and configure an Ingress object to route traffic to an application in your AKS cluster.

Application routing add-on with NGINX features

The application routing add-on with NGINX delivers the following:

  • Easy configuration of managed NGINX Ingress controllers based on Kubernetes NGINX Ingress controller.
  • Integration with Azure DNS for public and private zone management.
  • SSL termination with certificates stored in Azure Key Vault.

For other configurations, see:

Important

Starting on September 30, 2027, Azure Kubernetes Service (AKS) no longer supports the Open Service Mesh (OSM) add-on. The upstream Open Service Mesh project has been retired.

If your cluster uses the OSM add-on, migrate to the Istio add-on before the end-of-support date. This retirement notice applies only to the managed OSM add-on and doesn't address open-source or self-managed service mesh installations. For migration steps, see Migration guidance from the OSM add-on to the Istio add-on. To stay informed about AKS announcements and updates, follow the AKS release notes.

Prerequisites

  • An Azure subscription. If you don't have an Azure subscription, you can create a free account.
  • Azure CLI version 2.54.0 or later installed and configured. Run az --version to find the version. If you need to install or upgrade, see Install Azure CLI.

Limitations

  • The application routing add-on supports up to five Azure DNS zones.

  • The application routing add-on can only be enabled on AKS clusters with managed identity.

  • All global Azure DNS zones integrated with the add-on have to be in the same resource group.

  • All private Azure DNS zones integrated with the add-on have to be in the same resource group.

  • Editing the ingress-nginx ConfigMap in the app-routing-system namespace isn't supported.

  • If a snippet annotation value matches any of the following blocked values, the Ingress isn't configured:

    Blocked value Effect
    load_module The Ingress isn't configured.
    lua_package The Ingress isn't configured.
    _by_lua The Ingress isn't configured.
    location The Ingress isn't configured.
    root The Ingress isn't configured.
    proxy_pass The Ingress isn't configured.
    serviceaccount The Ingress isn't configured.
    { The Ingress isn't configured.
    } The Ingress isn't configured.
    ' The Ingress isn't configured.
  • The add-on doesn't officially support injecting non-Microsoft-managed sidecars (for example, custom telemetry, logging, or security agents) into the ingress-nginx proxy pods that it manages. If you choose to inject your own sidecar into a managed proxy pod, Microsoft provides only best-effort support for any issues you encounter.

Enable the application routing add-on using Azure CLI

Enable on a new cluster

To enable application routing on a new cluster, use the az aks create command, specifying the --enable-app-routing flag.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --location <location> \
    --enable-app-routing \
    --generate-ssh-keys

Enable on an existing cluster

To enable application routing on an existing cluster, use the az aks approuting enable command.

az aks approuting enable --resource-group <resource-group-name> --name <cluster-name>

Connect to your AKS cluster

To connect to the Kubernetes cluster from your local computer, you use kubectl, the Kubernetes command-line client. You can install it locally using the az aks install-cli command. If you use the Azure Cloud Shell, kubectl is already installed.

Configure kubectl to connect to your Kubernetes cluster using the az aks get-credentials command.

az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>

Deploy an application

Kubernetes Ingress objects define routing rules for an Ingress controller. Use the application routing add-on's managed Ingress class and supported annotations to configure how its controller handles traffic.

  1. Create the application namespace called aks-store to run the example pods using the kubectl create namespace command.

    kubectl create namespace aks-store
    
  2. Deploy the AKS store application using the following YAML manifest file:

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/sample-manifests/docs/app-routing/aks-store-deployments-and-services.yaml -n aks-store
    

This manifest creates rabbitmq, order-service, product-service, and store-front Deployments and corresponding Services. The store-front Service exposes port 80, which the Ingress routes to in the next section.

Create the Ingress object

When you enable the application routing add-on, it creates an Ingress class named webapprouting.kubernetes.azure.com. Specify this class in an Ingress object to use the add-on's managed NGINX Ingress controller.

  1. Copy the following YAML manifest into a new file named ingress.yaml and save the file to your local computer.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: store-front
      namespace: aks-store
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - http:
          paths:
          - backend:
              service:
                name: store-front
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Create the ingress resource using the kubectl apply command.

    kubectl apply -f ingress.yaml -n aks-store
    

    The following example output shows the created resource:

    ingress.networking.k8s.io/store-front created
    

Verify the managed Ingress resource

You can verify the managed Ingress was created using the kubectl get ingress command.

kubectl get ingress -n aks-store

The following example output shows the created managed Ingress:

NAME          CLASS                                HOSTS   ADDRESS       PORTS   AGE
store-front   webapprouting.kubernetes.azure.com   *       51.8.10.109   80      110s

You can verify that the AKS store works by pointing your browser to the public IP address of the Ingress controller. The following command retrieves the external IP address assigned by the load balancer to the managed NGINX ingress controller's nginx Service in the app-routing-system namespace:

kubectl get service -n app-routing-system nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}"

Remove the application routing add-on

To remove the associated namespace, use the kubectl delete namespace command.

kubectl delete namespace aks-store

To remove the application routing add-on from your cluster, use the az aks approuting disable command.

az aks approuting disable --name <cluster-name> --resource-group <resource-group-name>

Note

To avoid potential disruption of traffic into the cluster when you disable the application routing add-on, some Kubernetes resources, including configMaps, secrets, and the deployment that runs the controller, remain on the cluster. These resources are in the app-routing-system namespace. You can remove these resources if they're no longer needed by deleting the namespace with kubectl delete ns app-routing-system.