التحجيم التلقائي للجراب العمودي في خدمة Azure Kubernetes (AKS)

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

يوفر التحجيم التلقائي للجراب العمودي توصيات لاستخدام الموارد بمرور الوقت. لإدارة الزيادات المفاجئة في استخدام الموارد، استخدم التحجيم التلقائي للجراب الأفقي، الذي يقوم بتحجيم عدد النسخ المتماثلة للحجيرة حسب الحاجة.

المزايا

يوفر التحجيم التلقائي للجراب العمودي المزايا التالية:

  • يقوم بتحليل موارد المعالج والذاكرة وضبطها إلى الحجم الصحيح للتطبيقات الخاصة بك. VPA ليست مسؤولة فقط عن زيادة الحجم، ولكن أيضا عن تقليص الحجم استنادا إلى استخدام الموارد الخاصة بها بمرور الوقت.

  • يتم إخلاء جراب إذا كان بحاجة إلى تغيير طلبات الموارد الخاصة به إذا تم تعيين وضع التحجيم الخاص به إلى تلقائي أو إعادة إنشائه.

  • تعيين قيود وحدة المعالجة المركزية والذاكرة للحاويات الفردية عن طريق تحديد نهج مورد

  • يضمن أن العقد لديها موارد صحيحة لجدولة الجراب

  • تسجيل قابل للتكوين لأي تعديلات على موارد المعالج أو الذاكرة التي تم إجراؤها

  • تحسين استخدام موارد نظام المجموعة وتحرير وحدة المعالجة المركزية والذاكرة لوحدات الجراب الأخرى.

القيود

  • يدعم التحجيم التلقائي للجراب العمودي 1000 جراب كحد أقصى مقترن VerticalPodAutoscaler بالكائنات لكل نظام مجموعة.

  • قد يوصي VPA بموارد أكثر من المتوفرة في نظام المجموعة. ونتيجة لذلك، يمنع هذا تعيين الجراب إلى عقدة وتشغيلها، لأن العقدة لا تحتوي على موارد كافية. يمكنك التغلب على هذا القيد عن طريق تعيين LimitRange إلى الحد الأقصى للموارد المتاحة لكل مساحة اسم، ما يضمن عدم طلب pods موارد أكثر من المحددة. بالإضافة إلى ذلك، يمكنك تعيين الحد الأقصى لتوصيات الموارد المسموح بها لكل جراب في كائن VerticalPodAutoscaler . يجب أن تدرك أن VPA لا يمكنه التغلب بشكل كامل على مشكلة مورد عقدة غير كافية. تم إصلاح نطاق الحد، ولكن يتم تغيير استخدام مورد العقدة ديناميكيا.

  • لا نوصي باستخدام أداة التحجيم التلقائي للجراب العمودي مع التحجيم التلقائي للجراب الأفقي، والذي يتوسع استنادا إلى نفس مقاييس استخدام وحدة المعالجة المركزية والذاكرة.

  • يخزن VPA Recommender ما يصل إلى ثمانية أيام فقط من البيانات التاريخية.

  • لا يدعم VPA أحمال العمل المستندة إلى JVM بسبب الرؤية المحدودة لاستخدام الذاكرة الفعلية لحمل العمل.

  • لا يوصى أو مدعوما لتشغيل تنفيذ VPA الخاص بك جنبا إلى جنب مع هذا التنفيذ المدار ل VPA. وجود موصي إضافي أو مخصص مدعوم.

  • حاويات AKS Windows غير مدعومة.

قبل البدء

  • تقوم مجموعة AKS بتشغيل الإصدار 1.24 من Kubernetes والإصدارات الأحدث.

  • تم تثبيت الإصدار 2.52.0 من Azure CLI أو إصدار أحدث وتكوينه. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.

  • kubectl يجب أن يكون متصلا بالمجموعة التي تريد تثبيت VPA.

نظرة عامة على VPA

كائن واجهة برمجة التطبيقات

التحجيم التلقائي للجراب العمودي هو مورد واجهة برمجة التطبيقات في مجموعة واجهة برمجة تطبيقات التحجيم التلقائي Kubernetes. الإصدار المدعوم هو 0.11 والإصدارات الأحدث، ويمكن العثور عليه في مستودع مقياس Kubernetes التلقائي.

يتكون كائن VPA من ثلاثة مكونات:

  • Recommender - يراقب استهلاك الموارد الحالي والسابق، وبناء على ذلك، يوفر القيم الموصى بها لطلبات/حدود وحدة المعالجة المركزية والذاكرة للحاويات. يراقب Recommender محفوظات القياس وأحداث نفاد الذاكرة (OOM) ومواصفات توزيع VPA، ويقترح طلبات عادلة. من خلال توفير طلب مورد مناسب وتكوين حدود، يتم رفع الحدود وخفضها.

  • Updater - يتحقق من أي من القرون المدارة لديها مجموعة موارد صحيحة، وإذا لم يكن الأمر كذلك، فإنه يقتلها بحيث يمكن إعادة إنشائها بواسطة وحدات التحكم الخاصة بهم مع الطلبات المحدثة.

  • وحدة تحكم قبول VPA - تعين طلبات الموارد الصحيحة على وحدات الجراب الجديدة (إما تم إنشاؤها أو إعادة إنشائها بواسطة وحدة التحكم الخاصة بها بسبب نشاط المحدث).

وحدة تحكم قبول VPA

وحدة تحكم قبول VPA هو ثنائي يسجل نفسه على أنه إخطار على الويب للقبول المتغير. مع كل جراب تم إنشاؤه، فإنه يحصل على طلب من apiserver ويقيم ما إذا كان هناك تكوين VPA مطابق، أو العثور على واحد مطابق واستخدام التوصية الحالية لتعيين طلبات الموارد في pod.

تعمل وظيفة مستقلة خارج وحدة تحكم قبول VPA، تسمى overlay-vpa-cert-webhook-check. overlay-vpa-cert-webhook-check يتم استخدام لإنشاء الشهادات وتجديدها، وتسجيل وحدة تحكم قبول VPA ك MutatingWebhookConfiguration.

للحصول على قابلية وصول عالية، تدعم AKS نسختين متماثلتين لوحدة تحكم القبول.

أوضاع عملية كائن VPA

يتم إدراج مورد Pod Autoscaler عمودي لكل وحدة تحكم تريد أن يكون لها متطلبات موارد حوسبة تلقائيا. هذا هو التوزيع الأكثر شيوعا. هناك أربعة أوضاع تعمل فيها VPAs:

  • Auto - يعين VPA طلبات الموارد أثناء إنشاء الجراب ويحدث الحجيرات الموجودة باستخدام آلية التحديث المفضلة. حاليا، Auto يعادل Recreate، وهو أيضا الوضع الافتراضي. بمجرد توفر تحديث مجاني ("في الموضع") لطلبات الجراب، يمكن استخدامه كآلية التحديث المفضلة من Auto قبل الوضع. عند استخدام Recreate الوضع، يقوم VPA بإخلاء جراب إذا كان بحاجة إلى تغيير طلبات الموارد الخاصة به. قد يتسبب في إعادة تشغيل القرون كلها في وقت واحد، مما يتسبب في عدم تناسق التطبيق. يمكنك الحد من عمليات إعادة التشغيل والحفاظ على التناسق في هذه الحالة باستخدام PodDisruptionBudget.
  • Recreate - يعين VPA طلبات الموارد أثناء إنشاء الجراب بالإضافة إلى تحديث الجرابات الموجودة عن طريق إخلائها عندما تختلف الموارد المطلوبة بشكل كبير عن التوصية الجديدة (احترام موازنة تعطيل الجراب، إذا تم تعريفها). يجب استخدام هذا الوضع نادرا، فقط إذا كنت بحاجة إلى التأكد من إعادة تشغيل pods كلما تغير طلب المورد. وإلا، Auto يفضل الوضع، الذي قد يستفيد من التحديثات الخالية من إعادة التشغيل بمجرد توفرها.
  • Initial - يعين VPA طلبات الموارد فقط أثناء إنشاء الجراب ولا يتغير أبدا بعد ذلك.
  • Off - لا يغير VPA متطلبات الموارد تلقائيا للجرابات. يتم حساب التوصيات ويمكن فحصها في كائن VPA.

نمط التوزيع أثناء تطوير التطبيق

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

  1. قم بتعيين UpdateMode = "إيقاف" في مجموعة الإنتاج الخاصة بك وقم بتشغيل VPA في وضع التوصية حتى تتمكن من اختبار VPA واكتساب الإلمام به. يمكن أن يتجنب UpdateMode = "إيقاف" إدخال تكوين خاطئ يمكن أن يسبب انقطاعا.

  2. تحديد إمكانية المراقبة أولا عن طريق جمع بيانات تتبع الاستخدام الفعلي للموارد على مدى فترة زمنية معينة. يساعدك هذا على فهم سلوك وعلامات الأعراض أو المشكلات من موارد الحاوية والجراب المتأثرة بأحمال العمل التي تعمل عليها.

  3. تعرف على بيانات المراقبة لفهم خصائص الأداء. استنادا إلى هذه الرؤى، قم بتعيين الطلبات/الحدود المطلوبة وفقا لذلك ثم في التوزيع أو الترقية التالية

  4. قم بتعيين updateMode القيمة إلى Autoأو Recreateأو Initial استنادا إلى متطلباتك.

توزيع VPA أو ترقيته أو تعطيله على نظام مجموعة

في هذا القسم، يمكنك نشر أو ترقية أو تعطيل التحجيم التلقائي للجراب العمودي على نظام المجموعة.

  1. لتمكين VPA على نظام مجموعة جديد، استخدم --enable-vpa المعلمة مع الأمر az aks create .

    az aks create -n myAKSCluster -g myResourceGroup --enable-vpa
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  2. اختياريا، لتمكين VPA على نظام مجموعة موجود، استخدم --enable-vpa مع الأمر [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update].

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa 
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  3. اختياريا، لتعطيل VPA على نظام مجموعة موجود، استخدم --disable-vpa مع الأمر [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update].

    az aks update -n myAKSCluster -g myResourceGroup --disable-vpa
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  4. للتحقق من إنشاء pods Autoscaler Vertical Pod بنجاح، استخدم الأمر kubectl get .

kubectl get pods -n kube-system

يتضمن إخراج الأمر النتائج التالية الخاصة بوحدات جراب VPA. يجب أن تظهر pods حالة التشغيل .

NAME                                        READY   STATUS    RESTARTS   AGE
vpa-admission-controller-7867874bc5-vjfxk   1/1     Running   0          41m
vpa-recommender-5fd94767fb-ggjr2            1/1     Running   0          41m
vpa-updater-56f9bfc96f-jgq2g                1/1     Running   0          41m

اختبار تثبيت التحجيم التلقائي للجراب العمودي

تنشئ الخطوات التالية توزيعا مع جرابين، كل منهما يقوم بتشغيل حاوية واحدة تطلب 100 مللي ميليكور وتحاول استخدام أكثر قليلا من 500 مللي ميليكور. كما يتم إنشاء تكوين VPA، مشيرا إلى النشر. يراقب VPA سلوك الحجيرات، وبعد حوالي خمس دقائق، يتم تحديثها بطلب وحدة معالجة مركزية أعلى.

  1. أنشئ ملفا باسم hamster.yaml وانسخه في البيان التالي لمثال التحجيم التلقائي للجراب العمودي من مستودع GitHub kubernetes/autoscaler .

  2. hamster.yaml انشر مثال التحجيم التلقائي للجراب العمودي باستخدام الأمر kubectl apply وحدد اسم بيان YAML الخاص بك:

    kubectl apply -f hamster.yaml
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  3. قم بتشغيل الأمر kubectl get التالي للحصول على pods من تطبيق مثال hamster:

    kubectl get pods -l app=hamster
    

    يشبه إخراج المثال ما يلي:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. استخدم الأمر kubectl describe على أحد pods لعرض وحدة المعالجة المركزية وحجز الذاكرة. استبدل "exampleID" بأحد معرفات الجراب التي تم إرجاعها في الإخراج من الخطوة السابقة.

    kubectl describe pod hamster-exampleID
    

    إخراج المثال هو مقتطف من المعلومات حول نظام المجموعة:

     hamster:
        Container ID:  containerd://
        Image:         k8s.gcr.io/ubuntu-slim:0.1
        Image ID:      sha256:
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/sh
        Args:
          -c
          while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        State:          Running
          Started:      Wed, 28 Sep 2022 15:06:14 -0400
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     50Mi
        Environment:  <none>
    

    يحتوي الجراب على 100 مللي وحدة معالجة و50 ميبيبايت من الذاكرة المحجوزة في هذا المثال. بالنسبة لهذا التطبيق النموذجي، يحتاج الجراب إلى أقل من 100 مللي وحدة معالجة مركزية لتشغيله، لذلك لا تتوفر سعة وحدة المعالجة المركزية. تحتفظ القرون أيضا بذاكرة أقل بكثير مما هو مطلوب. يقوم توزيع Vertical Pod Autoscaler vpa-recommender بتحليل الحجيرات التي تستضيف تطبيق hamster لمعرفة ما إذا كانت متطلبات وحدة المعالجة المركزية والذاكرة مناسبة. إذا كانت هناك حاجة إلى التعديلات، يقوم محدث vpa بإعادة توحيد pods مع القيم المحدثة.

  5. انتظر حتى يقوم vpa-updater بتشغيل جراب هامستر جديد، والذي يجب أن يستغرق بضع دقائق. يمكنك مراقبة pods باستخدام الأمر kubectl get .

    kubectl get --watch pods -l app=hamster
    
  6. عند بدء تشغيل جراب هامستر جديد، وصف الجراب الذي يقوم بتشغيل الأمر وصف kubectl وعرض وحدة المعالجة المركزية المحدثة وحجوزات الذاكرة.

    kubectl describe pod hamster-<exampleID>
    

    إخراج المثال هو مقتطف من المعلومات التي تصف pod:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    في الإخراج السابق، يمكنك أن ترى أن حجز وحدة المعالجة المركزية زاد إلى 587 مللي ثانية، وهو أكثر من خمسة أضعاف القيمة الأصلية. زادت الذاكرة إلى 262144 كيلوبايت، أي حوالي 250 ميجابايت، أو خمسة أضعاف القيمة الأصلية. كان هذا الجراب غير مزود بالموارد الكافية، وصحح التحجيم التلقائي للجراب العمودي التقدير بقيمة أكثر ملاءمة.

  7. لعرض التوصيات المحدثة من VPA، قم بتشغيل الأمر kubectl describe لوصف معلومات مورد hamster-vpa.

    kubectl describe vpa/hamster-vpa
    

    إخراج المثال هو مقتطف من المعلومات حول استخدام الموارد:

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

تعيين طلبات Pod Autoscaler

يستخدم VerticalPodAutoscaler التحجيم التلقائي للجراب العمودي الكائن لتعيين طلبات الموارد تلقائيا على pods عند تعيين updateMode إلى Auto. يمكنك تعيين قيمة مختلفة اعتمادا على متطلباتك واختبارك. في هذا المثال، يتم تعيين updateMode إلى Recreate.

  1. قم بتمكين VPA لنظام المجموعة الخاص بك عن طريق تشغيل الأمر التالي. استبدل اسم myAKSCluster نظام المجموعة باسم مجموعة AKS واستبدل myResourceGroup باسم مجموعة الموارد التي تتم استضافة نظام المجموعة فيها.

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
    
  2. قم بإنشاء ملف باسم azure-autodeploy.yaml، وانسخه في البيان التالي.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: vpa-auto-deployment
      template:
        metadata:
          labels:
            app: vpa-auto-deployment
        spec:
          containers:
          - name: mycontainer
            image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    يصف هذا البيان التوزيع الذي يحتوي على جرابين. تحتوي كل حاوية على حاوية واحدة تطلب 100 مللي وحدة معالجة مركزية و50 ميجابايت من الذاكرة.

  3. إنشاء pod باستخدام الأمر kubectl create ، كما هو موضح في المثال التالي:

    kubectl create -f azure-autodeploy.yaml
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  4. قم بتشغيل الأمر kubectl get التالي للحصول على pods:

    kubectl get pods
    

    يشبه الإخراج المثال التالي الذي يوضح اسم وحالة pods:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-kchc5   1/1     Running   0          52s
    vpa-auto-deployment-54465fb978-nhtmj   1/1     Running   0          52s
    
  5. أنشئ ملفا باسم azure-vpa-auto.yaml، وانسخ في البيان التالي الذي يصف VerticalPodAutoscaler:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-auto
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       vpa-auto-deployment
      updatePolicy:
        updateMode: "Recreate"
    

    targetRef.name تحدد القيمة أن أي جراب يتم التحكم فيه بواسطة نشر يسمى vpa-auto-deployment ينتمي إلى VerticalPodAutoscaler. updateMode تعني قيمة Recreate أن وحدة تحكم التحجيم التلقائي للجراب العمودي يمكنها حذف جراب، وضبط طلبات وحدة المعالجة المركزية والذاكرة، ثم إنشاء جراب جديد.

  6. تطبيق البيان على نظام المجموعة باستخدام الأمر kubectl apply :

    kubectl create -f azure-vpa-auto.yaml
    
  7. انتظر بضع دقائق، واعرض pods قيد التشغيل مرة أخرى عن طريق تشغيل الأمر kubectl get التالي:

    kubectl get pods
    

    يشبه الإخراج المثال التالي الذي يوضح تغيير أسماء الجراب وحالة pods:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-qbhc4   1/1     Running   0          2m49s
    vpa-auto-deployment-54465fb978-vbj68   1/1     Running   0          109s
    
  8. احصل على معلومات مفصلة حول أحد pods قيد التشغيل باستخدام الأمر Kubectl get . استبدل podName باسم أحد pods التي قمت باستردادها في الخطوة السابقة.

    kubectl get pod podName --output yaml
    

    يشبه الإخراج المثال التالي، الذي يوضح أن وحدة تحكم التحجيم التلقائي للجراب العمودي قد زادت طلب الذاكرة إلى 262144k وطلب وحدة المعالجة المركزية إلى 25 مللي وحدة معالجة مركزية.

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaObservedContainers: mycontainer
        vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory
          request'
      creationTimestamp: "2022-09-29T16:44:37Z"
      generateName: vpa-auto-deployment-54465fb978-
      labels:
        app: vpa-auto-deployment
    
    spec:
      containers:
      - args:
        - -c
        - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        command:
        - /bin/sh
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        imagePullPolicy: IfNotPresent
        name: mycontainer
        resources:
          requests:
            cpu: 25m
            memory: 262144k
    
  9. للحصول على معلومات مفصلة حول التحجيم التلقائي للجراب العمودي وتوصياته لوحدة المعالجة المركزية والذاكرة، استخدم الأمر kubectl get :

    kubectl get vpa vpa-auto --output yaml
    

    يشبه الإخراج المثال التالي:

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    تظهر النتائج السمة target التي تحدد أنه لتشغيل الحاوية على النحو الأمثل، لا تحتاج إلى تغيير وحدة المعالجة المركزية أو هدف الذاكرة. قد تختلف نتائجك حيث تكون توصية وحدة المعالجة المركزية والذاكرة الهدف أعلى.

    يستخدم lowerBound التحجيم التلقائي للجراب العمودي السمتين و upperBound لتحديد ما إذا كنت تريد حذف جراب واستبداله بجراب جديد. إذا كانت الحاوية تحتوي على طلبات أقل من الحد السفلي أو أكبر من الحد العلوي، فإن التحجيم التلقائي للجراب العمودي يحذف الجراب ويستبدله بجراب يلبي السمة الهدف.

أداة التوصية الإضافية لأداة التحجيم التلقائي للجراب العمودي

في VPA، أحد المكونات الأساسية هو Recommender. ويوفر توصيات لاستخدام الموارد استنادا إلى استهلاك الموارد في الوقت الحقيقي. تنشر AKS موصيا عندما تقوم مجموعة بتمكين VPA. يمكنك نشر موصي مخصص أو موصي إضافي بنفس الصورة مثل الصورة الافتراضية. تتمثل فائدة وجود موصي مخصص في أنه يمكنك تخصيص منطق التوصية الخاص بك. باستخدام موصي إضافي، يمكنك تقسيم VPAs إلى العديد من التوصيين إذا كان هناك العديد من كائنات VPA.

المثال التالي هو موصي إضافي يمكنك تطبيقه على نظام مجموعة AKS الحالي. ثم تقوم بتكوين كائن VPA لاستخدام أداة التوصية الإضافية.

  1. أنشئ ملفا باسم extra_recommender.yaml وانسخه في البيان التالي:

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: extra-recommender 
      namespace: kube-system 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: extra-recommender 
      template: 
        metadata: 
          labels: 
            app: extra-recommender 
        spec: 
          serviceAccountName: vpa-recommender 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
          - name: recommender 
            image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 
            imagePullPolicy: Always 
            args: 
              - --recommender-name=extra-recommender 
            resources: 
              limits: 
                cpu: 200m 
                memory: 1000Mi 
              requests: 
                cpu: 50m 
                memory: 500Mi 
            ports: 
            - name: prometheus 
              containerPort: 8942 
    
  2. extra-recomender.yaml انشر مثال التحجيم التلقائي للجراب العمودي باستخدام الأمر kubectl apply وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f extra-recommender.yaml 
    

    بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.

  3. أنشئ ملفا باسم hamnster_extra_recommender.yaml وانسخه في البيان التالي:

    apiVersion: "autoscaling.k8s.io/v1" 
    kind: VerticalPodAutoscaler 
    metadata: 
      name: hamster-vpa 
    spec: 
      recommenders:  
        - name: 'extra-recommender' 
      targetRef: 
        apiVersion: "apps/v1" 
        kind: Deployment 
        name: hamster 
      updatePolicy: 
        updateMode: "Auto" 
      resourcePolicy: 
        containerPolicies: 
          - containerName: '*' 
            minAllowed: 
              cpu: 100m 
              memory: 50Mi 
            maxAllowed: 
              cpu: 1 
              memory: 500Mi 
            controlledResources: ["cpu", "memory"] 
    --- 
    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: hamster 
    spec: 
      selector: 
        matchLabels: 
          app: hamster 
      replicas: 2 
      template: 
        metadata: 
          labels: 
            app: hamster 
        spec: 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
            - name: hamster 
              image: k8s.gcr.io/ubuntu-slim:0.1 
              resources: 
                requests: 
                  cpu: 100m 
                  memory: 50Mi 
              command: ["/bin/sh"] 
              args: 
                - "-c" 
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done" 
    

    إذا memory لم يتم تحديد في controlledResources، فإن Recommender لا يستجيب لأحداث OOM. في هذه الحالة، تقوم بإعداد وحدة المعالجة المركزية فقط في controlledValues. controlledValues يسمح لك باختيار ما إذا كنت تريد تحديث طلبات موارد الحاوية حسب RequestsOnly الخيار، أو كل من طلبات الموارد والحدود باستخدام RequestsAndLimits الخيار . القيمة الافتراضية هي RequestsAndLimits. إذا كنت تستخدم RequestsAndLimits الخيار ، يتم حساب الطلبات بناء على الاستخدام الفعلي، ويتم حساب الحدود استنادا إلى طلب الحاوية الحالية ونسبة الحد.

    على سبيل المثال، إذا بدأت بجراب يطلب اثنين من وحدات المعالجة المركزية ويحد من 4 وحدات معالجة مركزية، فإن VPA يعين دائما الحد ليكون ضعف الطلبات. ينطبق نفس المبدأ على الذاكرة. عند استخدام RequestsAndLimits الوضع، يمكن أن يكون بمثابة مخطط لطلبات موارد التطبيق الأولي وحدوده.

يمكنك تبسيط كائن VPA باستخدام الوضع التلقائي وتوصيات الحوسبة لكل من وحدة المعالجة المركزية والذاكرة.

  1. hamster_extra-recomender.yaml انشر المثال باستخدام الأمر kubectl apply وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f hamster_customized_recommender.yaml
    
  2. انتظر حتى يقوم vpa-updater بتشغيل جراب هامستر جديد، والذي يجب أن يستغرق بضع دقائق. يمكنك مراقبة pods باستخدام الأمر kubectl get .

    kubectl get --watch pods -l app=hamster
    
  3. عند بدء تشغيل جراب هامستر جديد، وصف الجراب الذي يقوم بتشغيل الأمر وصف kubectl وعرض وحدة المعالجة المركزية المحدثة وحجوزات الذاكرة.

    kubectl describe pod hamster-<exampleID>
    

    إخراج المثال هو مقتطف من المعلومات التي تصف pod:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  4. لعرض التوصيات المحدثة من VPA، قم بتشغيل الأمر kubectl describe لوصف معلومات مورد hamster-vpa.

    kubectl describe vpa/hamster-vpa
    

    إخراج المثال هو مقتطف من المعلومات حول استخدام الموارد:

    State:          Running
     Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    Spec:
      recommenders:
        Name: customized-recommender
    

استكشاف الأخطاء وإصلاحها

لتشخيص المشكلات المتعلقة بتثبيت VPA، قم بتنفيذ الخطوات التالية.

  1. تحقق مما إذا كانت كافة مكونات النظام قيد التشغيل باستخدام الأمر التالي:

    kubectl --namespace=kube-system get pods|grep vpa
    

يجب أن يسرد الإخراج ثلاثة pods - التوصية والمحدث ووحدة التحكم في القبول مع الحالة التي تظهر حالة Running.

  1. تأكد من تسجيل مكونات النظام لأي أخطاء. لكل من pods التي تم إرجاعها بواسطة الأمر السابق، قم بتشغيل الأمر التالي:

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  2. تأكد من إنشاء تعريف المورد المخصص عن طريق تشغيل الأمر التالي:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

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

توضح لك هذه المقالة كيفية قياس استخدام الموارد تلقائيا، مثل وحدة المعالجة المركزية والذاكرة، لعقد نظام المجموعة لمطابقة متطلبات التطبيق.

  • يمكنك أيضًا استخدام مقياس تلقائي للقرن الأفقي لضبط عدد القرون التي تقوم بتشغيل التطبيق تلقائيًّا. للحصول على خطوات حول استخدام مقياس تلقائي للقرن الأفقي، راجع تطبيقات المقياس في AKS.

  • راجع التحجيم التلقائي للجراب العمودي [مرجع واجهة برمجة التطبيقات] لمعرفة المزيد حول تعريفات كائنات VPA ذات الصلة.