配置 NGINX 入口控制器,以支持应用程序路由插件的 Azure 私有 DNS 区域

重要

Kubernetes SIG Network和安全响应委员会宣布即将停用Ingress NGINX项目, 维护将于2026年3月结束。 目前,使用 NGINX 的应用程序路由附加组件的 AKS 群集无需立即执行任何操作。 Microsoft将在 2026 年 11 月前为应用程序路由加载项 NGINX 入口资源提供关键安全修补程序的官方支持。

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

  • 应用程序路由加载项用户:生产工作负荷将继续得到全面支持,直至2026年11月。 AKS 将继续通过网关 API 对齐方式不断演变应用程序路由加载项。 无需移动到其他入口产品。
  • OSS NGINX 用户 有多个选项:
  • 服务网格用户:如果计划采用服务网格,请考虑 基于 Istio 的服务网格加载项。 今天使用 Istio 入口,计划在正式发布为 GA 时迁移到 Istio 网关 API 支持。

本文介绍如何将 NGINX 入口控制器配置为使用 Azure 内部负载均衡器。 它还介绍如何配置专用Azure DNS区域,以便为专用终结点启用 DNS 解析以解析特定域。

开始之前

连接到 AKS 群集

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

以下示例使用az aks get-credentials命令在test-rg中配置连接到名为aks-cluster的群集。

az aks get-credentials \
    --resource-group test-rg \
    --name aks-cluster

创建虚拟网络

若要将私有 DNS 区域发布到您的虚拟网络,请指定一个虚拟网络列表,这些网络通过 虚拟网络链接 被允许解析该区域中的记录。

以下示例在test-rg资源组中创建名为vnet-1的虚拟网络,以及在该虚拟网络内创建一个具有特定地址前缀的名为subnet-1的子网。

az network vnet create \
  --name vnet-1 \
  --resource-group test-rg \
  --location chinanorth3 \
  --address-prefix 10.2.0.0/16 \
  --subnet-name subnet-1 \
  --subnet-prefixes 10.2.0.0/24

创建Azure private DNS区域

注意事项

可以将应用程序路由加载项配置为针对入口资源上定义的主机自动在一个或多个Azure全局区域和private DNS区域上创建记录。 所有全局Azure DNS区域和所有专用Azure DNS区域必须位于同一资源组中。

使用 az network private-dns zone create 命令创建 DNS 区域,指定要在其中创建该区域的名称和资源组。 以下示例将在 test-rg 资源组中创建名为 private.contoso.com 的 DNS 区域。

az network private-dns zone create \
    --resource-group test-rg \
    --name private.contoso.com

您可以使用 az network private-dns link vnet create 命令创建一个指向之前创建的 DNS 区域的虚拟网络链接。 以下示例为虚拟网络 vnet-1 创建一个链接,链接名为 dns-link,指向区域 private.contoso.com。 要包括 --registration-enabled 参数以明确指定该链接未启用注册功能。

az network private-dns link vnet create \
    --resource-group test-rg \
    --name dns-link \
    --zone-name private.contoso.com \
    --virtual-network vnet-1 \
    --registration-enabled false

Azure DNS专用区域的自动注册功能管理部署在虚拟网络中的虚拟机的DNS记录。 当您将虚拟网络与启用此设置的私有 DNS 区域链接时,将会为部署在虚拟网络中的 AKS 节点上的每台 Azure 虚拟机创建 DNS 记录。

将Azure private DNS区域附加到应用程序路由加载项

注意事项

az aks approuting zone add 命令使用运行命令的用户的权限来创建 Azure DNS Zone 角色分配。 Private DNS区域参与者角色是用于管理private DNS资源的内置角色,并分配给加载项的托管标识。 有关 AKS 托管标识的详细信息,请参阅托管标识摘要

  1. 使用 az network dns zone show 命令检索 DNS 区域的资源 ID,并将输出设置为名为 ZONEID 的变量。 以下示例将查询资源组 test-rg 中的区域 private.contoso.com

    ZONEID=$(az network private-dns zone show \
    --resource-group test-rg \
    --name private.contoso.com \
    --query "id" \
    --output tsv)
    
  2. 更新加载项以使用 az aks approuting zone 命令启用与Azure DNS的集成。 可以传递以逗号分隔的 DNS 区域资源 ID 列表。 以下示例将更新资源组 test-rg 中的 AKS 群集 aks-cluster

    az aks approuting zone add \
    --resource-group test-rg \
    --name aks-cluster \
    --ids=${ZONEID} \
    --attach-zones
    

创建具有专用 IP 地址和内部负载均衡器的 NGINX 入口控制器

应用路由插件使用名为自定义资源定义(CRD)的 KubernetesNginxIngressController来配置 NGINX 入口控制器。 你可以创建更多入口控制器或修改现有配置。

NginxIngressController CRD 具有一个 loadBalancerAnnotations 字段,通过设置负载均衡器注释来控制 NGINX 入口控制器服务的行为。 有关负载均衡器注解的详细信息,请参阅 通过 Kubernetes 注解进行定制

执行以下步骤,创建一个带有私有 IP 地址并面向 Azure 内部负载均衡器的 NGINX Ingress 控制器。

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

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. 使用 kubectl apply 命令创建 NGINX 入口控制器资源。

    kubectl apply -f nginx-internal-controller.yaml
    

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

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. 验证是否已创建入口控制器

    可以使用 kubectl get nginxingresscontroller 命令验证 NGINX 入口控制器的状态。

    kubectl get nginxingresscontroller
    

    以下示例输出显示了创建的资源。 控制器可能需要几分钟时间才可用:

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

部署应用程序

应用程序路由附加产品使用 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
    

此清单会为 AKS 存储区应用程序创建必要的部署和服务。

在Azure专用DNS区域和专用 IP 地址上创建使用主机名的Ingress资源

使用 DNS 主机的名称更新 host,例如 store-front.private.contoso.com。 请确认是否为 ingressClassName 指定了 nginx-internal。

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

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: store-front
      namespace: aks-store
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: store-front.private.contoso.com
        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   nginx-internal   store-front.private.contoso.com             80      10s

验证是否已更新Azure private DNS区域

过几分钟,运行 az network private-dns record-set a list 命令以查看 Azure Private DNS 区域的 A 记录。 指定资源组的名称和 DNS 区域的名称。 在此示例中,资源组为 test-rg,DNS 区域为 private.contoso.com

az network private-dns record-set a list \
    --resource-group test-rg \
    --zone-name private.contoso.com

以下示例输出显示了所创建的记录:

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "ecc303c5-4577-4ca2-b545-d34e160d1c2d",
    "fqdn": "store-front.private.contoso.com.",
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/test-rg/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/store-front",
    "isAutoRegistered": false,
    "name": "store-front",
    "resourceGroup": "test-rg",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

后续步骤

有关与 SSL 加密、高级 NGINX 入口控制器和入口资源配置相关的其他配置信息,请查看 DNS 和 SSL 配置以及应用程序路由加载项配置