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

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

إشعار

يتوفر موازن تحميل Azure في وحدتي SKU: أساسي وقياسي. يتم استخدام SKU القياسي بشكل افتراضي عند إنشاء نظام مجموعة AKS. عند إنشاء نوع خدمة LoadBalancer ، ستحصل على نفس نوع موازن التحميل كما هو الحال عند توفير نظام المجموعة. لمزيد من المعلومات، راجع مقارنة Azure Load Balancer SKU.

قبل البدء

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

  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 لموازن التحميل إلى إهمال متابعة Kubernetes المصدر. بينما يظل الاستخدام الحالي كما هو ومن المتوقع أن تعمل الخدمات الحالية دون تعديل، نوصي بشدة بتعيين التعليقات التوضيحية للخدمة بدلا من ذلك.

  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
    
  1. عرض تفاصيل الخدمة باستخدام 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 إليها. يجب أن تكون هذه الشبكة الفرعية موجودة في نفس VNET مثل تجمع الواجهة الخلفية. يتم تخصيص عناوين 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-fqdns "fqdn1 fqdn2" قائمة مفصولة بمسافة من fqdns المقترنة ب PLS. اختياري []
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.