AgIC'yi mevcut application gateway dağıtımlarını kullanarak yükleme

Application Gateway Giriş Denetleyicisi (AGIC), Azure Kubernetes Service (AKS) kümenizin içindeki bir poddur. AGIC, Kubernetes Giriş kaynaklarını izler. Kubernetes kümesinin durumuna göre bir Azure Uygulaması lication Gateway yapılandırması oluşturur ve uygular.

İpucu

Kubernetes giriş çözümünüz için Kapsayıcılar için Application Gateway'i göz önünde bulundurun. Daha fazla bilgi için bkz . Hızlı Başlangıç: Kapsayıcılar için Application Gateway ALB Denetleyicisi dağıtma.

Önkoşullar

Bu makalede, aşağıdaki araçları ve altyapıyı zaten yüklediğiniz varsayılır:

Helm deposunu ekleme

Helm , Kubernetes için bir paket yöneticisidir. Paketi yüklemek application-gateway-kubernetes-ingress için bunu kullanırsınız.

Cloud Shell kullanıyorsanız Helm'i yüklemeniz gerekmez. Cloud Shell, Helm sürüm 3 ile birlikte gelir. Kubernetes rol tabanlı erişim denetimi (RBAC) ile etkinleştirilmiş bir AKS kümesi için AGIC Helm deposunu eklemek için aşağıdaki komutları çalıştırın:

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

Application Gateway dağıtımını yedekleme

AGIC'yi yüklemeden önce Application Gateway dağıtımınızın yapılandırmasını yedekleyin:

  1. Azure portalında Application Gateway dağıtımınıza gidin.
  2. Otomasyon bölümünde Şablonu dışarı aktar'ı ve ardından İndir'i seçin.

İndirilen .zip dosyası, geri yükleme gerekirse Application Gateway'i geri yüklemek için kullanabileceğiniz JSON şablonları, Bash betikleri ve PowerShell betikleri içerir.

Resource Manager kimlik doğrulaması için kimlik ayarlama

AGIC, Kubernetes API sunucusu ve Azure Resource Manager ile iletişim kurar. Bu API'lere erişmek için bir kimlik gerekir. Microsoft Entra İş Yükü Kimliği veya hizmet sorumlusu kullanabilirsiniz.

Microsoft Entra İş Yükü Kimliği ayarlama

Microsoft Entra İş Yükü Kimliği, yazılım iş yüküne atadığınız bir kimliktir. Bu kimlik, AKS podunuzun diğer Azure kaynaklarıyla kimlik doğrulamasına olanak tanır.

Bu yapılandırma için Azure Resource Manager'a HTTP istekleri göndermek için AGIC podunun yetkilendirmesine ihtiyacınız vardır.

  1. Belirli bir aboneliği geçerli etkin abonelik olarak ayarlamak için Azure CLI az account set komutunu kullanın:

    az account set --subscription "subscriptionID"
    

    Ardından yönetilen kimlik oluşturmak için az identity create komutunu kullanın. Kimliği düğüm kaynak grubunda oluşturmanız gerekir. Düğüm kaynak grubuna varsayılan olarak gibi MC_myResourceGroup_myAKSCluster_eastusbir ad atanır.

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Rol ataması için aşağıdaki komutu çalıştırarak yeni oluşturulan kimliğin principalId değerini belirleyin:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Kimlik Katkıda Bulunanı'na Application Gateway dağıtımınıza erişim verin. Application Gateway dağıtımının kimliğine ihtiyacınız vardır ve bu kimlik şuna benzer /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C: .

    İlk olarak, aşağıdaki komutu çalıştırarak aboneliğinizdeki Application Gateway kimliklerinin listesini alın:

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

    Kimliğe Katkıda Bulunan erişimi atamak için aşağıdaki komutu çalıştırın:

    $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. Kimlik Okuyucusu'na Application Gateway kaynak grubuna erişim verin. Kaynak grubu kimliği gibi /subscriptions/A/resourceGroups/Bgörünür. komutunu çalıştırarak az group list --query '[].id'tüm kaynak gruplarını alabilirsiniz.

    $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
    

Not

AGIC'in kullandığı kimliğin Application Gateway'in dağıtıldığı alt ağa Microsoft.Network/virtualNetworks/subnets/join/action izninin atandığından emin olun. Bu izne sahip özel bir rol tanımlamadıysanız, yerleşik Ağ Katkıda Bulunanı rolünü kullanabilirsiniz.

Hizmet sorumlusu ayarlama

Kubernetes gizli dizisi kullanarak Azure Resource Manager'a AGIC erişimi sağlamak da mümkündür:

  1. Bir Active Directory hizmet sorumlusu oluşturun ve Base64 ile kodlayın. JSON blobunun Kubernetes'e kaydedilmesi için Base64 kodlaması gereklidir.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Base64 kodlu JSON blobunu dosyaya helm-config.yaml ekleyin. Dosya AGIC'yi helm-config.yaml yapılandırıyor.

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

AGIC eklentisini dağıtma

Giriş denetleyicisi için dağıtım bildirimi oluşturma

---
# 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

Giriş denetleyicisini dağıtma

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

Giriş denetleyicisini Helm grafiği olarak yükleme

AGIC Helm paketini yüklemek için Cloud Shell kullanın:

  1. Helm güncelleştirmesi gerçekleştirme:

    helm repo update
    
  2. İndir:helm-config.yaml

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

    Veya aşağıdaki YAML dosyasını kopyalayın:

    # 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. ve değerlerini appgw düzenleyin helm-config.yaml ve armAuthdoldurun.

    Not

    <identity-client-id>, önceki bölümde ayarladığınız Microsoft Entra İş Yükü Kimliği değerinin bir özelliğidir. Aşağıdaki komutu çalıştırarak bu bilgileri alabilirsiniz: az identity show -g <resourcegroup> -n <identity-name>. Bu komutta AKS kümesi, <resourcegroup> Application Gateway ve yönetilen kimlikle ilgili altyapı kaynaklarını barındıran kaynak grubudur.

  4. Helm grafiğini önceki adımdaki helm-config.yaml yapılandırmayla yükleyin:

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

    Alternatif olarak, ve Helm komutunu tek adımda birleştirebilirsiniz helm-config.yaml :

    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. Yeni oluşturulan podun günlüğünü denetleerek düzgün şekilde başlatıldığını doğrulayın.

Azure Uygulaması Lication Gateway dağıtımı kullanarak AKS hizmetini HTTP veya HTTPS üzerinden İnternet'te nasıl kullanıma açabileceğinizi anlamak için bu nasıl yapılır kılavuzuna bakın.

Paylaşılan Application Gateway dağıtımı ayarlama

AGIC, bağlı olduğu Application Gateway dağıtımının tam sahipliğini varsayılan olarak kabul eder. AGIC sürüm 0.8.0 ve üzeri, tek bir Application Gateway dağıtımını diğer Azure bileşenleriyle paylaşabilir. Örneğin, Azure sanal makine ölçek kümesinde ve AKS kümesinde barındırılan bir uygulama için aynı Application Gateway dağıtımını kullanabilirsiniz.

Örnek senaryo

şimdi iki web sitesi için trafiği yöneten hayali bir Application Gateway dağıtımına göz atalım:

  • dev.contoso.com: Application Gateway ve AGIC kullanarak yeni bir AKS kümesinde barındırılan.
  • prod.contoso.com: Sanal makine ölçek kümesinde barındırılan.

Varsayılan ayarlarla AGIC, Application Gateway dağıtımının işaret edilen %100 sahipliğini varsayar. AGIC tüm App Gateway yapılandırmasının üzerine yazar. Application Gateway'de Kubernetes girişinde tanımlamadan el ile dinleyici prod.contoso.com oluşturursanız AGIC, yapılandırmayı prod.contoso.com saniyeler içinde siler.

AGIC'i yüklemek ve ayrıca sanal makine ölçek kümesini kullanan makinelerden hizmet vermek prod.contoso.com için AGIC'i yalnızca yapılandırmayla dev.contoso.com sınırlamanız gerekir. Aşağıdaki özel kaynak tanımının (CRD) örneğini ekleyerek bu kısıtlamayı kolaylaştırırsınız:

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

Yukarıdaki komut bir AzureIngressProhibitedTarget nesne oluşturur. Bu nesne AGIC'yi (sürüm 0.8.0 ve üzeri) için prod.contoso.comApplication Gateway yapılandırmasının varlığından haberdar eder. Bu nesne ayrıca AGIC'e bu ana bilgisayar adıyla ilgili yapılandırmaları değiştirmekten kaçınmasını açıkça bildirmektedir.

Yeni bir AGIC yüklemesi kullanarak paylaşılan application gateway dağıtımlarını etkinleştirme

AGIC'yi (sürüm 0.8.0 ve üzeri) Application Gateway yapılandırmasının bir alt kümesiyle sınırlamak için şablonu değiştirin helm-config.yaml . appgw: bölümünde bir shared anahtar ekleyin ve olarak trueayarlayın:

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

Helm değişikliklerini uygulama:

  1. CRD'nin AzureIngressProhibitedTarget yüklü olduğundan emin olun:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Helm'i Güncelleştir:

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

Sonuç olarak AKS kümenizin adlı prohibit-all-targetsyeni bir örneği AzureIngressProhibitedTarget vardır:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

nesnesi AGIC'in prohibit-all-targets herhangi bir konak ve yol için yapılandırmayı değiştirmesini engeller. AGIC ile appgw.shared=true yüklenen Helm, Application Gateway'de herhangi bir değişiklik yapmaz.

İzinleri genişletme

ile Helm appgw.shared=true ve varsayılan prohibit-all-targets ayarı AGIC'nin yapılandırma uygulamasını engellediğinden AGIC izinlerini genişletmeniz gerekir:

  1. Özel kurulumunuzu içeren aşağıdaki kod parçacığıyla adlı AzureIngressProhibitedTarget yeni bir YAML dosyası oluşturun:

    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. Artık kendi özel yasaklamanızı oluşturduğunuza göre, çok geniş olan varsayılanı silebilirsiniz:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Mevcut AGIC yüklemesi için paylaşılan Application Gateway dağıtımlarını etkinleştirme

Çalışan bir AKS kümesine ve Application Gateway dağıtımına sahip olduğunuzu ve kümenizde AGIC'yi yapılandırdığınız varsayılır. için prod.contoso.com girişe sahipsiniz ve kümeden gelen trafiği başarıyla gösteriyorsunuz.

Mevcut Application Gateway dağıtımınıza eklemek staging.contoso.com istiyorsunuz, ancak bunu bir sanal makinede barındırmanız gerekiyor. Mevcut Application Gateway dağıtımını yeniden kullanacak ve için staging.contoso.comdinleyici ve arka uç havuzlarını el ile yapılandıracaksınız. Ancak Application Gateway yapılandırmasında el ile yapılan ayarlamalar (Azure portalı, Resource Manager API'leri veya Terraform kullanılarak) AGIC'nin tam sahiplik varsayımlarıyla çakışıyor. Değişiklikleri uyguladıktan kısa bir süre sonra AGIC bu değişikliklerin üzerine yazar veya siler.

AGIC'in yapılandırmanın bir alt kümesinde değişiklik yapmasını yasaklayabilirsiniz:

  1. Aşağıdaki kod parçacığını kullanarak adlı AzureIngressProhibitedTarget yeni bir YAML dosyası oluşturun:

    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. Yeni oluşturulan nesneyi görüntüleyin:

    kubectl get AzureIngressProhibitedTargets
    
  3. Azure portalından Application Gateway yapılandırmasını değiştirin. Örneğin, dinleyiciler, yönlendirme kuralları ve arka uçlar ekleyin. Oluşturduğunuz yeni nesne (manually-configured-staging-environment), AGIC'nin ile ilgili Application Gateway yapılandırmasının üzerine yazılmasını staging.contoso.comyasaklar.