استخدام موازن التحميل الداخلي مع خدمة Azure Kubernetes ‏(AKS)

يمكنك إنشاء موازن تحميل داخلي واستخدامه لتقييد الوصول إلى تطبيقاتك في خدمة Azure Kubernetes ‏(AKS). لا يحتوي موازن التحميل الداخلي على عنوان IP عام ويجعل خدمة Kubernetes متاحة فقط للتطبيقات التي يمكنها الوصول إلى IP الخاص. يمكن أن تكون هذه التطبيقات ضمن نفس الشبكة الافتراضية أو في شبكة افتراضية أخرى من خلال التناظر الافتراضي. توضح لك هذه المقالة كيفية إنشاء موازن تحميل داخلي واستخدامه مع AKS.

هام

ابتداء من 30 سبتمبر 2025، لم تعد خدمة خدمة Azure Kubernetes ‏(AKS) تدعم Load Balancer الأساسي. لتجنب أي اضطرابات محتملة في الخدمة، نوصي باستخدام موازن التحميل القياسي للنشر الجديد وترقية أي عمليات نشر موجودة إلى موازن التحميل القياسي. لمزيد من المعلومات حول هذا التقاعد، راجع مشكلة GitHub للتقاعدوإعلان تقاعد تحديثات Azure. للبقاء على اطلاع بالإعلانات والتحديثات، تابع ملاحظات إصدار AKS.

قبل البدء

  • تفترض هذه المقالة أن لديك تجمع AKS قائمًا. إذا كنت بحاجة إلى نظام مجموعة AKS، يمكنك إنشاء مجموعة باستخدام Azure CLI أو Azure PowerShell أو مدخل Azure.
  • تحتاج إلى الإصدار 2.0.59 من Azure CLI أو أحدث. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.
  • إذا كنت ترغب في استخدام شبكة فرعية أو مجموعة موارد موجودة، تحتاج هوية نظام مجموعة AKS إلى إذن لإدارة موارد الشبكة. للحصول على معلومات، راجع تكوين شبكة Azure CNI في AKS. إذا كنت تقوم بإعداد موازن التحميل الخاص بك ليستخدم عنوان IP في شبكة فرعية مختلفة، تأكد من أن هوية عنقود AKS لديها Read أيضا وصول إلى تلك الشبكة الفرعية.

قم بإنشاء موازن تحميل داخلي

  1. إنشاء بيان خدمة باسم internal-lb.yaml مع نوع LoadBalancer الخدمة والتعليع azure-load-balancer-internal التوضيحي.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. انشر موازن التحميل الداخلي باستخدام kubectl apply الأمر . ينشئ هذا الأمر موازن تحميل Azure في مجموعة موارد العقدة المتصلة بنفس الشبكة الظاهرية مثل نظام مجموعة AKS.

    kubectl apply -f internal-lb.yaml
    
  3. عرض تفاصيل الخدمة باستخدام kubectl get service الأمر .

    kubectl get service internal-app
    

    يظهر عنوان IP لموازن التحميل الداخلي في EXTERNAL-IP العمود، كما هو موضح في إخراج المثال التالي. في هذا السياق، يشير External إلى الواجهة الخارجية لموازن التحميل. هذا لا يعني أنه يتلقى عنوان IP خارجي عام. يتم تعيين عنوان IP هذا ديناميكيا من نفس الشبكة الفرعية مثل نظام مجموعة AKS.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

تحديد عنوان IP

عند تحديد عنوان IP لموازن التحميل، يجب أن يتواجد عنوان IP المحدد في نفس الشبكة الظاهرية مثل نظام مجموعة AKS، ولكن لا يمكن تعيينه بالفعل إلى مورد آخر في الشبكة الظاهرية. على سبيل المثال، يجب عدم استخدام عنوان IP في النطاق المخصص لشبكة Kubernetes الفرعية داخل نظام مجموعة AKS. يمكن أن يؤدي استخدام عنوان IP الذي تم تعيينه بالفعل إلى مورد آخر في نفس الشبكة الظاهرية إلى حدوث مشكلات في موازن التحميل.

يمكنك استخدام az network vnet subnet list أمر Azure CLI أو Get-AzVirtualNetworkSubnetConfig PowerShell cmdlet للحصول على الشبكات الفرعية في شبكتك الظاهرية.

لمزيد من المعلومات حول الشبكات الفرعية، راجع إضافة تجمع عقدة مع شبكة فرعية فريدة.

إذا كنت تريد استخدام عنوان IP معين مع موازن التحميل، فلديك خياران: تعيين التعليقات التوضيحية للخدمة أو إضافة الخاصية LoadBalancerIP إلى بيان YAML لموازن التحميل.

هام

يتم إلغاء إضافة LoadBalancerIP الخاصية إلى قائمة الموازن للتحميل YAML بعد كوبيرنتيز في المراحل المتصاعدة. بينما يظل الاستخدام الحالي كما هو ومن المتوقع أن تعمل الخدمات الحالية دون تعديل، نوصي بشدة بتعيين التعليقات التوضيحية للخدمة بدلا من ذلك. لمزيد من المعلومات حول تعليقات الخدمة، راجع موازن تحميل Azure المدعومة التوضيحات.

  1. تعيين التعليقات التوضيحية للخدمة باستخدام service.beta.kubernetes.io/azure-load-balancer-ipv4 لعنوان IPv4 ولعنوان service.beta.kubernetes.io/azure-load-balancer-ipv6 IPv6.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. عرض تفاصيل الخدمة باستخدام kubectl get service الأمر .

    kubectl get service internal-app
    

    يجب أن يعكس عنوان IP في EXTERNAL-IP العمود عنوان IP المحدد، كما هو موضح في إخراج المثال التالي:

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

لمزيد من المعلومات حول تكوين موازن التحميل في شبكة فرعية مختلفة، راجع تحديد شبكة فرعية مختلفة.

المتطلبات

  • تحتاج إلى إصدار Kubernetes 1.22.x أو أحدث.
  • تحتاج إلى مجموعة موارد موجودة مع شبكة افتراضية وشبكة فرعية. مجموعة الموارد هذه هي المكان الذي تنشئ فيه نقطة النهاية الخاصة. إذا لم يكن لديك هذه الموارد، فشاهد إنشاء شبكة ظاهرية وشبكة فرعية.
  1. إنشاء بيان خدمة باسم internal-lb-pls.yaml مع نوع LoadBalancer الخدمة والتعليقات azure-load-balancer-internal التوضيحية و azure-pls-create . لمزيد من الخيارات، راجع مستند تصميم تكامل خدمة Azure Private Link.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. انشر موازن التحميل الداخلي باستخدام kubectl apply الأمر . ينشئ هذا الأمر موازن تحميل Azure في مجموعة موارد العقدة المتصلة بنفس الشبكة الظاهرية مثل نظام مجموعة AKS. كما أنه ينشئ كائن Private Link Service الذي يتصل بتكوين IP للواجهة الأمامية لموازن التحميل المرتبط بخدمة Kubernetes.

    kubectl apply -f internal-lb-pls.yaml
    
  3. عرض تفاصيل الخدمة باستخدام kubectl get service الأمر .

    kubectl get service internal-app
    

    يظهر عنوان IP لموازن التحميل الداخلي في EXTERNAL-IP العمود، كما هو موضح في إخراج المثال التالي. في هذا السياق، يشير External إلى الواجهة الخارجية لموازن التحميل. هذا لا يعني أنه يتلقى عنوان IP خارجي عام.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. عرض تفاصيل كائن Private Link Service باستخدام az network private-link-service list الأمر .

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    يجب أن يبدو الإخراج مشابها لإخراج المثال التالي:

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

تسمح لك نقطة النهاية الخاصة بالاتصال بشكل خاص بكائن خدمة Kubernetes عبر Private Link Service التي أنشأتها.

إنشاء نقطة النهاية الخاصة باستخدام az network private-endpoint create الأمر .

# Create a variable for the private link service

AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv)

# Create the private endpoint

$ az network private-endpoint create \
    -g myOtherResourceGroup \
    --name myAKSServicePE \
    --vnet-name myOtherVNET \
    --subnet pe-subnet \
    --private-connection-resource-id $AKS_PLS_ID \
    --connection-name connectToMyK8sService

تخصيصات PLS عبر التعليقات التوضيحية

يمكنك استخدام التعليقات التوضيحية التالية لتخصيص مورد PLS:

تعليق توضيحي قيمة ‏‏الوصف مطلوبة افتراضي
service.beta.kubernetes.io/azure-pls-create "true" قيمة منطقية تشير إلى ما إذا كان يجب إنشاء PLS. مطلوبة
service.beta.kubernetes.io/azure-pls-name <PLS name> سلسلة تحدد اسم مورد PLS المراد إنشاؤه. اختياري "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name السلسلة التي تحدد اسم مجموعة الموارد التي يتم إنشاء مورد PLS فيها اختياري MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> السلسلة التي تشير إلى الشبكة الفرعية التي يتم نشر PLS عليها. يجب أن توجد هذه الشبكة الفرعية في نفس الشبكة الافتراضية التي توجد بها مجموعة الواجهة الخلفية. يتم تخصيص عناوين IP ل PLS NAT داخل هذه الشبكة الفرعية. اختياري إذا service.beta.kubernetes.io/azure-load-balancer-internal-subnet، يتم استخدام هذه الشبكة الفرعية ILB. وإلا، يتم استخدام الشبكة الفرعية الافتراضية من ملف التكوين.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] إجمالي عدد عناوين NAT IPs الخاصة المراد تخصيصها. اختياري 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" قائمة مفصولة بمسافة من عناوين IPv4 الثابتة التي سيتم تخصيصها. (IPv6 غير مدعوم حاليا.) يجب ألا يكون إجمالي عدد عناوين IP أكبر من عدد عناوين IP المحددة في service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. إذا كان هناك عدد أقل من عناوين IP المحددة، يتم تخصيص الباقي ديناميكيا. يتم تعيين عنوان IP الأول في القائمة على أنه Primary. اختياري يتم تخصيص جميع عناوين IP ديناميكيا.
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" أو "false" منطقي يشير إلى ما إذا كان يجب تمكين بروتوكول TCP PROXY على PLS لتمرير معلومات الاتصال، بما في ذلك معرف الارتباط وعنوان IP المصدر. يجب أن تدعم خدمة الواجهة الخلفية بروتوكول PROXY وإلا سيفشل الاتصال. اختياري false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" أو "*" قائمة متباعدة بمعرفات اشتراك Azure التي تظهر خدمة الرابط الخاص لها. استخدم "*" لكشف PLS لكافة الأقسام الفرعية (الأقل تقييدا). اختياري قائمة [] فارغة تشير إلى التحكم في الوصول القائم على الأدوار فقط: هذه الخدمة الخاصة متاحة فقط للأفراد الذين لديهم صلاحيات التحكم في الوصول القائم على الأدوار داخل دليلك. (الأكثر تقييدا)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" قائمة منفصلة بمساحات لمعرفات اشتراك Azure. يسمح هذا بالموافقة تلقائيا على طلبات اتصال PE من الاشتراكات المدرجة في PLS. يعمل هذا فقط عندما تكون الرؤية مضبوطة على "*". اختياري []

استخدام الشبكات الخاصة

عند إنشاء نظام مجموعة AKS، يمكنك تحديد إعدادات الشبكة المتقدمة. تسمح لك هذه الإعدادات بنشر نظام المجموعة في شبكة Azure الظاهرية والشبكات الفرعية الموجودة. على سبيل المثال، يمكنك نشر نظام مجموعة AKS في شبكة خاصة متصلة بالبيئة المحلية وتشغيل الخدمات التي يمكن الوصول إليها داخليا فقط.

لمزيد من المعلومات، راجع تكوين الشبكات الفرعية للشبكة الظاهرية الخاصة بك باستخدام Kubenet أو باستخدام Azure CNI.

لا تحتاج إلى إجراء أي تغييرات على الخطوات السابقة لنشر موازن تحميل داخلي يستخدم شبكة خاصة في نظام مجموعة AKS. يتم إنشاء موازن التحميل في نفس مجموعة الموارد مثل نظام مجموعة AKS، ولكنه متصل بدلا من ذلك بشبكتك الظاهرية الخاصة والشبكة الفرعية، كما هو موضح في المثال التالي:

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

إشعار

يجب أن يكون لهوية نظام المجموعة المستخدمة من قبل مجموعة AKS على الأقل دور مساهم الشبكة على مورد الشبكة الظاهرية. يمكنك عرض هوية نظام المجموعة باستخدام az aks show الأمر ، مثل az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". يمكنك تعيين دور "مساهم الشبكة" باستخدام az role assignment create الأمر ، مثل az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

إذا كنت تريد تعريف دور مخصص بدلا من ذلك، فأنت بحاجة إلى الأذونات التالية:

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

لمزيد من المعلومات، راجع إضافة شبكة فرعية للشبكة الظاهرية أو تغييرها أو حذفها.

تحديد شبكة فرعية مختلفة

أضف التعليق التوضيحي azure-load-balancer-internal-subnet إلى الخدمة لتحديد شبكة فرعية لموازن التحميل الخاص بك. يجب أن تكون الشبكة الفرعية المحددة في نفس الشبكة الظاهرية مثل نظام المجموعة AKS. عند النشر، يكون عنوان موازن EXTERNAL-IP التحميل جزءا من الشبكة الفرعية المحددة.

apiVersion: v1
kind: Service
metadata:
    name: internal-app
    annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
spec:
    type: LoadBalancer
    ports:
    - port: 80
    selector:
    app: internal-app

حذف موازن التحميل

يتم حذف موازن التحميل عند حذف جميع خدماته.

كما هو الحال مع أي مورد Kubernetes، يمكنك حذف خدمة مباشرة، مثل kubectl delete service internal-app، والتي تحذف أيضا موازن تحميل Azure الأساسي.

الخطوات التالية

لمعرفة المزيد حول خدمات Kubernetes، راجع وثائق خدمات Kubernetes.