تثبيت AGIC باستخدام توزيع Application Gateway موجود

وحدة تحكم دخول بوابة التطبيق (AGIC) هي حاوية داخل نظام مجموعة Azure Kubernetes Service (AKS). تراقب AGIC موارد دخول Kubernetes. يقوم بإنشاء وتطبيق تكوين بوابة تطبيق Azure استنادا إلى حالة نظام مجموعة Kubernetes.

تلميح

ضع في اعتبارك بوابة التطبيق للحاويات لحل دخول Kubernetes الخاص بك. لمزيد من المعلومات، راجع التشغيل السريع: نشر بوابة التطبيق لوحدة تحكم ALB للحاويات.

المتطلبات الأساسية

تفترض هذه المقالة أنك قمت بالفعل بتثبيت الأدوات والبنية الأساسية التالية:

إضـافة مستودع 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 احتياطيا:

  1. في مدخل Microsoft Azure، انتقل إلى نشر Application Gateway.
  2. في قسم 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.

  1. استخدم الأمر 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"
    
  2. لتعيين الدور، قم بتشغيل الأمر التالي لتحديد principalId قيمة الهوية التي تم إنشاؤها حديثا:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. امنح مساهم الهوية حق الوصول إلى نشر بوابة التطبيق. تحتاج إلى معرف نشر بوابة التطبيق، والذي يبدو مثل /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
    
  4. امنح قارئ الهوية حق الوصول إلى مجموعة موارد بوابة التطبيق. يبدو معرف مجموعة الموارد مثل /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:

  1. إنشاء كيان خدمة Active Directory وترميزه باستخدام Base64. ترميز Base64 مطلوب ل JSON blob ليتم حفظه في Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. أضف كائن 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:

  1. إجراء تحديث Helm:

    helm repo update
    
  2. تنزيل 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>
    
  3. قم بتحرير helm-config.yaml وتعبئة القيم ل appgw و armAuth.

    إشعار

    <identity-client-id>هي خاصية لقيمة هوية حمل عمل Microsoft Entra التي قمت بإعدادها في القسم السابق. يمكنك استرداد هذه المعلومات عن طريق تشغيل الأمر التالي: az identity show -g <resourcegroup> -n <identity-name>. في هذا الأمر، <resourcegroup> هي مجموعة الموارد التي تستضيف موارد البنية الأساسية المتعلقة بمجموعة AKS وبوابة التطبيق والهوية المدارة.

  4. تثبيت مخطط 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
    
  5. تحقق من سجل الجراب الذي تم إنشاؤه حديثا للتحقق من أنه بدأ بشكل صحيح.

لفهم كيفية عرض خدمة 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:

  1. تأكد من AzureIngressProhibitedTarget تثبيت CRD:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. تحديث 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:

  1. أنشئ ملف 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
    
  2. الآن بعد أن أنشأت الحظر المخصص الخاص بك، يمكنك حذف الحظر الافتراضي، وهو واسع جدا:

    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 من إجراء تغييرات على مجموعة فرعية من التكوين:

  1. إنشاء ملف 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
    
  2. عرض المثيل الذي تم إنشاؤه حديثًا:

    kubectl get AzureIngressProhibitedTargets
    
  3. تعديل تكوين بوابة التطبيق من مدخل Microsoft Azure. على سبيل المثال، أضف وحدات الاستماع وقواعد التوجيه والخلفيات. يمنع الكائن الجديد الذي قمت بإنشائه (manually-configured-staging-environment) AGIC من الكتابة فوق تكوين بوابة التطبيق المتعلقة ب staging.contoso.com.