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

快速入门:部署适用于容器的应用程序网关 ALB 控制器

ALB 控制器负责将 Kubernetes 中的网关 API 和 Ingress API 配置转换为适用于容器的应用程序网关中的负载均衡规则。 以下指南介绍了将 ALB 控制器预配到新的或现有 AKS 群集所需的步骤。

先决条件

在 Azure 上部署适用于容器的应用程序网关并在群集上安装 ALB 控制器之前,需要完成以下任务:

  1. 准备 Azure 订阅和 az-cli 客户端。

    # Sign in to your Azure subscription.
    SUBSCRIPTION_ID='<your subscription id>'
    az login
    az account set --subscription $SUBSCRIPTION_ID
    
    # Register required resource providers on Azure.
    az provider register --namespace Microsoft.ContainerService
    az provider register --namespace Microsoft.Network
    az provider register --namespace Microsoft.NetworkFunction
    az provider register --namespace Microsoft.ServiceNetworking
    
    # Install Azure CLI extensions.
    az extension add --name alb
    
  2. 为工作负载设置 AKS 群集。

    注意

    AKS 群集需要位于适用于容器的应用程序网关可用的区域中,并且 AKS 群集应使用 Azure CNI。 AKS 群集应启用工作负载标识功能。 了解如何在现有 AKS 群集上启用工作负载标识。

    如果使用现有群集,请确保在 AKS 群集上启用工作负载标识支持。 可以通过以下方法启用工作负载标识:

     AKS_NAME='<your cluster name>'
    RESOURCE_GROUP='<your resource group name>'
    az aks update -g $RESOURCE_GROUP -n $AKS_NAME --enable-oidc-issuer --enable-workload-identity --no-wait
    

    如果没有现有群集,请使用以下命令创建启用了 Azure CNI 和工作负载标识的新 AKS 群集。

    AKS_NAME='<your cluster name>'
    RESOURCE_GROUP='<your resource group name>'
    LOCATION='northeurope'
    VM_SIZE='<the size of the vm in AKS>' # The size needs to be available in your location
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_NAME \
        --location $LOCATION \
        --node-vm-size $VM_SIZE \
        --network-plugin azure \
        --enable-oidc-issuer \
        --enable-workload-identity \
        --generate-ssh-key
    
  3. 安装 Helm

    Helm 是用于安装 ALB 控制器的开放源代码打包工具。

    注意

    Helm 已在 Azure Cloud Shell 中提供。 如果使用 Azure Cloud Shell,则无需安装其他 Helm。

    还可以使用以下步骤在运行 Windows 或 Linux 的本地设备上安装 Helm。 确保已安装最新版本的 Helm。

    有关各种安装选项,请参阅安全说明。 同样,如果你的 Windows 版本已安装 Windows 包管理器 winget,则可以执行以下命令:

    winget install helm.helm
    

安装 ALB 控制器

  1. 为 ALB 控制器创建用户托管标识,并将该标识联合为工作负载标识以在 AKS 群集中使用。

    RESOURCE_GROUP='<your resource group name>'
    AKS_NAME='<your aks cluster name>'
    IDENTITY_RESOURCE_NAME='azure-alb-identity'
    
    mcResourceGroup=$(az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --query "nodeResourceGroup" -o tsv)
    mcResourceGroupId=$(az group show --name $mcResourceGroup --query id -otsv)
    
    echo "Creating identity $IDENTITY_RESOURCE_NAME in resource group $RESOURCE_GROUP"
    az identity create --resource-group $RESOURCE_GROUP --name $IDENTITY_RESOURCE_NAME
    principalId="$(az identity show -g $RESOURCE_GROUP -n $IDENTITY_RESOURCE_NAME --query principalId -otsv)"
    
    echo "Waiting 60 seconds to allow for replication of the identity..."
    sleep 60
    
    echo "Apply Reader role to the AKS managed cluster resource group for the newly provisioned identity"
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --scope $mcResourceGroupId --role "acdd72a7-3385-48ef-bd42-f606fba81ae7" # Reader role
    
    echo "Set up federation with AKS OIDC issuer"
    AKS_OIDC_ISSUER="$(az aks show -n "$AKS_NAME" -g "$RESOURCE_GROUP" --query "oidcIssuerProfile.issuerUrl" -o tsv)"
    az identity federated-credential create --name "azure-alb-identity" \
        --identity-name "$IDENTITY_RESOURCE_NAME" \
        --resource-group $RESOURCE_GROUP \
        --issuer "$AKS_OIDC_ISSUER" \
        --subject "system:serviceaccount:azure-alb-system:alb-controller-sa"
    

    ALB 控制器需要名为 azure-alb-identity 的联合凭据。 不支持任何其他联合凭据名称。

    注意

    创建后立即分配托管标识可能会导致 principalId 不存在的错误。 在委派标识之前,请等待大约一分钟的时间,以便在 Microsoft Entra ID 中复制标识。

  2. 使用 Helm 安装 ALB 控制器

    对于新建部署

    若要安装 ALB 控制器,请使用 helm install 命令。

    运行 helm install 命令时,它会将 helm 图表部署到默认命名空间。 部署 alb-controller 时,它将部署到 azure-alb-system 命名空间。 可以根据需要单独重写这两个命名空间。 若要替代 helm 图表部署到的命名空间,可以指定 --namespace(或 -n)参数。 若要替代 alb-controller 使用的 azure-alb-system 命名空间,可以在安装 (--set albController.namespace) 期间设置 albController.namespace 属性。 如果既没有定义 --namespace 参数也没有定义 --set albController.namespace 参数,则会将默认命名空间用于 helm 图表,并将 azure-alb-system 命名空间用于 ALB 控制器组件。 最后,如果尚未定义 helm 图表资源的命名空间,请确保随 --namespace-n 参数指定 --create-namespace 参数。

    可以通过运行以下命令安装 ALB 控制器:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
    helm install alb-controller oci://mcr.microsoft.com/application-lb/charts/alb-controller \
         --namespace <helm-resource-namespace> \
         --version 1.0.0 \
         --set albController.namespace=<alb-controller-namespace> \
         --set albController.podIdentity.clientID=$(az identity show -g $RESOURCE_GROUP -n azure-alb-identity --query clientId -o tsv)
    

    对于现有部署

    可以通过运行以下命令来升级 ALB:

    注意

    在升级期间,如果之前的安装中的命名空间被覆盖,请确保指定 --namespace--set albController.namespace 参数。 若要确定以前使用的命名空间,可以针对 helm 命名空间运行 helm list 命令并针对 ALB 控制器运行 kubectl get pod -A -l app=alb-controller 命令。

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
    helm upgrade alb-controller oci://mcr.microsoft.com/application-lb/charts/alb-controller \
        --namespace <helm-resource-namespace> \
        --version 1.0.0 \
        --set albController.namespace=<alb-controller-namespace> \
        --set albController.podIdentity.clientID=$(az identity show -g $RESOURCE_GROUP -n azure-alb-identity --query clientId -o tsv)
    

验证 ALB 控制器安装

  1. 验证 ALB 控制器 Pod 是否已就绪:

    kubectl get pods -n azure-alb-system
    

    应该看到以下内容:

    名称 就绪 状态 RESTARTS 年龄
    alb-controller-bootstrap-6648c5d5c-hrmpc 1/1 正在运行 0 4d6h
    alb-controller-6648c5d5c-sdd9t 1/1 正在运行 0 4d6h
    alb-controller-6648c5d5c-au234 1/1 正在运行 0 4d6h
  2. 验证群集上是否已安装 GatewayClass azure-application-lb

    kubectl get gatewayclass azure-alb-external -o yaml
    

    应会看到 GatewayClass 具有读取有效 GatewayClass 的条件。 这指示已设置默认 GatewayClass,并且引用此 GatewayClass 的任何网关资源将由 ALB 控制器自动管理。

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: GatewayClass
    metadata:
      creationTimestamp: "2023-07-31T13:07:00Z"
      generation: 1
      name: azure-alb-external
      resourceVersion: "64270"
      uid: 6c1443af-63e6-4b79-952f-6c3af1f1c41e
    spec:
      controllerName: alb.networking.azure.io/alb-controller
    status:
      conditions:
        - lastTransitionTime: "2023-07-31T13:07:23Z"
        message: Valid GatewayClass
        observedGeneration: 1
        reason: Accepted
        status: "True"
        type: Accepted
    

后续步骤

现在,在群集上成功安装 ALB 控制器后,可以在 Azure 中预配适用于容器的应用程序网关资源。

下一步是将 ALB 控制器链接到适用于容器的应用程序网关。 如何创建此链接则取决于部署策略。

适用于容器的应用程序网关的管理有以下两种部署策略:

  • 自带 (BYO) 部署:在此部署策略中,适用于容器的应用程序网关资源、关联和前端资源的部署和生命周期是通过 Azure 门户、CLI、PowerShell、Terraform 等实现的,并在 Kubernetes 中的配置中引用。
  • 由 ALB 控制器管理:在此部署策略中,在 Kubernetes 中部署的 ALB 控制器负责适用于容器的应用程序网关资源及其子资源的生命周期。 在群集上定义 ApplicationLoadBalancer 自定义资源时,ALB 控制器将会创建适用于容器的应用程序网关资源。 服务生命周期基于自定义资源的生命周期。

卸载适用于容器的应用程序网关和 ALB 控制器

如果希望卸载 ALB 控制器,请完成以下步骤。

  1. 删除适用于容器的应用程序网关,可以删除包含适用于容器的应用程序网关资源的资源组:
az group delete --resource-group $RESOURCE_GROUP
  1. 要从群集中卸载 ALB 控制器及其资源,请运行以下命令:
helm uninstall alb-controller
kubectl delete ns azure-alb-system
kubectl delete gatewayclass azure-alb-external

注意

如果 alb-controller 安装使用了不同的命名空间,请确保在 helm uninstall 命令上指定 -n 参数,以定义要使用的相应命名空间。 例如: helm uninstall alb-controller -n unique-namespace