分享方式:


使用現有的 應用程式閘道 部署來安裝 AGIC

應用程式閘道輸入控制器 (AGIC) 是 Azure Kubernetes Service (AKS) 叢集內的 Pod。 AGIC 會監視 Kubernetes 輸入 資源。 它會根據 Kubernetes 叢集的狀態,建立並套用 Azure 應用程式閘道 組態。

提示

請考慮針對 Kubernetes 輸入解決方案的容器 應用程式閘道。 如需詳細資訊,請參閱快速入門:部署容器 ALB 控制器 應用程式閘道。

必要條件

本文假設您已安裝下列工具和基礎結構:

新增 Helm 存放庫

Helm 是 Kubernetes 的套件管理員。 您可以使用它來安裝 application-gateway-kubernetes-ingress 套件。

如果您使用 Cloud Shell,就不需要安裝 Helm。 Cloud Shell 隨附 Helm 第 3 版。 執行下列命令,為已啟用 Kubernetes 角色型存取控制的 AKS 叢集新增 AGIC Helm 存放庫:

kubectl create serviceaccount --namespace kube-system tiller-sa
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller-sa
helm init --tiller-namespace kube-system --service-account tiller-sa

備份 應用程式閘道 部署

安裝 AGIC 之前,請先備份 應用程式閘道 部署的組態:

  1. Azure 入口網站 中,移至您的 應用程式閘道 部署。
  2. 在 [自動化] 區段中,選取 [導出範本],然後選取 [下載]。

下載的.zip檔案包含 JSON 範本、Bash 腳本和 PowerShell 腳本,您可以視需要還原 應用程式閘道。

設定 Resource Manager 驗證的身分識別

AGIC 會與 Kubernetes API 伺服器和 Azure Resource Manager 通訊。 需要身分識別才能存取這些 API。 您可以使用 Microsoft Entra 工作負載 ID 或服務主體。

設定 Microsoft Entra 工作負載識別碼

Microsoft Entra 工作負載 ID 是您指派給軟體工作負載的身分識別。 此身分識別可讓您的 AKS Pod 向其他 Azure 資源進行驗證。

針對此設定,您需要 AGIC Pod 的授權,才能對 Azure Resource Manager 提出 HTTP 要求。

  1. 使用 Azure CLI az account set 命令,將特定訂用帳戶設定為目前的使用中訂用帳戶:

    az account set --subscription "subscriptionID"
    

    然後使用 az identity create 命令來建立受控識別。 您必須在 節點資源群組中建立身分識別。 節點資源群組預設會指派名稱,例如 MC_myResourceGroup_myAKSCluster_eastus

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. 針對角色指派,執行下列命令來識別 principalId 新建立身分識別的值:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. 將身分識別參與者存取權授與您的 應用程式閘道 部署。 您需要 應用程式閘道 部署的標識符,如下所示/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C

    首先,執行下列命令來取得訂用帳戶中的應用程式閘道識別碼清單:

    az network application-gateway list --query '[].id'
    

    若要將「參與者」存取權指派給身分識別,請執行下列命令:

    $resourceGroup="resource-group-name"
    $identityName="identity-Name"
    # Get the Application Gateway ID
    $AppGatewayID=$(az network application-gateway list --query '[].id' -o tsv)
    $role="contributor"
    # Get the principal ID for the user-assigned identity
    $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv)
    az role assignment create --assignee $principalId --role $role --scope $AppGatewayID
    
  4. 將應用程式閘道資源群組的「讀者」存取權授與身份識別。 資源群組識別碼看起來像 /subscriptions/A/resourceGroups/B。 您可以執行 az group list --query '[].id'來取得所有資源群組。

    $resourceGroup="resource-group-name"
    $identityName="identity-Name"
    # Get the Application Gateway resource group
    $AppGatewayResourceGroup=$(az network application-gateway list --query '[].resourceGroup' -o tsv)
    # Get the Application Gateway resource group ID
    $AppGatewayResourceGroupID=$(az group show --name $AppGatewayResourceGroup --query id -o tsv)
    $role="Reader"
    # Get the principal ID for the user-assigned identity
    $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv)
    # Assign the Reader role to the user-assigned identity at the resource group scope
    az role assignment create --role $role --assignee $principalId  --scope $AppGatewayResourceGroupID
    

注意

請確定 AGIC 所使用的身分識別具有Microsoft.Network/virtualNetworks/subnets/join/action 許可權,其委派給部署 應用程式閘道 的子網。 如果您未定義具有此許可權的自定義角色,您可以使用內 建的網路參與者 角色。

設定服務主體

您也可以使用 Kubernetes 秘密,提供對 Azure Resource Manager 的 AGIC 存取:

  1. 建立 Active Directory 服務主體,並使用 Base64 進行編碼。 需要Base64編碼,JSON Blob才能儲存至 Kubernetes。

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. 將Base64編碼的JSON Blob新增至 helm-config.yaml 檔案。 檔案 helm-config.yaml 會設定 AGIC。

    armAuth:
        type: servicePrincipal
        secretJSON: <Base64-Encoded-Credentials>
    

部署 AGIC 附加元件

建立輸入控制器的部署指令清單

---
# file: pet-supplies-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pet-supplies-ingress
spec:
  ingressClassName: azure-application-gateway
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: store-front
            port:
              number: 80
      - path: /order-service
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 3000
      - path: /product-service
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 3002

部屬輸入控制器

$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace

將輸入控制器安裝為 Helm 圖表

利用 Cloud Shell 來安裝 AGIC Helm 套件:

  1. 執行 Helm 更新:

    helm repo update
    
  2. 下載 helm-config.yaml

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
    

    或者,複製下列 YAML 檔案:

    # This file contains the essential configs for the ingress controller helm chart
    
    # Verbosity level of the App Gateway Ingress Controller
    verbosityLevel: 3
    
    ################################################################################
    # Specify which application gateway the ingress controller must manage
    #
    appgw:
        subscriptionId: <subscriptionId>
        resourceGroup: <resourceGroupName>
        name: <applicationGatewayName>
    
        # Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD.
        # This prohibits AGIC from applying config for any host/path.
        # Use "kubectl get AzureIngressProhibitedTargets" to view and change this.
        shared: false
    
    ################################################################################
    # Specify which kubernetes namespace the ingress controller must watch
    # Default value is "default"
    # Leaving this variable out or setting it to blank or empty string would
    # result in Ingress Controller observing all accessible namespaces.
    #
    # kubernetes:
    #   watchNamespace: <namespace>
    
    ################################################################################
    # Specify the authentication with Azure Resource Manager
    #
    # Two authentication methods are available:
    # - Option 1: Azure-AD-workload-identity
    armAuth:
        type: workloadIdentity
        identityClientID:  <identityClientId>
    
    ## Alternatively you can use Service Principal credentials
    # armAuth:
    #    type: servicePrincipal
    #    secretJSON: <<Generate this value with: "az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0" >>
    
    ################################################################################
    # Specify if the cluster is Kubernetes RBAC enabled or not
    rbac:
        enabled: false # true/false
    
    # Specify aks cluster related information. THIS IS BEING DEPRECATED.
    aksClusterConfiguration:
        apiServerAddress: <aks-api-server-address>
    
  3. 編輯helm-config.yaml並填入和armAuth的值appgw

    注意

    <identity-client-id>是您在上一節中設定之 Microsoft Entra 工作負載 ID 值的屬性。 您可以執行下列命令來擷取此資訊: az identity show -g <resourcegroup> -n <identity-name>。 在該命令中,<resourcegroup>是裝載與 AKS 叢集、應用程式閘道 和受控識別相關的基礎結構資源的資源群組。

  4. 使用上一個步驟中的 helm-config.yaml 設定來安裝 Helm 圖表:

    helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
    

    或者,您可以在一個步驟中結合 helm-config.yaml Helm 命令:

    helm install oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \
         --name agic-controller \
         --version 1.7.5 \
         --namespace default \
         --debug \
         --set appgw.name=applicationgatewayABCD \
         --set appgw.resourceGroup=your-resource-group \
         --set appgw.subscriptionId=subscription-uuid \
         --set appgw.shared=false \
         --set armAuth.type=servicePrincipal \
         --set armAuth.secretJSON=$(az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0) \
         --set rbac.enabled=true \
         --set verbosityLevel=3 \
         --set kubernetes.watchNamespace=default \
         --set aksClusterConfiguration.apiServerAddress=aks-abcdefg.hcp.westus2.azmk8s.io
    
  5. 檢查新建立Pod的記錄檔,以確認其已正確啟動。

若要瞭解如何使用 Azure 應用程式閘道 部署,透過 HTTP 或 HTTPS 向因特網公開 AKS 服務,請參閱本操作指南

設定共用 應用程式閘道 部署

根據預設,AGIC 會假設其連結 應用程式閘道 部署的完整擁有權。 AGIC 0.8.0 版和更新版本可以與其他 Azure 元件共用單一 應用程式閘道 部署。 例如,您可以針對裝載在 Azure 虛擬機擴展集和 AKS 叢集上的應用程式使用相同的 應用程式閘道 部署。

範例案例

讓我們看看可管理兩個網站的流量的虛構 應用程式閘道 部署:

  • dev.contoso.com:使用 應用程式閘道 和 AGIC 裝載於新的 AKS 叢集上。
  • prod.contoso.com:裝載於虛擬機擴展集上。

使用預設設定時,AGIC 會假設其所指向 應用程式閘道 部署的 100% 擁有權。 AGIC 會覆寫所有應用程式閘道設定。 如果您在 應用程式閘道 上手動建立接聽程式prod.contoso.com,而不需在 Kubernetes 輸入中定義它,AGIC 會在幾秒內刪除設定prod.contoso.com

若要安裝 AGIC,並從使用虛擬機擴展集的機器提供服務 prod.contoso.com ,您必須限制 AGIC 只設定 dev.contoso.com 。 您可以具現化下列自定義資源定義來加速此條件約束:

cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
  name: prod-contoso-com
spec:
  hostname: prod.contoso.com
EOF

上述命令會 AzureIngressProhibitedTarget 建立物件。 此物件可讓 AGIC(0.8.0 版和更新版本)知道 是否有 的 應用程式閘道 組態prod.contoso.com。 此物件也會明確指示 AGIC 避免變更與該主機名相關的任何組態。

使用新的 AGIC 安裝啟用共用 應用程式閘道 部署

若要限制 AGIC (0.8.0 和更高版本) 僅用於應用程式閘道設定子集,請修改 helm-config.yaml 範本。 在區 appgw: 段中,新增 shared 索引鍵,並將設定為 true

appgw:
    subscriptionId: <subscriptionId>    # existing field
    resourceGroup: <resourceGroupName>  # existing field
    name: <applicationGatewayName>      # existing field
    shared: true                        # Add this field to enable shared Application Gateway

套用 Helm 變更:

  1. 確定 AzureIngressProhibitedTarget 已安裝 CRD:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. 更新 Helm :

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        agic-controller
        oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
    

因此,您的 AKS 叢集具有稱為 prohibit-all-targets 的新 AzureIngressProhibitedTarget 執行個體:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

物件prohibit-all-targets禁止 AGIC 變更任何主機和路徑的組態。 Helm 隨部署 AGIC 一起appgw.shared=true安裝,但不會對 應用程式閘道 進行任何變更。

延伸權限

由於 Helm 搭配 appgw.shared=true 和預設 prohibit-all-targets 區塊 AGIC 無法套用設定,因此您必須擴大 AGIC 許可權:

  1. 使用下列代碼段建立名為 AzureIngressProhibitedTarget 的新 YAML 檔案,其中包含您的特定設定:

    cat <<EOF | kubectl apply -f -
    apiVersion: "appgw.ingress.k8s.io/v1"
    kind: AzureIngressProhibitedTarget
    metadata:
      name: your-custom-prohibitions
    spec:
      hostname: your.own-hostname.com
    EOF
    
  2. 既然您已建立自己的自定義禁止,您可以刪除預設禁止,其範圍太廣:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

啟用現有 AGIC 安裝的共享 應用程式閘道 部署

假設您已經有運作中的 AKS 叢集和 應用程式閘道 部署,並在叢集中設定 AGIC。 您有 的輸入 prod.contoso.com ,且已成功從叢集為流量提供服務。

您想要將 新增staging.contoso.com至現有的 應用程式閘道 部署,但您必須將它裝載在虛擬機。 您將重複使用現有的 應用程式閘道 部署,並手動設定 的接聽程式和後端集區staging.contoso.com。 但手動調整 應用程式閘道 組態(使用 Azure 入口網站Resource Manager APITerraform)會與 AGIC 的完整擁有權假設相衝突。 套用變更之後不久,AGIC 就會覆寫或刪除變更。

您可以禁止 AGIC 對組態子集進行變更:

  1. 使用下列代碼段建立名為 AzureIngressProhibitedTarget 的新 YAML 檔案:

    cat <<EOF | kubectl apply -f -
    apiVersion: "appgw.ingress.k8s.io/v1"
    kind: AzureIngressProhibitedTarget
    metadata:
      name: manually-configured-staging-environment
    spec:
      hostname: staging.contoso.com
    EOF
    
  2. 檢視新建立物件:

    kubectl get AzureIngressProhibitedTargets
    
  3. 從 Azure 入口網站 修改 應用程式閘道 組態。 例如,新增接聽程式、路由規則和後端。 您建立的新物件 (manually-configured-staging-environment) 會禁止 AGIC 覆寫與 staging.contoso.com相關的 應用程式閘道 組態。