Aracılığıyla paylaş


Mevcut bir Application Gateway kullanarak Application Gateway Giriş Denetleyicisi (AGIC) yükleme

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

İpucu

Ayrıca bkz. Kapsayıcılar için Application Gateway nedir?

Anahat

Önkoşullar

Bu belgede, aşağıdaki araçların ve altyapının zaten yüklü olduğu varsayılır:

AGIC'yi yüklemeden önce Application Gateway yapılandırmanızı yedekleyin:

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

İndirdiğiniz zip dosyası, gerekli olması gerekirse App Gateway'i geri yüklemek için kullanabileceğiniz JSON şablonları, bash ve PowerShell betiklerini içerir

Helm'i yükleme

Helm , kubernetes için paketi yüklemek için kullanılan bir paket yöneticisidir application-gateway-kubernetes-ingress .

Not

Cloud Shell kullanıyorsanız Helm'i yüklemeniz gerekmez. Azure Cloud Shell Helm sürüm 3 ile birlikte gelir. İlk adımı atlayın ve AGIC Helm deposunu ekleyin.

  1. Helm'i yükleyin ve helm paketi eklemek application-gateway-kubernetes-ingress için aşağıdakileri çalıştırın:

    • Kubernetes RBAC özellikli AKS kümesi
    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. AGIC Helm deposunu ekleyin:

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

Azure Resource Manager Kimlik Doğrulaması

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 ayarlama

Microsoft Entra İş Yükü Kimliği, diğer hizmet ve kaynakların kimliğini doğrulamak ve bunlara erişmek için yazılım iş yüküne atadığınız bir kimliktir. Bu kimlik, AKS podunuzun bu kimliği kullanmasına ve diğer Azure kaynaklarıyla kimlik doğrulamasına olanak tanır. Bu yapılandırma için AGIC podunun ARM'ye HTTP isteklerinde bulunma yetkisine sahip olması gerekir.

  1. Belirli bir aboneliği geçerli etkin abonelik olarak ayarlamak için Azure CLI az account set komutunu kullanın. Ardından yönetilen kimlik oluşturmak için az identity create komutunu kullanın. Kimliğin düğüm kaynak grubunda oluşturulması gerekir. Düğüm kaynak grubuna varsayılan olarak MC_myResourceGroup_myAKSCluster_eastus gibi bir ad atanır.

    az account set --subscription "subscriptionID"
    
    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ği tanımlayın principalId :

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Kimliğe Application Gateway'inize Katkıda Bulunan erişimi verin. Application Gateway kimliğine ihtiyacınız vardır ve bu kimlik şöyle görünür: /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 şöyle görünür: /subscriptions/A/resourceGroups/B. Tüm kaynak gruplarını şu şekilde alabilirsiniz: 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
    

Not

AGIC tarafından kullanılan kimliğin Application Gateway'in dağıtıldığı alt ağa Microsoft.Network/virtualNetworks/subnets/join/action izninin atandığından emin olun. Özel bir rol bu izinle tanımlanmamışsa, Microsoft.Network/virtualNetworks/subnets/join/action iznini içeren yerleşik Ağ Katkıda Bulunanı rolünü kullanabilirsiniz.

Hizmet Sorumlusu Kullanma

Kubernetes gizli dizisini kullanarak ARM'ye 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 kodlanmış JSON blobunu dosyaya helm-config.yaml ekleyin. Hakkında helm-config.yaml daha fazla bilgi sonraki bölümdedir.

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

Azure Uygulaması Lication Gateway Giriş Denetleyicisi Eklentisini Dağıtma

Giriş Denetleyicisi 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

İlk birkaç adımda Kubernetes kümenize Helm Tiller'ı yükleyeceğiz. AGIC Helm paketini yüklemek için Cloud Shell kullanın:

  1. Helm depoyu application-gateway-kubernetes-ingress ekleme ve helm güncelleştirmesi gerçekleştirme

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. AGIC'i yapılandıran helm-config.yaml dosyasını indirin:

    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. helm-config.yaml dosyasını düzenleyin ve ve armAuthdeğerlerini appgw doldurun.

    Not

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

  4. Helm grafiğini application-gateway-kubernetes-ingress önceki adımdaki helm-config.yaml yapılandırmayla yükleme

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

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

    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. Düzgün başlatılıp başlatılmadığını doğrulamak için yeni oluşturulan podun günlüğünü denetleyin

Azure Uygulaması lication Gateway kullanarak HTTP veya HTTPS üzerinden AKS hizmetini İ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

Varsayılan olarak AGIC, bağlı olduğu Application Gateway'in tam sahipliğini varsayar. AGIC sürüm 0.8.0 ve üzeri, tek bir Application Gateway'i diğer Azure bileşenleriyle paylaşabilir. Örneğin, Sanal Makine Ölçek Kümesi ve AKS kümesinde barındırılan bir uygulama için aynı Application Gateway'i kullanabiliriz.

Bu ayarı etkinleştirmeden önce Application Gateway yapılandırmanızı yedekleyin:

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

İndirdiğiniz zip dosyası, Application Gateway'i geri yüklemek için kullanabileceğiniz JSON şablonları, bash ve PowerShell betiklerini içerir

Örnek Senaryo

Şimdi iki web sitesi için trafiği yöneten hayali bir Application Gateway'e bakalım:

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

AGIC'i yüklemek ve Sanal Makine Ölçek Kümesi makinelerimizden hizmet vermek prod.contoso.com için AGIC'i yalnızca yapılandırmayla dev.contoso.com sınırlamamız gerekir. Bu, aşağıdaki CRD örneği başlatılarak kolaylaştırılır:

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, AGIC'nin (sürüm 0.8.0 ve üzeri) Application prod.contoso.com Gateway yapılandırmasının varlığından haberdar olmasını sağlar ve bu konak adıyla ilgili yapılandırmaların değiştirilmesini önlemek için açıkça yönerge verir.

Yeni AGIC yüklemesi ile 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ünün altında anahtar ekleyin shared 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 şu şekilde yüklendiğinden 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 \
        ingress-azure application-gateway-kubernetes-ingress/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

adından da anlaşılacağı gibi nesnesi prohibit-all-targetsAGIC'nin herhangi bir konak ve yol için yapılandırmayı değiştirmesini engeller. AGIC ile appgw.shared=true helm yüklemesi yapar, ancak 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şletin:

  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. Yalnızca kendi özel yasaklamanızı oluşturduktan sonra, çok geniş olan varsayılanı silebilirsiniz:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Mevcut AGIC yüklemesi için etkinleştirme

Kümemizde zaten çalışan bir AKS kümesi, Application Gateway ve yapılandırılmış AGIC olduğunu varsayalım. Için bir Girişimiz prod.contoso.com var ve kümeden gelen trafiğe başarıyla hizmet ediyoruz. Mevcut Application Gateway'imize eklemek staging.contoso.com istiyoruz, ancak bunu bir VM'de barındırmamız gerekiyor. Mevcut Application Gateway'i yeniden kullanacağız ve için staging.contoso.comdinleyici ve arka uç havuzlarını el ile yapılandıracağız. Ancak Application Gateway yapılandırmasında el ile ince ayar (portal, ARM API'leri veya Terraform kullanarak) AGIC'nin tam sahiplik varsayımlarıyla çakışıyor. Değişiklikleri uyguladıktan kısa bir süre sonra AGIC bunların üzerine yazar veya siler.

AGIC'in bir yapılandırma alt kümesinde değişiklik yapmasını engelleyebiliriz.

  1. 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: 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. Dinleyiciler, yönlendirme kuralları, arka uçlar vb. ekleyin. Oluşturduğumuz yeni nesne (manually-configured-staging-environment), AGIC'nin ile ilgili Application Gateway yapılandırmasının üzerine yazılmasını staging.contoso.comyasaklar.