使用应用程序路由加载项将 NGINX 入口控制器配置为支持 Azure 专用 DNS 区域
本文介绍如何配置 NGINX 流入量控制器,以便使用 Azure 内部负载均衡器。 其中还介绍了如何配置专用 Azure DNS 区域,以便为专用终结点启用 DNS 解析,以解析特定域。
具有应用程序路由附加产品的 AKS 群集。
若要附加 Azure 专用 DNS 区域,需要在 Azure 订阅上具有所有者、Azure 帐户管理员或 Azure 共同管理员角色。
若要从本地计算机连接到 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 全局和专用 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 区域的虚拟机链接。 以下示例将创建名为 dns-link 的链接,该链接将指向虚拟网络 vnet-1 的区域 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 节点的每个虚拟机创建 DNS 记录。
备注
az aks approuting zone add
命令使用运行该命令的用户的权限来创建 Azure DNS 区域角色分配。 “专用 DNS 区域参与者”角色是用于管理专用 DNS 资源的内置角色,并分配给该加载项的托管标识。 有关 AKS 托管标识的详细信息,请参阅托管标识摘要。
使用
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)
使用
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
应用程序路由附加产品使用称作 NginxIngressController
的 Kubernetes 自定义资源定义 (CRD) 来配置 NGINX 入口控制器。 你可以创建更多入口控制器或修改现有配置。
NginxIngressController
CRD 有一个 loadBalancerAnnotations
字段,该字段通过设置负载均衡器批注来控制 NGINX 流入量控制器的行为。 若要详细了解负载均衡器批注,请参阅通过 Kubernetes 批注进行自定义。
执行以下步骤来创建具有面向内部的 Azure 负载均衡器(使用专用 IP 地址)的 NGINX 入口控制器。
将以下 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"
使用
kubectl apply
命令创建 NGINX 入口控制器资源。kubectl apply -f nginx-internal-controller.yaml
以下示例输出显示了已创建的资源:
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
验证是否已创建入口控制器
可以使用
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 对象的注释来创建适当的资源。
创建名为
aks-store
的应用程序命名空间,以使用kubectl create namespace
命令运行示例 Pod。kubectl create namespace aks-store
使用以下 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 存储区应用程序创建必要的部署和服务。
使用 DNS 主机的名称更新 host
,例如 store-front.private.contoso.com。 验证是否正在为 ingressClassName 指定 nginx-internal。
将以下 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
使用
kubectl apply
命令创建入口资源。kubectl apply -f ingress.yaml -n aks-store
以下示例输出显示了已创建的资源:
ingress.networking.k8s.io/store-front created
可以使用 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
几分钟后,运行 az network private-dns record-set a list 命令来查看 Azure 专用 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 配置以及应用程序路由加载项配置。