تثبيت AGIC باستخدام توزيع Application Gateway موجود
وحدة تحكم دخول بوابة التطبيق (AGIC) هي حاوية داخل نظام مجموعة Azure Kubernetes Service (AKS). تراقب AGIC موارد دخول Kubernetes. يقوم بإنشاء وتطبيق تكوين بوابة تطبيق Azure استنادا إلى حالة نظام مجموعة Kubernetes.
تلميح
ضع في اعتبارك بوابة التطبيق للحاويات لحل دخول Kubernetes الخاص بك. لمزيد من المعلومات، راجع التشغيل السريع: نشر بوابة التطبيق لوحدة تحكم ALB للحاويات.
المتطلبات الأساسية
تفترض هذه المقالة أنك قمت بالفعل بتثبيت الأدوات والبنية الأساسية التالية:
- نظام مجموعة AKS مع واجهة شبكة حاويات Azure (CNI).
- Application Gateway v2 في نفس الشبكة الظاهرية مثل نظام مجموعة AKS.
- هوية حمل عمل Microsoft Entra تكوينها لنظام مجموعة AKS.
- Azure Cloud Shell كبيئة Azure shell، والتي تحتوي
az
على (Azure CLI)kubectl
و و مثبتةhelm
. هذه الأدوات مطلوبة للأوامر التي تدعم تكوين هذا النشر.
إضـافة مستودع Helm
Helm هو مدير حزمة لـ Kubernetes. يمكنك استخدامه لتثبيت الحزمة application-gateway-kubernetes-ingress
.
إذا كنت تستخدم Cloud Shell، فلن تحتاج إلى تثبيت Helm. يأتي Cloud Shell مع Helm الإصدار 3. قم بتشغيل الأوامر التالية لإضافة مستودع AGIC Helm لمجموعة AKS التي تم تمكينها باستخدام التحكم في الوصول المستند إلى دور Kubernetes (RBAC):
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
نسخ نسخة احتياطية من نشر بوابة التطبيق
قبل تثبيت AGIC، قم بنسخ تكوين نشر Application Gateway احتياطيا:
- في مدخل Microsoft Azure، انتقل إلى نشر Application Gateway.
- في قسم Automation ، حدد Export template ثم حدد Download.
يحتوي ملف .zip الذي تم تنزيله على قوالب JSON والبرامج النصية Bash والبرامج النصية PowerShell التي يمكنك استخدامها لاستعادة بوابة التطبيق، إذا أصبحت الاستعادة ضرورية.
إعداد هوية لمصادقة Resource Manager
تتصل AGIC بخادم Kubernetes API وAzure Resource Manager. وتطلب هوية للوصول إلى واجهات برمجة التطبيقات هذه. يمكنك استخدام إما هوية حمل عمل Microsoft Entra أو كيان الخدمة.
إعداد هوية حمل عمل Microsoft Entra
هوية حمل عمل Microsoft Entra هوية تقوم بتعيينها لحمل عمل البرنامج. تمكن هذه الهوية جراب AKS الخاص بك من المصادقة مع موارد Azure الأخرى.
لهذا التكوين، تحتاج إلى تخويل ل pod AGIC لتقديم طلبات HTTP إلى Azure Resource Manager.
استخدم الأمر Azure CLI az account set لتعيين اشتراك معين ليكون الاشتراك النشط الحالي:
az account set --subscription "subscriptionID"
ثم استخدم الأمر az identity create لإنشاء هوية مدارة. يجب إنشاء الهوية في مجموعة موارد العقدة. يتم تعيين اسم لمجموعة موارد العقدة بشكل افتراضي، مثل
MC_myResourceGroup_myAKSCluster_eastus
.az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
لتعيين الدور، قم بتشغيل الأمر التالي لتحديد
principalId
قيمة الهوية التي تم إنشاؤها حديثا:$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
امنح مساهم الهوية حق الوصول إلى نشر بوابة التطبيق. تحتاج إلى معرف نشر بوابة التطبيق، والذي يبدو مثل
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C
.أولا، احصل على قائمة معرفات بوابة التطبيق في اشتراكك عن طريق تشغيل الأمر التالي:
az network application-gateway list --query '[].id'
لتعيين وصول المساهم في الهوية، قم بتشغيل الأمر التالي:
$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
امنح قارئ الهوية حق الوصول إلى مجموعة موارد بوابة التطبيق. يبدو معرف مجموعة الموارد مثل
/subscriptions/A/resourceGroups/B
. يمكنك الحصول على جميع مجموعات الموارد عن طريق تشغيل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
إشعار
تأكد من أن الهوية التي تستخدمها AGIC لديها إذن Microsoft.Network/virtualNetworks/subnets/join/action المفوض إلى الشبكة الفرعية حيث يتم نشر بوابة التطبيق. إذا لم تقم بتعريف دور مخصص له هذا الإذن، يمكنك استخدام دور مساهم الشبكة المضمن.
إعداد كيان خدمة
من الممكن أيضا توفير وصول AGIC إلى Azure Resource Manager باستخدام سر Kubernetes:
إنشاء كيان خدمة Active Directory وترميزه باستخدام Base64. ترميز Base64 مطلوب ل JSON blob ليتم حفظه في Kubernetes.
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
أضف كائن JSON الثنائي كبير الحجم بترميز Base64 إلى
helm-config.yaml
الملف. يقومhelm-config.yaml
الملف بتكوين AGIC.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
نشر الوظيفة الإضافية AGIC
إنشاء بيان توزيع لوحدة تحكم الدخول
---
# 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
وحدة التحكم في الدخول:
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
تثبيت وحدة تحكم الدخول كمخطط Helm
استخدم Cloud Shell لتثبيت حزمة AGIC Helm:
إجراء تحديث Helm:
helm repo update
تنزيل
helm-config.yaml
:wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
أو انسخ ملف YAML التالي:
# 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>
قم بتحرير
helm-config.yaml
وتعبئة القيم لappgw
وarmAuth
.إشعار
<identity-client-id>
هي خاصية لقيمة هوية حمل عمل Microsoft Entra التي قمت بإعدادها في القسم السابق. يمكنك استرداد هذه المعلومات عن طريق تشغيل الأمر التالي:az identity show -g <resourcegroup> -n <identity-name>
. في هذا الأمر،<resourcegroup>
هي مجموعة الموارد التي تستضيف موارد البنية الأساسية المتعلقة بمجموعة AKS وبوابة التطبيق والهوية المدارة.تثبيت مخطط Helm مع
helm-config.yaml
التكوين من الخطوة السابقة:helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
بدلا من ذلك، يمكنك الجمع
helm-config.yaml
والأمر Helm في خطوة واحدة: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
تحقق من سجل الجراب الذي تم إنشاؤه حديثا للتحقق من أنه بدأ بشكل صحيح.
لفهم كيفية عرض خدمة AKS على الإنترنت عبر HTTP أو HTTPS باستخدام نشر Azure Application Gateway، راجع دليل الكيفية هذا.
إعداد نشر بوابة تطبيق مشتركة
بشكل افتراضي، تفترض AGIC الملكية الكاملة لنشر بوابة التطبيق المرتبطة به. يمكن للإصدار 0.8.0 من AGIC والإصدارات الأحدث مشاركة نشر Application Gateway واحد مع مكونات Azure الأخرى. على سبيل المثال، يمكنك استخدام نفس توزيع Application Gateway لتطبيق مستضاف على مجموعة مقياس الجهاز الظاهري Azure ومجموعة AKS.
سيناريو مثال
لنلق نظرة على نشر Application Gateway وهمي يدير نسبة استخدام الشبكة لموقعين على الويب:
dev.contoso.com
: مستضاف على نظام مجموعة AKS جديد باستخدام Application Gateway وAGIC.prod.contoso.com
: مستضاف على مجموعة مقياس الجهاز الظاهري.
مع الإعدادات الافتراضية، تفترض AGIC ملكية 100٪ لنشر بوابة التطبيق التي تشير إليها. تستبدل AGIC كل تكوين App Gateway. إذا قمت بإنشاء وحدة استماع يدويا ل prod.contoso.com
على Application Gateway دون تعريفها في دخول Kubernetes، فإن AGIC تحذف prod.contoso.com
التكوين في غضون ثوان.
لتثبيت AGIC وأيضا الخدمة prod.contoso.com
من الأجهزة التي تستخدم مجموعة مقياس الجهاز الظاهري، يجب عليك تقييد AGIC للتكوين dev.contoso.com
فقط. يمكنك تسهيل هذا القيد عن طريق إنشاء مثيل لتعريف المورد المخصص التالي (CRD):
cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
name: prod-contoso-com
spec:
hostname: prod.contoso.com
EOF
ينشئ الأمر السابق كائنا AzureIngressProhibitedTarget
. هذا الكائن يجعل AGIC (الإصدار 0.8.0 والإصدارات الأحدث) على علم بوجود تكوين بوابة التطبيق ل prod.contoso.com
. يوجه هذا الكائن أيضا AGIC بشكل صريح لتجنب تغيير أي تكوين متعلق باسم المضيف هذا.
تمكين نشر بوابة تطبيق مشتركة باستخدام تثبيت AGIC جديد
للحد من AGIC (الإصدار 0.8.0 والإصدارات الأحدث) إلى مجموعة فرعية من تكوين بوابة التطبيق، قم بتعديل القالب helm-config.yaml
.
في appgw:
القسم ، أضف مفتاحا shared
وقم بتعيينه إلى true
:
appgw:
subscriptionId: <subscriptionId> # existing field
resourceGroup: <resourceGroupName> # existing field
name: <applicationGatewayName> # existing field
shared: true # Add this field to enable shared Application Gateway
تطبيق تغييرات Helm:
تأكد من
AzureIngressProhibitedTarget
تثبيت CRD:kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
تحديث Helm:
helm upgrade \ --recreate-pods \ -f helm-config.yaml \ agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
ونتيجة لذلك، يحتوي نظام مجموعة AKS الخاص بك على مثيل جديد يسمى AzureIngressProhibitedTarget
prohibit-all-targets
:
kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml
prohibit-all-targets
يمنع الكائن AGIC من تغيير التكوين لأي مضيف ومسار. Helm مثبت مع appgw.shared=true
توزيع AGIC، ولكنه لا يقوم بإجراء أي تغييرات على بوابة التطبيق.
توسيع الأذونات
نظرا لأن Helm مع appgw.shared=true
و الافتراضي prohibit-all-targets
يمنع AGIC من تطبيق تكوين، يجب توسيع أذونات AGIC:
أنشئ ملف YAML جديدا باسم
AzureIngressProhibitedTarget
مع القصاصة البرمجية التالية التي تحتوي على الإعداد المحدد: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
الآن بعد أن أنشأت الحظر المخصص الخاص بك، يمكنك حذف الحظر الافتراضي، وهو واسع جدا:
kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
تمكين نشر بوابة تطبيق مشتركة لتثبيت AGIC موجود
افترض أن لديك بالفعل مجموعة AKS عاملة ونشر Application Gateway، وقمت بتكوين AGIC في نظام المجموعة الخاص بك. لديك دخول ل prod.contoso.com
و تخدم نسبة استخدام الشبكة بنجاح من نظام المجموعة.
تريد إضافة staging.contoso.com
إلى نشر Application Gateway الحالي، ولكنك تحتاج إلى استضافته على جهاز ظاهري. ستقوم بإعادة استخدام نشر Application Gateway الحالي وتكوين تجمعات وحدة استماع وخلفية يدويا ل staging.contoso.com
. ولكن تعديل تكوين بوابة التطبيق يدويا (باستخدام مدخل Microsoft Azure أو واجهات برمجة تطبيقات Resource Manager أو Terraform) قد يتعارض مع افتراضات AGIC للملكية الكاملة. بعد وقت قصير من تطبيق التغييرات، تقوم AGIC بالكتابة فوقها أو حذفها.
يمكنك منع AGIC من إجراء تغييرات على مجموعة فرعية من التكوين:
إنشاء ملف YAML جديد باسم
AzureIngressProhibitedTarget
باستخدام القصاصة البرمجية التالية: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
عرض المثيل الذي تم إنشاؤه حديثًا:
kubectl get AzureIngressProhibitedTargets
تعديل تكوين بوابة التطبيق من مدخل Microsoft Azure. على سبيل المثال، أضف وحدات الاستماع وقواعد التوجيه والخلفيات. يمنع الكائن الجديد الذي قمت بإنشائه (
manually-configured-staging-environment
) AGIC من الكتابة فوق تكوين بوابة التطبيق المتعلقة بstaging.contoso.com
.