你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:创建由 ALB 控制器托管的适用于容器的 Azure 应用程序网关

本指南假定你采用的是由 ALB 控制器托管的部署策略,即所有适用于容器的 Azure 应用程序网关资源均由 ALB 控制器托管。 生命周期由 Kubernetes 中定义的资源确定。 在群集上定义 ApplicationLoadBalancer 自定义资源时,ALB 控制器创建适用于容器的 Azure 应用程序网关资源。 适用于容器的 Azure 应用程序网关的生命周期取决于自定义资源的生命周期。

先决条件

请确保已事先将 ALB 控制器部署到 Kubernetes 群集中。 如果尚未部署 ALB 控制器,请参阅快速入门:部署适用于容器的 Azure 应用程序网关 ALB 控制器

为适用于容器的 Azure 应用程序网关准备好虚拟网络/子网

如果没有至少拥有 250 个可用 IP 地址的子网,且委派给适用于容器的 Azure 应用程序网关资源,请使用以下步骤创建新子网并启用子网委派。 新的子网地址空间不能与 VNet 中的任何现有子网重叠。

若要将适用于容器的 Azure 应用程序网关部署到包含 AKS 群集的虚拟网络中,请运行以下命令查找并分配群集的虚拟网络。 下一步中会用到此信息。

AKS_NAME='<your cluster name>'
RESOURCE_GROUP='<your resource group name>'

MC_RESOURCE_GROUP=$(az aks show --name $AKS_NAME --resource-group $RESOURCE_GROUP --query "nodeResourceGroup" -o tsv)
CLUSTER_SUBNET_ID=$(az vmss list --resource-group $MC_RESOURCE_GROUP --query '[0].virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].subnet.id' -o tsv)
read -d '' VNET_NAME VNET_RESOURCE_GROUP VNET_ID <<< $(az network vnet show --ids $CLUSTER_SUBNET_ID --query '[name, resourceGroup, id]' -o tsv)

运行以下命令,创建至少包含 250 个可用 IP 地址的新子网,并且为适用于容器的 Azure 应用程序网关关联资源启用子网委派:

SUBNET_ADDRESS_PREFIX='<network address and prefix for an address space under the vnet that has at least 250 available addresses (/24 or larger subnet)>'
ALB_SUBNET_NAME='subnet-alb' # subnet name can be any non-reserved subnet name (i.e. GatewaySubnet, AzureFirewallSubnet, AzureBastionSubnet would all be invalid)
az network vnet subnet create \
  --resource-group $VNET_RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $ALB_SUBNET_NAME \
  --address-prefixes $SUBNET_ADDRESS_PREFIX \
  --delegations 'Microsoft.ServiceNetworking/trafficControllers'
ALB_SUBNET_ID=$(az network vnet subnet show --name $ALB_SUBNET_NAME --resource-group $VNET_RESOURCE_GROUP --vnet-name $VNET_NAME --query '[id]' --output tsv)

向托管标识委派权限

ALB 控制器需要能够预配新的适用于容器的 Azure 应用程序网关,并加入供适用于容器的 Azure 应用程序网关关联资源使用的子网。

以此示例中,我们将“容器配置管理的 AppGW”角色委派给包含托管群集的资源组,将“网络参与者”角色委派给适用于容器的 Azure 应用程序网关关联子网使用的子网,其中包括 Microsoft.Network/virtualNetworks/subnets/join/action 权限。

如果需要,可以使用 Microsoft.Network/virtualNetworks/subnets/join/action 权限创建并分配自定义角色,消除“网络参与者”角色中包含的其他权限。 详细了解如何管理子网权限

IDENTITY_RESOURCE_NAME='azure-alb-identity'

MC_RESOURCE_GROUP=$(az aks show --name $AKS_NAME --resource-group $RESOURCE_GROUP --query "nodeResourceGroup" -otsv | tr -d '\r')

mcResourceGroupId=$(az group show --name $MC_RESOURCE_GROUP --query id -otsv)
principalId=$(az identity show -g $RESOURCE_GROUP -n $IDENTITY_RESOURCE_NAME --query principalId -otsv)

# Delegate AppGw for Containers Configuration Manager role to AKS Managed Cluster RG
az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --scope $mcResourceGroupId --role "fbc52c3f-28ad-4303-a892-8a056630b8f1" 

# Delegate Network Contributor permission for join to association subnet
az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --scope $ALB_SUBNET_ID --role "4d97b98b-1d4f-4787-a291-c67834d212e7" 

创建 ApplicationLoadBalancer Kubernetes 资源

  1. 定义供 ApplicationLoadBalancer 资源使用的 Kubernetes 命名空间
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: alb-test-infra
EOF
  1. 定义 ApplicationLoadBalancer 资源,指定适用于容器的 Azure 应用程序网关关联资源应部署到哪个子网 ID 中。 该关联可从适用于容器的 Azure 应用程序网关建立连接到定义的子网(以及适用的联网网络),从而能够将流量代理到定义的后端。

注意

当 ALB 控制器在 ARM 中创建适用于容器的应用程序网关资源时,它将对其资源使用以下命名约定:

  • alb-<8 个随机生成的字符>,用于定义适用于容器的应用程序网关资源
  • as-<8 个随机生成的字符>,用于定义关联资源

如果要更改在 Azure 中创建的资源的名称,请考虑按照创建自己的部署策略中的说明进行操作。

运行以下命令,以创建适用于容器的应用程序网关资源和关联。

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: ApplicationLoadBalancer
metadata:
  name: alb-test
  namespace: alb-test-infra
spec:
  associations:
  - $ALB_SUBNET_ID
EOF

验证是否创建适用于容器的 Azure 应用程序网关资源

创建 ApplicationLoadBalancer 资源后,就可以跟踪适用于容器的 Azure 应用程序网关资源的部署进度。 完成预配后,部署从“进行中”转换为“已编程”状态。 创建适用于容器的 Azure 应用程序网关需要 5-6 分钟。

可以通过运行以下命令来检查 ApplicationLoadBalancer 的状态:

kubectl get applicationloadbalancer alb-test -n alb-test-infra -o yaml -w

从 Kubernetes 成功预配适用于容器的 Azure 应用程序网关资源的示例输出。

status:
  conditions:
  - lastTransitionTime: "2023-06-19T21:03:29Z"
    message: Valid Application Gateway for Containers resource
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:03:29Z"
    message: alb-id=/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.ServiceNetworking/trafficControllers/alb-zzz
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: Deployment

后续步骤

恭喜你已在群集上安装 ALB 控制器,并在 Azure 中部署了适用于容器的应用程序网关!

请尝试参考操作指南中的部分内容,部署示例应用,指南中演示了适用于容器的应用程序网关的一些负载均衡概念。