Share via


Application Gateway bejövőforgalom-vezérlő (AGIC) telepítése meglévő Application Gateway használatával

Az Application Gateway bejövőforgalom-vezérlője (AGIC) egy pod az Azure Kubernetes Service (AKS) fürtben. Az AGIC figyeli a Kubernetes bejövő erőforrásait, és létrehozza és alkalmazza az Application Gateway konfigurációját a Kubernetes-fürt állapota alapján.

Körvonal

Előfeltételek

Ez a dokumentum feltételezi, hogy már telepítve vannak a következő eszközök és infrastruktúra:

  • AKS-fürt az Azure Container Networking Interface (CNI) használatával
  • Application Gateway v2 ugyanabban a virtuális hálózaton, mint az AKS-fürt
  • Microsoft Entra Számítási feladat ID konfigurálva az AKS-fürthöz
  • A Cloud Shell az Azure Shell-környezet, amely parancssori felülettel rendelkezik, kubectlés helm telepítve vanaz. Ezek az eszközök szükségesek az üzemelő példány konfigurálásához használt parancsokhoz.

Az AGIC telepítése előtt készítsen biztonsági másolatot az Application Gateway konfigurációjáról :

  1. Az Azure Portalon lépjen az Application Gateway-példányra.
  2. Az Automation szakaszban válassza az Exportálás sablon, majd a Letöltés lehetőséget.

A letöltött zip-fájl JSON-sablonokat, bash- és PowerShell-szkripteket tartalmaz, amelyeket az App Gateway visszaállításához használhat, ha az szükséges lesz

A Helm telepítése

A Helm a Kubernetes csomagkezelője, amelyet a application-gateway-kubernetes-ingress csomag telepítéséhez használnak.

Feljegyzés

A Cloud Shell használata esetén nem kell telepítenie a Helmt. Az Azure Cloud Shell a Helm 3-at használja. Hagyja ki az első lépést, és csak adja hozzá az AGIC Helm-adattárat.

  1. Telepítse a Helmt , és futtassa a következőket a Helm-csomag hozzáadásához application-gateway-kubernetes-ingress :

    • Kubernetes RBAC-kompatibilis AKS-fürt
    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
    
  2. Adja hozzá az AGIC Helm-adattárat:

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    

Azure Resource Manager-hitelesítés

Az AGIC kommunikál a Kubernetes API-kiszolgálóval és az Azure Resource Managerrel. Ehhez identitásra van szükség ezeknek az API-knak a eléréséhez.

Microsoft Entra Számítási feladat ID beállítása

Microsoft Entra Számítási feladat ID egy szoftveres számítási feladathoz hozzárendelt identitás, amely más szolgáltatások és erőforrások hitelesítéséhez és eléréséhez szükséges. Ez az identitás lehetővé teszi, hogy az AKS-pod használja ezt az identitást, és hitelesítést végezzen más Azure-erőforrásokkal. Ehhez a konfigurációhoz az AGIC-pod engedélyezésére van szükség, hogy HTTP-kéréseket küldhessenek az ARM-nek.

  1. Az Azure CLI az account set parancsával beállíthatja, hogy egy adott előfizetés legyen az aktuális aktív előfizetés. Ezután az az identity create paranccsal hozzon létre egy felügyelt identitást. Az identitást a csomópont erőforráscsoportjában kell létrehozni. A csomópont erőforráscsoportja alapértelmezés szerint egy névhez van hozzárendelve, például MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. A szerepkör-hozzárendeléshez futtassa a következő parancsot az principalId újonnan létrehozott identitás azonosításához:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Adjon hozzáférést az identitásszolgáltatónak az Application Gatewayhez. Szüksége van az Application Gateway azonosítójára, amely a következőképpen néz ki: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C. Először kérje le az Application Gateway-azonosítók listáját az előfizetésében az alábbi parancs futtatásával:

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

    Az identitás-közreműködői hozzáférés hozzárendeléséhez futtassa a következő parancsot:

    $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. Adjon hozzáférést az identitásolvasónak az Application Gateway erőforráscsoporthoz. Az erőforráscsoport azonosítója a következőképpen néz ki: /subscriptions/A/resourceGroups/B. Az összes erőforráscsoportot a következőkkel szerezheti be: 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
    

Feljegyzés

Győződjön meg arról, hogy az AGIC által használt identitás rendelkezik a Microsoft.Network/virtualNetworks/subnets/join/action engedéllyel ahhoz az alhálózathoz, ahol az Application Gateway telepítve van. Ha egy egyéni szerepkör nincs meghatározva ezzel az engedéllyel, használhatja a beépített hálózati közreműködői szerepkört, amely a Microsoft.Network/virtualNetworks/alhálózatok/csatlakozás/művelet engedélyét tartalmazza.

Szolgáltatásnév használata

A Kubernetes-titkos kóddal AGIC-hozzáférést is biztosíthat az ARM-hez.

  1. Hozzon létre egy Active Directory-szolgáltatásnevet, és kódolja a base64-et. A JSON-blob Kubernetesbe való mentéséhez a base64 kódolás szükséges.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Adja hozzá a base64 kódolású JSON-blobot a helm-config.yaml fájlhoz. További információ helm-config.yaml a következő szakaszban található.

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

Az Azure-alkalmazás Átjáró bejövőforgalom-vezérlő bővítményének üzembe helyezése

Bejövőforgalom-vezérlő üzembehelyezési jegyzékének létrehozása

---
# file: pet-supplies-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pet-supplies-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway

spec:
  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

Bejövőforgalom-vezérlő üzembe helyezése

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

Bejövőforgalom-vezérlő telepítése Helm-diagramként

Az első néhány lépésben a Helm Tillert telepítjük a Kubernetes-fürtre. Az AGIC Helm-csomag telepítése a Cloud Shell használatával:

  1. Adja hozzá a helm-adattárat application-gateway-kubernetes-ingress , és végezzen helm-frissítést

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Töltse le az AGIC-t konfiguráló helm-config.yaml fájlt:

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

    Vagy másolja a következő YAML-fájlt:

    # 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. Szerkessze a helm-config.yaml fájlt, és töltse ki az és appgwarmAutha .

    Feljegyzés

    Az <identity-client-id> előző szakaszban beállított Microsoft Entra Számítási feladat ID tulajdonsága. Ezeket az információkat a következő parancs futtatásával kérdezheti le: az identity show -g <resourcegroup> -n <identity-name>hol található az az erőforráscsoport, amely <resourcegroup> az AKS-fürthöz, az Application Gatewayhez és a felügyelt identitáshoz kapcsolódó infrastruktúra-erőforrásokat üzemelteti.

  4. Helm-diagram application-gateway-kubernetes-ingress telepítése az helm-config.yaml előző lépés konfigurációjával

    helm install -f <helm-config.yaml> application-gateway-kubernetes-ingress/ingress-azure
    

    Egy lépésben kombinálhatja a Helm és a helm-config.yaml Helm parancsot is:

    helm install ./helm/ingress-azure \
         --name ingress-azure \
         --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. Ellenőrizze az újonnan létrehozott pod naplóját annak ellenőrzéséhez, hogy megfelelően indult-e

Ebből az útmutatóból megtudhatja, hogyan tehet közzé egy AKS-szolgáltatást HTTP vagy HTTPS használatával az interneten egy Azure-alkalmazás-átjáró használatával.

Megosztott application Gateway

Alapértelmezés szerint az AGIC teljes tulajdonjogot feltételez az Application Gatewayhez, amelyhez kapcsolódik. Az AGIC 0.8.0-s és újabb verziói egyetlen Application Gatewayt oszthatnak meg más Azure-összetevőkkel. Használhatjuk például ugyanazt az Application Gatewayt egy virtuálisgép-méretezési csoportban és egy AKS-fürtön üzemeltetett alkalmazáshoz.

A beállítás engedélyezése előtt készítsen biztonsági másolatot az Application Gateway konfigurációjáról :

  1. Az Azure Portalon lépjen a példányra Application Gateway
  2. Az Automation szakaszban válassza az Exportálás sablon, majd a Letöltés lehetőséget.

A letöltött zip-fájl JSON-sablonokat, bash- és PowerShell-szkripteket tartalmaz, a segítségével visszaállíthatja az Application Gatewayt

Példaforgatókönyv

Tekintsünk meg egy képzeletbeli Application Gatewayt, amely két webhely forgalmát kezeli:

  • dev.contoso.com - új AKS-fürtön üzemeltetve az Application Gateway és az AGIC használatával
  • prod.contoso.com - Azure-beli virtuálisgép-méretezési csoportban üzemeltetve

Az alapértelmezett beállításokkal az AGIC 100%-os tulajdonjogot feltételez a hivatkozott Application Gatewayben. Az AGIC felülírja az App Gateway összes konfigurációját. Ha manuálisan hoz létre figyelőt prod.contoso.com (az Application Gatewayen) anélkül, hogy meghatározta volna a Kubernetes bejövőforgalomban, az AGIC másodperceken belül törli a prod.contoso.com konfigurációt.

Az AGIC telepítéséhez és a virtuálisgép-méretezési csoport gépeiről való kiszolgáláshoz prod.contoso.com az AGIC-t csak konfigurálásra dev.contoso.com kell korlátoznunk. Ezt a következő CRD példányosításával lehet megkönnyíteni:

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

A fenti parancs létrehoz egy objektumot AzureIngressProhibitedTarget . Így az AGIC (0.8.0-s és újabb verzió) tisztában van az Application Gateway konfigurációjának prod.contoso.com meglétével, és kifejezetten arra utasítja, hogy ne módosítsa az adott gazdagépnévhez kapcsolódó konfigurációt.

Engedélyezés új AGIC-telepítéssel

Ha az AGIC-t (0.8.0-s és újabb verzió) az Application Gateway konfigurációjának egy részhalmazára szeretné korlátozni, módosítsa a sablont helm-config.yaml . A szakasz alatt adja hozzá shared a appgw: kulcsot, és állítsa be a következőretrue: .

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

Alkalmazza a Helm-módosításokat:

  1. Győződjön meg arról, hogy a AzureIngressProhibitedTarget CRD telepítve van a következőkkel:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Helm frissítése:

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        ingress-azure application-gateway-kubernetes-ingress/ingress-azure
    

Ennek eredményeképpen az AKS-fürt egy új, AzureIngressProhibitedTarget úgynevezett :prohibit-all-targets

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

Az objektum prohibit-all-targets– ahogy a neve is mutatja – megtiltja az AGIC-nek, hogy bármilyen gazdagéphez és elérési úthoz módosítsa a konfigurációt. A Helm telepíti az appgw.shared=true AGIC-t, de nem módosítja az Application Gatewayt.

Engedélyek bővítése

Mivel a Helm és appgw.shared=true az alapértelmezett prohibit-all-targets letiltja az AGIC-t egy konfiguráció alkalmazásában, szélesítse az AGIC-engedélyeket:

  1. Hozzon létre egy új YAML-fájlt AzureIngressProhibitedTarget a megadott beállítást tartalmazó következő kódrészlettel:

    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. Csak a saját egyéni tiltás létrehozása után törölheti az alapértelmezettet, amely túl széles:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Meglévő AGIC-telepítés engedélyezése

Tegyük fel, hogy már van egy működő AKS-fürtünk, az Application Gateway és a konfigurált AGIC a fürtben. Rendelkezünk bejövő forgalommal prod.contoso.com , és sikeresen kiszolgáljuk a fürtből érkező forgalmat. Szeretnénk hozzáadni staging.contoso.com a meglévő Application Gatewayhez, de egy virtuális gépen kell üzemeltetni. Újra felhasználjuk a meglévő Application Gatewayt, és manuálisan konfigurálunk egy figyelőt és egy háttérkészletet.staging.contoso.com Az Application Gateway konfigurációjának manuális finomhangolása (portál, ARM API-k vagy Terraform használatával) azonban ütközne az AGIC teljes tulajdonjogra vonatkozó feltételezéseivel. Röviddel a módosítások alkalmazása után az AGIC felülírja vagy törli őket.

Megtilthatjuk, hogy az AGIC módosításokat hajt végre a konfiguráció egy részhalmazán.

  1. Hozzon létre egy új YAML-fájlt AzureIngressProhibitedTarget a következő kódrészlettel:

    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. Az újonnan létrehozott objektum megtekintése:

    kubectl get AzureIngressProhibitedTargets
    
  3. Az Application Gateway konfigurációjának módosítása az Azure Portalról – figyelők, útválasztási szabályok, háttérrendszerek stb. hozzáadása. A létrehozott új objektum (manually-configured-staging-environment) megtiltja az AGIC-nek, hogy felülírja a kapcsolódó Application Gateway-konfigurációt staging.contoso.com.