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
- Autentikasi Azure Resource Manager (ARM)
- Opsi 1: Siapkan ID Beban Kerja Microsoft Entra dan buat Identitas Azure di ARM
- Opsi 2: Menyiapkan Perwakilan Layanan
- Pasang Ingress Controller menggunakan Helm
- Gateway Aplikasi Bersama: Instal AGIC di lingkungan, di mana Application Gateway dibagikan antara satu kluster AKS dan/atau komponen Azure lainnya.
Prasyarat
Dokumen ini mengasumsikan Anda sudah memasang alat dan infrastruktur berikut:
- Kluster AKS dengan Azure Container Networking Interface (CNI)
- Application Gateway v2 dalam jaringan virtual yang sama dengan kluster AKS
- ID Beban Kerja Microsoft Entra yang dikonfigurasi untuk kluster AKS Anda
- Cloud Shell adalah lingkungan shell Azure, yang memiliki
az
CLI,kubectl
danhelm
terpasang. Alat-alat ini diperlukan untuk perintah yang digunakan untuk mendukung konfigurasi penyebaran ini.
Cadangkan konfigurasi Application Gateway Anda sebelum menginstal AGIC:
- Dari portal Azure, navigasikan ke instans Application Gateway Anda.
- 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.
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
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.
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"
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
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
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.
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
Tambahkan blob JSON yang dikodekan base64 ke
helm-config.yaml
file. Informasi selengkapnya mengenaihelm-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:
Tambahkan
application-gateway-kubernetes-ingress
repo helm dan jalankan pembaruan helmhelm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/ helm repo update
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>
Edit helm-config.yaml dan isi nilai untuk
appgw
danarmAuth
.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.Memasang bagan Helm
application-gateway-kubernetes-ingress
denganhelm-config.yaml
konfigurasi dari langkah sebelumnyahelm 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
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:
- Dari portal Azure, navigasikan ke instans Anda
Application Gateway
- 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 AGICprod.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:
Pastikan CRD
AzureIngressProhibitedTarget
dipasang dengan:kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
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:
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
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.
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
Tampilkan objek yang baru dibuat:
kubectl get AzureIngressProhibitedTargets
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 denganstaging.contoso.com
.