استخدام التحجيم التلقائي للجراب العمودي في خدمة Azure Kubernetes (AKS)
توضح هذه المقالة كيفية استخدام التحجيم التلقائي للجراب العمودي (VPA) على نظام مجموعة Azure Kubernetes Service (AKS). يقوم VPA تلقائيا بضبط طلبات وحدة المعالجة المركزية والذاكرة لوحدات الجراب الخاصة بك لمطابقة أنماط استخدام أحمال العمل الخاصة بك. تساعد هذه الميزة على تحسين أداء تطبيقاتك وتقليل تكلفة تشغيل أحمال العمل في AKS.
لمزيد من المعلومات، راجع نظرة عامة على التحجيم التلقائي للجراب العمودي.
قبل البدء
إذا كان لديك نظام مجموعة AKS موجود، فتأكد من أنه يعمل بالإصدار 1.24 من Kubernetes أو أعلى.
تحتاج إلى تثبيت الإصدار 2.52.0 من Azure CLI أو إصدار أحدث وتكوينه. قم بتشغيل
az --version
للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.إذا تم تمكين VPA على نظام مجموعة موجود، فتأكد من
kubectl
تثبيت وتكوينه للاتصال بنظام مجموعة AKS باستخدامaz aks get-credentials
الأمر .az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
نشر التحجيم التلقائي للجراب العمودي على نظام مجموعة جديد
إنشاء نظام مجموعة AKS جديد مع تمكين VPA باستخدام
az aks create
الأمر مع العلامة--enable-vpa
.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
تحديث نظام مجموعة موجود لاستخدام أداة التحجيم التلقائي للجراب العمودي
تحديث نظام مجموعة موجود لاستخدام VPA باستخدام
az aks update
الأمر مع العلامة--enable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
تعطيل التحجيم التلقائي للجراب العمودي على نظام مجموعة موجود
تعطيل VPA على مجموعة موجودة باستخدام
az aks update
الأمر مع العلامة--disable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
اختبار تثبيت التحجيم التلقائي للجراب العمودي
في المثال التالي، نقوم بإنشاء توزيع مع جرابين، كل منهما يقوم بتشغيل حاوية واحدة تطلب 100 مللي و تحاول استخدام أعلى قليلا من 500 مللي كور. نقوم أيضا بإنشاء تكوين VPA يشير إلى النشر. يراقب VPA سلوك pods، وبعد حوالي خمس دقائق، يحدث pods لطلب 500 مللي كور.
أنشئ ملفا باسم
hamster.yaml
وانسخه في البيان التالي لمثال التحجيم التلقائي للجراب العمودي من مستودع GitHub kubernetes/autoscaler :apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster 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 containers: - name: hamster image: registry.k8s.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"
hamster.yaml
نشر مثال التحجيم التلقائي للجراب العمودي باستخدامkubectl apply
الأمر .kubectl apply -f hamster.yaml
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
عرض وحدات الجراب قيد التشغيل باستخدام
kubectl get
الأمر .kubectl get pods -l app=hamster
يجب أن يبدو الإخراج مشابها لإخراج المثال التالي:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
عرض حجوزات وحدة المعالجة المركزية والذاكرة على أحد القرون باستخدام
kubectl describe
الأمر . تأكد من استبدال<example-pod>
بأحد معرفات الجراب التي تم إرجاعها في الإخراج من الخطوة السابقة.kubectl describe pod hamster-<example-pod>
يجب أن يبدو الإخراج مشابها لإخراج المثال التالي:
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 Mibibytes من الذاكرة المحجوزة في هذا المثال. بالنسبة لهذا التطبيق النموذجي، يحتاج الجراب إلى أقل من 100 مللي وحدة معالجة مركزية لتشغيله، لذلك لا تتوفر سعة وحدة المعالجة المركزية. تحتفظ الحجيرات أيضا بذاكرة أقل مما هو مطلوب. يقوم توزيع Vertical Pod Autoscaler vpa-recommender بتحليل الحجيرات التي تستضيف تطبيق hamster لمعرفة ما إذا كانت متطلبات وحدة المعالجة المركزية والذاكرة مناسبة. إذا كانت هناك حاجة إلى التعديلات، يقوم محدث vpa بإعادة توحيد pods مع القيم المحدثة.
مراقبة الحجيرات باستخدام
kubectl get
الأمر .kubectl get --watch pods -l app=hamster
عند بدء تشغيل جراب hamster الجديد، يمكنك عرض حجوزات وحدة المعالجة المركزية والذاكرة المحدثة
kubectl describe
باستخدام الأمر . تأكد من استبدال<example-pod>
بأحد معرفات الجراب التي تم إرجاعها في الإخراج من الخطوة السابقة.kubectl describe pod hamster-<example-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 ميجابايت، أو خمسة أضعاف القيمة الأصلية. كان هذا الجراب غير مزود بالموارد الكافية، وصحح التحجيم التلقائي للجراب العمودي التقدير بقيمة أكثر ملاءمة.
عرض التوصيات المحدثة من 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>
تعيين طلبات التحجيم التلقائي للجراب العمودي
يقوم VerticalPodAutoscaler
الكائن تلقائيا بتعيين طلبات الموارد على pods باستخدام من updateMode
Auto
. يمكنك تعيين قيمة مختلفة اعتمادا على متطلباتك واختبارك. في هذا المثال، نقوم بإنشاء بيان نشر واختباره باستخدام جرابين، كل منهما يقوم بتشغيل حاوية تطلب 100 مللي وحدة معالجة مركزية و50 ميبي بايت من الذاكرة، وتعيين updateMode
إلى Recreate
.
أنشئ ملفا باسم
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"]
إنشاء الجراب باستخدام
kubectl create
الأمر .kubectl create -f azure-autodeploy.yaml
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
عرض وحدات الجراب قيد التشغيل باستخدام
kubectl get
الأمر .kubectl get 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
أنشئ ملفا باسم
azure-vpa-auto.yaml
وانسخه في البيان التالي: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
أن وحدة تحكم التحجيم التلقائي للجراب العمودي يمكنها حذف جراب، وضبط طلبات وحدة المعالجة المركزية والذاكرة، ثم إنشاء جراب جديد.تطبيق البيان على نظام المجموعة باستخدام
kubectl apply
الأمر .kubectl create -f azure-vpa-auto.yaml
انتظر بضع دقائق ثم اعرض الكبسولات قيد التشغيل باستخدام
kubectl get
الأمر .kubectl get 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
احصل على معلومات مفصلة حول أحد القرون قيد التشغيل باستخدام
kubectl get
الأمر . تأكد من استبدال<pod-name>
باسم أحد pods الخاصة بك من الإخراج السابق.kubectl get pod <pod-name> --output yaml
يجب أن يبدو الإخراج مشابها للإخراج المثال التالي، والذي يظهر أن وحدة تحكم VPA زادت طلب الذاكرة إلى 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
احصل على معلومات مفصلة حول التحجيم التلقائي للجراب العمودي وتوصياته لوحدة المعالجة
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
لتحديد ما إذا كنت تريد حذف جراب واستبداله بجراب جديد. إذا كانت الحاوية تحتوي على طلبات أقل من الحد السفلي أو أكبر من الحد العلوي، فإن التحجيم التلقائي للجراب العمودي يحذف الجراب ويستبدله بجراب يلبي السمة الهدف.
أداة التوصية الإضافية لأداة التحجيم التلقائي للجراب العمودي
يوفر Recommender توصيات لاستخدام الموارد استنادا إلى استهلاك الموارد في الوقت الحقيقي. تقوم AKS بنشر Recommender عندما تقوم مجموعة بتمكين VPA. يمكنك نشر أداة توصية مخصصة أو موصي إضافي بنفس الصورة الافتراضية. تتمثل فائدة وجود موصى مخصص في أنه يمكنك تخصيص منطق التوصية الخاص بك. باستخدام أداة التوصية الإضافية، يمكنك تقسيم VPAs لاستخدام موصيين مختلفين.
في المثال التالي، نقوم بإنشاء Recommender إضافي، ونطبق على clust AKS موجود، ونكون كائن VPA لاستخدام Recommender الإضافي.
أنشئ ملفا باسم
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 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
extra-recomender.yaml
نشر مثال التحجيم التلقائي للجراب العمودي باستخدامkubectl apply
الأمر .kubectl apply -f extra-recommender.yaml
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
أنشئ ملفا باسم
hamster-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 باستخدام
Auto
الوضع وتوصيات الحوسبة لكل من وحدة المعالجة المركزية والذاكرة.hamster-extra-recomender.yaml
انشر المثال باستخدامkubectl apply
الأمر .kubectl apply -f hamster-extra-recommender.yaml
راقب pods باستخدام
[kubectl get
الأمر ]kubectl-get .kubectl get --watch pods -l app=hamster
عند بدء تشغيل جراب hamster الجديد، اعرض حجوزات وحدة المعالجة المركزية والذاكرة المحدثة
kubectl describe
باستخدام الأمر . تأكد من استبدال<example-pod>
بأحد معرفات الجراب الخاصة بك.kubectl describe pod hamster-<example-pod>
يجب أن يبدو الإخراج مشابها لإخراج المثال التالي:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
عرض التوصيات المحدثة من VPA باستخدام
kubectl describe
الأمر .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
استكشاف أخطاء التحجيم التلقائي للجراب العمودي وإصلاحها
إذا واجهت مشكلات في التحجيم التلقائي للجراب العمودي، يمكنك استكشاف أخطاء مكونات النظام وتعريف المورد المخصص وإصلاحها لتحديد المشكلة.
تحقق من تشغيل كافة مكونات النظام باستخدام الأمر التالي:
kubectl --namespace=kube-system get pods|grep vpa
يجب أن يسرد الإخراج ثلاثة pods: recommender و updater ووحدة تحكم القبول، وكلها بحالة
Running
.لكل من pods التي تم إرجاعها في الإخراج السابق، تحقق من أن مكونات النظام تسجل أي أخطاء باستخدام الأمر التالي:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
تحقق من إنشاء تعريف المورد المخصص باستخدام الأمر التالي:
kubectl get customresourcedefinition | grep verticalpodautoscalers
الخطوات التالية
لمعرفة المزيد حول كائن VPA، راجع مرجع Vertical Pod Autoscaler API.
Azure Kubernetes Service