共用方式為


快速入門:為容器 ALB 控制器部署應用程式閘道

ALB 控制器負責將 Kubernetes 內的閘道 API 和輸入 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 圖表資源的命名空間尚未定義,請確定 --create-namespace 參數也會與 --namespace-n 參數一起指定。

    您可以執行下列命令來安裝 ALB 控制器:

    HELM_NAMESPACE='<namespace for deployment>'
    CONTROLLER_NAMESPACE='azure-alb-system'
    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_NAMESPACE \
         --version 1.3.7 \
         --set albController.namespace=$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 命名空間和 kubectl get pod -A -l app=alb-controller ALB 控制器執行 helm list 命令。

    HELM_NAMESPACE='<your cluster name>'
    CONTROLLER_NAMESPACE='azure-alb-system'
    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_NAMESPACE \
        --version 1.3.7 \
        --set albController.namespace=$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
    

    您應該看到下列內容:

    NAME 就緒 狀態 重新啟動 年齡
    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 控制器負責容器資源及其子資源的應用程式閘道生命週期。 ALB 控制器會在叢集上定義 ApplicationLoadBalancer 自訂資源時,建立適用於容器的應用程式閘道資源。 服務生命週期是以自訂資源的生命週期為基礎。

解除安裝適用於容器的應用程式閘道和 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