托管的 NGINX Ingress,与应用程序路由附件一起使用

注意

Kubernetes SIG Network和安全响应委员会宣布即将停用Ingress NGINX项目, 维护将于2026年3月结束。 目前,使用 NGINX 的应用程序路由加载项的 AKS 群集无需立即执行任何操作。 Microsoft将为应用程序路由加载项的NGINX Ingress资源的重要安全补丁提供正式支持,支持截止至2026年11月。

AKS 正在迁移到 网关 API,这将作为入口和 L7 流量管理的长期标准,以便与上游 Kubernetes 社区保持一致。 建议根据当前设置开始规划迁移路径:

将超文本传输协议(HTTP)和安全(HTTPS)流量路由到Azure Kubernetes 服务 (AKS)群集上运行的应用程序的一种方法是使用 Kubernetes 入口对象。 使用 NGINX 启用应用程序路由加载项时,它会在 AKS 群集中创建、配置和管理入口控制器。

本文介绍如何启用托管 NGINX 入口控制器,并配置入口对象以将流量路由到 AKS 群集中的应用程序。

具有 NGINX 功能的应用程序路由加载项

由 NGINX 提供的应用程序路由插件提供以下功能:

  • 基于 Kubernetes NGINX 入口控制器,轻松配置托管的 NGINX 入口控制器。
  • 与用于公共和专用区域管理的 Azure DNS 集成。
  • SSL 终止,证书存储在Azure 密钥保管库中。

有关其他配置,请参阅:

Important

2027 年 9 月 30 日开始,Azure Kubernetes 服务(AKS)不再支持开放服务网格(OSM)加载项。 上游 Open Service Mesh 项目 已停用。

如果群集使用 OSM 加载项,请在支持结束日期之前迁移到 Istio 加载项。 此停用通知仅适用于托管 OSM 加载项,并且不适用于开源或自助服务网格安装。 有关迁移步骤,请参阅 OSM 加载项到 Istio 加载项的迁移指南。 若要随时了解 AKS 公告和更新,请按照 AKS 发行说明进行操作

先决条件

  • 一个 Azure 订阅。 如果没有Azure订阅,可以创建 Trial
  • Azure CLI 2.54.0 或更高版本安装并配置。 运行 az --version 即可查找版本。 如果需要安装或升级,请参阅 Install Azure CLI

限制

  • 应用程序路由加载项最多支持五个Azure DNS区域。

  • 应用程序路由加载项只能在具有托管标识的 AKS 群集上启用。

  • 与加载项集成的所有全局Azure DNS区域都必须位于同一资源组中。

  • 与加载项集成的所有专用Azure DNS区域都必须位于同一资源组中。

  • 不支持在命名空间 ConfigMap 中编辑 ingress-nginx app-routing-system

  • 如果代码片段注解值与以下任一被阻止的值匹配,则不会配置 Ingress:

    已阻止的值 Effect
    load_module Ingress 尚未配置。
    lua_package Ingress 未配置。
    _by_lua Ingress 尚未配置。
    location 未配置 Ingress。
    root 未配置 Ingress。
    proxy_pass Ingress 未配置。
    serviceaccount 未配置 Ingress。
    { Ingress 未配置。
    } 尚未配置 Ingress。
    ' Ingress 尚未配置。
  • 该加载项不官方支持将非 Azure 托管的边车容器(例如自定义遥测、日志记录或安全代理)注入到由其管理的 ingress-nginx 代理 Pod 中。 如果你选择将自定义 sidecar 容器注入受管代理 Pod,Microsoft 对于你遇到的任何问题仅提供尽力而为的支持。

使用 Azure CLI 启用应用程序路由加载项

在新群集上启用

若要在新群集上启用应用程序路由,请使用 az aks create 命令,指定 --enable-app-routing 标志。

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

在现有群集上启用

若要在现有群集上启用应用程序路由,请使用 az aks approuting enable 命令。

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

连接到 AKS 群集

若要从本地计算机连接到 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 可以使用 az aks install-cli 命令在本地安装它。 如果使用 Azure Cloud Shell,则已安装 kubectl

使用 kubectl 命令将 az aks get-credentials 配置为连接到你的 Kubernetes 群集。

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

部署应用程序

Kubernetes 入口对象定义入口控制器的路由规则。 使用应用程序路由加载项的托管 Ingress 类和受支持的注释来配置其控制器如何处理流量。

  1. 创建一个名为 aks-store 的应用程序命名空间,然后使用 kubectl create namespace 命令来运行示例 Pod。

    kubectl create namespace aks-store
    
  2. 使用以下 YAML 清单文件部署 AKS 存储应用程序:

    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
    

此清单将创建 rabbitmqorder-serviceproduct-servicestore-front Deployment 及其相应的 Service。 store-front 服务暴露端口 80,Ingress 会在下一节中将流量路由到该端口。

创建 Ingress 对象

启用应用程序路由加载项时,它会创建一个名为 webapprouting.kubernetes.azure.com 的入口类。 在 Ingress 对象中指定此 Ingress 类,以使用由该附加组件管理的 NGINX Ingress 控制器。

  1. 将以下 YAML 清单复制到名为 ingress.yaml 的新文件中,并将该文件保存到本地计算机。

    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. 使用 kubectl apply 命令创建入口资源。

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

    以下示例输出显示了创建的资源:

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

验证受管 Ingress 资源

可以使用 kubectl get ingress 命令验证是否已创建托管的 Ingress。

kubectl get ingress -n aks-store

以下示例输出显示了托管的 Ingress 已被创建:

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

您可以通过将浏览器指向 Ingress 控制器的公共 IP 地址来验证 AKS Store 是否运行正常。 以下命令检索负载均衡器分配给命名空间中的nginx托管 NGINX 入口控制器app-routing-system服务的外部 IP 地址:

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

删除应用程序路由加载项

若要删除关联的命名空间,请使用 kubectl delete namespace 命令。

kubectl delete namespace aks-store

若要从群集中删除应用程序路由加载项,请使用 az aks approuting disable 命令。

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

注意事项

为避免在禁用应用程序路由加载项时可能会中断流向群集的流量,某些 Kubernetes 资源(包括 configMap、机密和运行控制器的部署)将保留在群集上。 这些资源位于 app-routing-system 命名空间中。 如果不再需要这些资源,则可以通过使用 kubectl delete ns app-routing-system 删除该命名空间来删除这些资源。