本指南假定你采用的是由 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 资源
- 定义供 ApplicationLoadBalancer 资源使用的 Kubernetes 命名空间
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: alb-test-infra
EOF
- 定义 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 中部署了适用于容器的应用程序网关!
请尝试参考操作指南中的部分内容,部署示例应用,指南中演示了适用于容器的应用程序网关的一些负载均衡概念。