Pasang Application Gateway Ingress Controller (AGIC) menggunakan Application Gateway yang ada

Application Gateway Ingress Controller (AGIC) adalah pod dalam kluster Azure Kubernetes Service (AKS). AGIC memantau sumber daya Ingress Kubernetes, dan membuat serta menerapkan konfigurasi Application Gateway berdasarkan status kluster Kubernetes.

Kerangka

Prasyarat

Dokumen ini mengasumsikan Anda sudah memasang alat dan infrastruktur berikut:

Cadangkan konfigurasi Application Gateway Anda sebelum menginstal AGIC:

  1. Dari portal Azure, navigasikan ke instans Application Gateway Anda.
  2. Di bawah bagian Automation , pilih Ekspor templat lalu pilih Unduh.

File zip yang Anda unduh berisi templat JSON, bash, dan skrip PowerShell yang dapat Anda gunakan untuk memulihkan App Gateway jika diperlukan

Menginstal Helm

Helm adalah manajer paket untuk Kubernetes, yang digunakan untuk menginstal application-gateway-kubernetes-ingress paket.

Catatan

Jika Anda menggunakan Cloud Shell, Anda tidak perlu menginstal Helm. Azure Cloud Shell dilengkapi dengan Helm versi 3. Lewati langkah pertama dan cukup tambahkan repositori AGIC Helm.

  1. Pasang Helm dan jalankan perintah berikut untuk menambahkan application-gateway-kubernetes-ingress paket helm:

    • RBAC Kube diaktifkan kluster AKS
    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. Tambahkan repositori AGIC Helm:

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

Autentikasi Azure Resource Manager

AGIC berkomunikasi dengan server API Kubernetes dan Azure Resource Manager. Butuh identitas untuk mengakses API ini.

Menyiapkan ID Beban Kerja Microsoft Entra

ID Beban Kerja Microsoft Entra adalah identitas yang Anda tetapkan ke beban kerja perangkat lunak, untuk mengautentikasi dan mengakses layanan dan sumber daya lain. Identitas ini memungkinkan pod AKS Anda untuk menggunakan identitas ini dan mengautentikasi dengan sumber daya Azure lainnya. Untuk konfigurasi ini, kita memerlukan otorisasi untuk pod AGIC untuk membuat permintaan HTTP ke ARM.

  1. Gunakan perintah az account set Azure CLI untuk mengatur langganan tertentu menjadi langganan aktif saat ini. Kemudian gunakan perintah az identity create untuk membuat identitas terkelola. Identitas perlu dibuat dalam grup sumber daya simpul. Grup sumber daya simpul diberi nama secara default, seperti MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Untuk penetapan peran, jalankan perintah berikut untuk mengidentifikasi principalId identitas yang baru dibuat:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Berikan akses Kontributor identitas ke Application Gateway Anda. Anda memerlukan ID Application Gateway, yang terlihat seperti: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C. Pertama, dapatkan daftar ID Application Gateway di langganan Anda dengan menjalankan perintah berikut:

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

    Untuk menetapkan akses Kontributor identitas, jalankan perintah berikut:

    $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. Berikan akses Pembaca identitas ke grup sumber daya Application Gateway. ID grup sumber daya terlihat seperti: /subscriptions/A/resourceGroups/B. Anda dapat mendapatkan semua grup sumber daya dengan: 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
    

Catatan

Pastikan identitas yang digunakan oleh AGIC memiliki izin Microsoft.Network/virtualNetworks/subnets/join/action yang didelegasikan ke subnet tempat Application Gateway disebarkan. Jika peran kustom tidak ditentukan dengan izin ini, Anda dapat menggunakan peran Kontributor Jaringan bawaan, yang berisi izin Microsoft.Network/virtualNetworks/subnets/join/action.

Menggunakan Perwakilan Layanan

Anda juga dapat menyediakan akses AGIC ke ARM menggunakan rahasia Kubernetes.

  1. Buat Perwakilan Layanan Direktori Aktif dan kodekan dengan base64. Pengodean base64 diperlukan agar blob JSON disimpan ke Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Tambahkan blob JSON yang dikodekan base64 ke helm-config.yaml file. Informasi selengkapnya mengenai helm-config.yaml ada di bagian berikutnya.

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

Menyebarkan Add-on Pengontrol Ingress Azure Application Gateway

Membuat manifes penyebaran Pengontrol Ingress

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

Menyebarkan Pengontrol Ingress

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

Pasang Pengontrol Ingress sebagai Bagan Helm

Pada beberapa langkah pertama, kita memasang Helm's Tiller di kluster Kubernetes Anda. Gunakan Cloud Shell untuk memasang paket AGIC Helm:

  1. Tambahkan application-gateway-kubernetes-ingress repo helm dan jalankan pembaruan helm

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Unduh helm-config.yaml, yang mengonfigurasi AGIC:

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

    Atau salin file YAML berikut:

    # 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. Edit helm-config.yaml dan isi nilai untuk appgw dan armAuth.

    Catatan

    <identity-client-id> adalah properti ID Beban Kerja Microsoft Entra yang Anda siapkan di bagian sebelumnya. Anda dapat mengambil informasi ini dengan menjalankan perintah berikut: az identity show -g <resourcegroup> -n <identity-name>, di mana adalah grup sumber daya yang <resourcegroup> menghosting sumber daya infrastruktur yang terkait dengan kluster AKS, Application Gateway, dan identitas terkelola.

  4. Memasang bagan Helm application-gateway-kubernetes-ingress dengan helm-config.yaml konfigurasi dari langkah sebelumnya

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

    Anda juga dapat menggabungkan helm-config.yaml perintah dan Helm dalam satu langkah:

    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. Periksa log dari pod yang baru dibuat untuk verifikasi apakah pod telah dimulai dengan benar

Lihat panduan berikut untuk memahami cara menampilkan layanan AKS melalui HTTP atau HTTPS, ke internet, menggunakan Azure Application Gateway.

Gateway Aplikasi Bersama

Secara default AGIC mengasumsikan kepemilikan penuh dari Application Gateway yang ditautkan. AGIC versi 0.8.0 dan yang lebih baru dapat berbagi Application Gateway tunggal dengan komponen Azure lainnya. Misalnya, kita dapat menggunakan Application Gateway yang sama untuk aplikasi yang dihosting di Virtual Machine Scale Set dan kluster AKS.

Cadangkan konfigurasi Application Gateway Anda sebelum mengaktifkan pengaturan ini:

  1. Dari portal Azure, navigasikan ke instans Anda Application Gateway
  2. Di bawah bagian Automation , pilih Ekspor templat lalu pilih Unduh.

File zip yang Anda unduh berisi templat JSON, bash, dan skrip PowerShell yang dapat Anda gunakan untuk memulihkan Application Gateway

Contoh Skenario

Mari kita lihat Application Gateway imajiner, yang mengelola lalu lintas untuk dua situs web:

  • dev.contoso.com - dihosting pada kluster AKS baru, menggunakan Application Gateway dan AGIC
  • prod.contoso.com - dihosting pada Set Skala Komputer Virtual Azure

Dengan pengaturan default, AGIC mengasumsikan 100% kepemilikan Application Gateway yang ditujukkan. AGIC menimpa semua konfigurasi App Gateway. Jika Anda membuat listener secara manual untuk prod.contoso.com (di Application Gateway) tanpa mendefinisikannya di Kubernetes Ingress, AGIC akan menghapus prod.contoso.com konfigurasi dalam hitungan detik.

Untuk memasang AGIC dan juga melayani prod.contoso.com dari Set Skala Komputer Virtual kita, kita harus membatasi AGIC untuk mengonfigurasi dev.contoso.com saja. Hal ini difasilitasi dengan menginstansiasi CRD berikut:

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

Perintah di atas menghasilkan sebuah objek AzureIngressProhibitedTarget. Tindakan ini membuat AGIC (versi 0.8.0 dan versi lebih baru) menyadari keberadaan konfigurasi Application Gateway untuk prod.contoso.com dan secara eksplisit menginstruksikannya untuk menghindari perubahan konfigurasi apa pun yang terkait dengan nama host tersebut.

Aktifkan dengan penginstalan AGIC baru

Untuk membatasi AGIC (versi 0.8.0 dan yang lebih baru) ke subset konfigurasi Application Gateway, ubah helm-config.yaml templat. Di bawah bagian appgw: , tambahkan shared kunci dan atur ke true.

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

Terapkan perubahan Helm:

  1. Pastikan CRD AzureIngressProhibitedTarget dipasang dengan:

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

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

Akibatnya, kluster AKS Anda memiliki instans baru yang AzureIngressProhibitedTarget disebut prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

Objek prohibit-all-targets, seperti namanya, melarang AGIC mengubah konfigurasi untuk host dan jalur apa pun. Penginstalan Helm dengan appgw.shared=true menyebarkan AGIC, tetapi tidak membuat perubahan apa pun pada Application Gateway.

Perluas izin

Karena Helm dengan appgw.shared=true dan default prohibit-all-targets memblokir AGIC menerapkan konfigurasi, memperluas izin AGIC:

  1. Buat file AzureIngressProhibitedTarget YAML baru bernama dengan cuplikan berikut yang berisi penyiapan spesifik Anda:

    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. Hanya setelah Anda membuat larangan khusus Anda sendiri, Anda dapat menghapus larangan default, yang terlalu luas:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Aktifkan untuk penginstalan AGIC yang ada

Mari kita asumsikan bahwa kita sudah memiliki kluster AKS yang berfungsi, Application Gateway, dan AGIC yang dikonfigurasi di kluster kita. Kami memiliki Ingress untuk prod.contoso.com dan berhasil melayani lalu lintas untuk itu dari kluster. Kita ingin menambahkan staging.contoso.com ke Application Gateway yang ada, tapi perlu dihosting pada Komputer Virtual. Kita akan menggunakan kembali Application Gateway yang ada dan mengkonfigurasi perespons dan backend pool secara manual untuk staging.contoso.com. Tetapi mengubah konfigurasi Application Gateway secara manual (menggunakan portal, API ARM, atau Terraform) akan bertentangan dengan asumsi kepemilikan penuh AGIC. Tak lama setelah kami menerapkan perubahan, AGIC menimpa atau menghapusnya.

Kita dapat melarang AGIC untuk membuat perubahan pada subset konfigurasi.

  1. Buat file YAML baru bernama AzureIngressProhibitedTarget dengan cuplikan berikut:

    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. Tampilkan objek yang baru dibuat:

    kubectl get AzureIngressProhibitedTargets
    
  3. Ubah konfigurasi Application Gateway dari portal Azure - tambahkan pendengar, aturan perutean, backend, dll. Objek baru yang kami buat (manually-configured-staging-environment) melarang AGIC menimpa konfigurasi Application Gateway yang terkait dengan staging.contoso.com.