مشاركة عبر


استخدام التحجيم التلقائي للجراب العمودي في خدمة 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 مللي كور.

  1. أنشئ ملفا باسم 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"
    
  2. hamster.yaml نشر مثال التحجيم التلقائي للجراب العمودي باستخدام kubectl apply الأمر .

    kubectl apply -f hamster.yaml
    

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

  3. عرض وحدات الجراب قيد التشغيل باستخدام kubectl get الأمر .

    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 الأمر . تأكد من استبدال <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 مع القيم المحدثة.

  5. مراقبة الحجيرات باستخدام kubectl get الأمر .

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

  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>
    

تعيين طلبات التحجيم التلقائي للجراب العمودي

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

  1. أنشئ ملفا باسم 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"]
    
  2. إنشاء الجراب باستخدام kubectl create الأمر .

    kubectl create -f azure-autodeploy.yaml
    

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

  3. عرض وحدات الجراب قيد التشغيل باستخدام 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
    
  4. أنشئ ملفا باسم 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 أن وحدة تحكم التحجيم التلقائي للجراب العمودي يمكنها حذف جراب، وضبط طلبات وحدة المعالجة المركزية والذاكرة، ثم إنشاء جراب جديد.

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

    kubectl create -f azure-vpa-auto.yaml
    
  6. انتظر بضع دقائق ثم اعرض الكبسولات قيد التشغيل باستخدام 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
    
  7. احصل على معلومات مفصلة حول أحد القرون قيد التشغيل باستخدام 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
    
  8. احصل على معلومات مفصلة حول التحجيم التلقائي للجراب العمودي وتوصياته لوحدة المعالجة 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 الإضافي.

  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
          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 الأمر .

    kubectl apply -f extra-recommender.yaml 
    

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

  3. أنشئ ملفا باسم 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 الوضع وتوصيات الحوسبة لكل من وحدة المعالجة المركزية والذاكرة.

  4. hamster-extra-recomender.yaml انشر المثال باستخدام kubectl apply الأمر .

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. راقب pods باستخدام [kubectl getالأمر ]kubectl-get .

    kubectl get --watch pods -l app=hamster
    
  6. عند بدء تشغيل جراب 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>
    
  7. عرض التوصيات المحدثة من 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
    

استكشاف أخطاء التحجيم التلقائي للجراب العمودي وإصلاحها

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

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

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

    يجب أن يسرد الإخراج ثلاثة pods: recommender و updater ووحدة تحكم القبول، وكلها بحالة Running.

  2. لكل من pods التي تم إرجاعها في الإخراج السابق، تحقق من أن مكونات النظام تسجل أي أخطاء باستخدام الأمر التالي:

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

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

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

لمعرفة المزيد حول كائن VPA، راجع مرجع Vertical Pod Autoscaler API.