وفر تكاليف سحابة Kubernetes على AWS

تم إعداد ترجمة المقال عشية بدء الدورة "منصة البنية التحتية القائمة على Kubernetes".

وفر تكاليف سحابة Kubernetes على AWS

كيف يمكنك توفير التكاليف السحابية عند العمل مع Kubernetes؟ لا يوجد حل واحد صحيح، ولكن توضح هذه المقالة العديد من الأدوات التي يمكنها مساعدتك في إدارة مواردك بشكل أكثر فعالية وتقليل تكاليف الحوسبة السحابية.

لقد كتبت هذه المقالة مع وضع Kubernetes for AWS في الاعتبار، ولكنها ستنطبق (تقريبًا) بنفس الطريقة تمامًا على موفري الخدمات السحابية الآخرين. أفترض أن مجموعتك (مجموعاتك) قد تم تكوينها بالفعل للقياس التلقائي (الكتلة التلقائية). ستؤدي إزالة الموارد وتقليص عملية النشر إلى توفير المال فقط إذا كان ذلك يؤدي أيضًا إلى تقليل أسطول العقد العاملة لديك (مثيلات EC2).

ستغطي هذه المقالة:

  • تنظيف الموارد غير المستخدمة (kube-janitor)
  • تقليل القياس أثناء غير ساعات العمل (kube-downscaler)
  • باستخدام القياس التلقائي الأفقي (HPA)،
  • الحد من حجز الموارد المفرط (تقرير الموارد kube، نائب الرئيس)
  • باستخدام مثيلات Spot

تنظيف الموارد غير المستخدمة

العمل في بيئة سريعة الخطى أمر رائع. نريد مؤسسات تكنولوجية معجل. ويعني تسليم البرامج بشكل أسرع أيضًا المزيد من عمليات نشر العلاقات العامة وبيئات المعاينة والنماذج الأولية وحلول التحليلات. يتم نشر كل شيء على Kubernetes. من لديه الوقت لتنظيف عمليات نشر الاختبار يدويًا؟ من السهل نسيان حذف تجربة عمرها أسبوع. ستنتهي الفاتورة السحابية بالارتفاع بسبب شيء نسينا إغلاقه:

وفر تكاليف سحابة Kubernetes على AWS

(هينينج جاكوبس:
زيزا:
(اقتباسات) كوري كوين:
الأسطورة: حساب AWS الخاص بك يعتمد على عدد المستخدمين لديك.
الحقيقة: إن نتيجة AWS الخاصة بك تعتمد على عدد المهندسين لديك.

إيفان كورنوسوف (ردا):
حقيقة حقيقية: إن نتيجة AWS الخاصة بك هي دالة لعدد الأشياء التي نسيت تعطيلها/حذفها.)

كوبرنيتيس بواب (kube-janitor) يساعد في تنظيف مجموعتك. تكوين البواب مرن للاستخدام العالمي والمحلي:

  • يمكن للقواعد على مستوى المجموعة تحديد الحد الأقصى لمدة البقاء (TTL) لعمليات نشر العلاقات العامة/الاختبار.
  • يمكن إضافة تعليقات توضيحية للموارد الفردية باستخدام بواب/ttl، على سبيل المثال لإزالة الارتفاع/النموذج الأولي تلقائيًا بعد 7 أيام.

يتم تعريف القواعد العامة في ملف YAML. يتم تمرير مساره من خلال المعلمة --rules-file في كوبي بواب. فيما يلي مثال لقاعدة لإزالة جميع مساحات الأسماء بها -pr- بالاسم بعد يومين:

- id: cleanup-resources-from-pull-requests
  resources:
    - namespaces
  jmespath: "contains(metadata.name, '-pr-')"
  ttl: 2d

ينظم المثال التالي استخدام تسمية التطبيق في كبسولات Deployment وStatefulSet لجميع عمليات النشر/StatefulSets الجديدة في عام 2020، ولكنه يسمح في الوقت نفسه بتنفيذ الاختبارات بدون هذه التسمية لمدة أسبوع:

- id: require-application-label
  # удалить deployments и statefulsets без метки "application"
  resources:
    - deployments
    - statefulsets
  # см. http://jmespath.org/specification.html
  jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
  ttl: 7d

قم بتشغيل عرض توضيحي محدود المدة لمدة 30 دقيقة على مجموعة تقوم بتشغيل kube-janitor:

kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m

مصدر آخر لزيادة التكاليف هو الكميات المستمرة (AWS EBS). لا يؤدي حذف Kubernetes StatefulSet إلى حذف وحدات التخزين الثابتة الخاصة بها (PVC - PersistentVolumeClaim). يمكن أن تؤدي أحجام EBS غير المستخدمة بسهولة إلى تكاليف تصل إلى مئات الدولارات شهريًا. يتمتع Kubernetes Janitor بميزة تنظيف PVC غير المستخدمة. على سبيل المثال، ستزيل هذه القاعدة جميع PVCs التي لم يتم تثبيتها بواسطة وحدة نمطية والتي لم تتم الإشارة إليها بواسطة StatefulSet أو CronJob:

# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

يمكن أن يساعدك Kubernetes Janitor في الحفاظ على نظافة مجموعتك ومنع تكاليف الحوسبة السحابية من التراكم ببطء. للحصول على تعليمات النشر والتكوين، اتبع اقرأني kube-janitor.

تقليل التحجيم خلال ساعات غير العمل

عادةً ما تكون أنظمة الاختبار والتدريج مطلوبة للتشغيل فقط خلال ساعات العمل. تتطلب بعض تطبيقات الإنتاج، مثل أدوات المكتب الخلفي/الإدارة، توفرًا محدودًا فقط وقد يتم تعطيلها بين عشية وضحاها.

Kubernetes Downscaler (kube-downscaler) يسمح للمستخدمين والمشغلين بتقليص حجم النظام خلال ساعات خارج العمل. يمكن توسيع نطاق عمليات النشر وStatefulSets إلى صفر نسخ متماثلة. قد يتم تعليق CronJobs. تم تكوين Kubernetes Downscaler لمجموعة كاملة، أو مساحة اسم واحدة أو أكثر، أو موارد فردية. يمكنك ضبط إما "وقت الخمول" أو، على العكس من ذلك، "وقت العمل". على سبيل المثال، لتقليل التحجيم قدر الإمكان خلال الليالي وعطلات نهاية الأسبوع:

image: hjacobs/kube-downscaler:20.4.3
args:
  - --interval=30
  # не отключать компоненты инфраструктуры
  - --exclude-namespaces=kube-system,infra
  # не отключать kube-downscaler, а также оставить Postgres Operator, чтобы исключенными БД можно было управлять
  - --exclude-deployments=kube-downscaler,postgres-operator
  - --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
  - --include-resources=deployments,statefulsets,stacks,cronjobs
  - --deployment-time-annotation=deployment-time

فيما يلي رسم بياني لتوسيع نطاق العقد العاملة للمجموعة في عطلات نهاية الأسبوع:

وفر تكاليف سحابة Kubernetes على AWS

من المؤكد أن تقليص العقد من 13 إلى 4 عقد عاملة يُحدث فرقًا ملحوظًا في فاتورة AWS الخاصة بك.

ولكن ماذا لو كنت بحاجة إلى العمل أثناء "فترة توقف" المجموعة؟ يمكن استبعاد عمليات نشر معينة بشكل دائم من القياس عن طريق إضافة المخفض/الاستبعاد: التعليق التوضيحي الحقيقي. يمكن استبعاد عمليات النشر مؤقتًا باستخدام المخفض/الاستبعاد حتى التعليق التوضيحي بطابع زمني مطلق بالتنسيق YYYY-MM-DD HH:MM (UTC). إذا لزم الأمر، يمكن تقليص المجموعة بأكملها عن طريق نشر حجرة مع التعليق التوضيحي downscaler/force-uptime، على سبيل المثال، عن طريق إطلاق nginx فارغًا:

kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # удалить развертывание через час
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true

شاهد README kube-downscaler، إذا كنت مهتمًا بتعليمات النشر والخيارات الإضافية.

استخدم القياس التلقائي الأفقي

تتعامل العديد من التطبيقات/الخدمات مع نمط تحميل ديناميكي: في بعض الأحيان تكون وحداتها خاملة، وأحيانًا تعمل بكامل طاقتها. إن تشغيل أسطول دائم من الكبسولات للتعامل مع الحد الأقصى من الحمل الأقصى ليس أمرًا اقتصاديًا. يدعم Kubernetes القياس التلقائي الأفقي عبر المورد HorizontalPodAutoscaler (إتش بي إيه). غالبًا ما يكون استخدام وحدة المعالجة المركزية مؤشرًا جيدًا للقياس:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 100
        type: Utilization

أنشأ Zalando مكونًا لتوصيل المقاييس المخصصة للقياس بسهولة: محول قياسات كوبي (kube-metrics-adapter) هو محول مقاييس عام لـ Kubernetes يمكنه جمع وتقديم مقاييس مخصصة وخارجية للقياس التلقائي الأفقي للقرون. وهو يدعم القياس استنادًا إلى مقاييس Prometheus وقوائم انتظار SQS والإعدادات الأخرى. على سبيل المثال، لتوسيع نطاق النشر الخاص بك إلى مقياس مخصص يمثله التطبيق نفسه كـ JSON في /metrics، استخدم:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
  annotations:
    # metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
    metric-config.pods.requests-per-second.json-path/json-key: "$.http_server.rps"
    metric-config.pods.requests-per-second.json-path/path: /metrics
    metric-config.pods.requests-per-second.json-path/port: "9090"
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests-per-second
      target:
        averageValue: 1k
        type: AverageValue

يجب أن يكون تكوين القياس التلقائي الأفقي باستخدام HPA أحد الإجراءات الافتراضية لتحسين كفاءة الخدمات عديمة الحالة. لدى Spotify عرضًا تقديميًا يتضمن خبراتهم وتوصياتهم بشأن HPA: قم بتوسيع عمليات النشر الخاصة بك، وليس محفظتك.

تقليل الحجز الزائد للموارد

تحدد أحمال عمل Kubernetes احتياجات وحدة المعالجة المركزية/الذاكرة الخاصة بها من خلال "طلبات الموارد". يتم قياس موارد وحدة المعالجة المركزية بالنوى الافتراضية أو بشكل أكثر شيوعًا بـ "ملي كور"، على سبيل المثال، 500 مليون تشير إلى 50% من وحدة المعالجة المركزية الافتراضية. يتم قياس موارد الذاكرة بالبايت، ويمكن استخدام اللواحق الشائعة، مثل 500Mi، والتي تعني 500 ميغابايت. "تقفل" طلبات الموارد السعة على العقد العاملة، مما يعني أن الكبسولة التي تحتوي على طلب وحدة المعالجة المركزية (CPU) بطول 1000 متر على عقدة تحتوي على 4 وحدات معالجة مركزية افتراضية ستترك 3 وحدات معالجة مركزية افتراضية فقط متاحة للوحدات الأخرى. [1]

الركود (الاحتياطي الزائد) هو الفرق بين الموارد المطلوبة والاستخدام الفعلي. على سبيل المثال، الكبسولة التي تطلب 2 جيجا بايت من الذاكرة ولكنها تستخدم 200 ميجا بايت فقط لديها ~ 1,8 جيجا بايت من الذاكرة "الزائدة". الزائدة تكلف المال. يمكن للمرء أن يقدر تقريبًا أن 1 جيجا بايت من الذاكرة الزائدة تكلف حوالي 10 دولارات شهريًا. [2]

تقرير موارد Kubernetes (kube-resource-report) يعرض الاحتياطيات الزائدة ويمكن أن يساعدك في تحديد التوفير المحتمل:

وفر تكاليف سحابة Kubernetes على AWS

تقرير موارد Kubernetes يظهر الفائض المجمع حسب التطبيق والأمر. يتيح لك ذلك العثور على الأماكن التي يمكن فيها تقليل الطلب على الموارد. يوفر تقرير HTML الذي تم إنشاؤه لمحة سريعة عن استخدام الموارد فقط. يجب أن تنظر إلى استخدام وحدة المعالجة المركزية/الذاكرة بمرور الوقت لتحديد طلبات الموارد الكافية. فيما يلي مخطط Grafana لخدمة وحدة المعالجة المركزية "النموذجية" الثقيلة: تستخدم جميع البودات أقل بكثير من نوى وحدة المعالجة المركزية الثلاثة المطلوبة:

وفر تكاليف سحابة Kubernetes على AWS

يؤدي تقليل طلب وحدة المعالجة المركزية من 3000 متر إلى 400 متر تقريبًا إلى تحرير الموارد لأحمال العمل الأخرى ويسمح للمجموعة بأن تكون أصغر.

"متوسط ​​استخدام وحدة المعالجة المركزية لمثيلات EC2 غالبًا ما يحوم في نطاق النسبة المئوية المكون من رقم واحد،" يكتب كوري كوين. بينما بالنسبة لـ EC2 قد يكون تقدير الحجم الصحيح قرارًا سيئًايعد تغيير بعض استعلامات موارد Kubernetes في ملف YAML أمرًا سهلاً ويمكن أن يحقق وفورات هائلة.

ولكن هل نريد حقًا أن يقوم الأشخاص بتغيير القيم في ملفات YAML؟ لا، يمكن للآلات أن تفعل ذلك بشكل أفضل بكثير! كوبيرنيتيس جهاز قياس الوزن العمودي (VPA) يفعل ذلك تمامًا: يقوم بتكييف طلبات الموارد والقيود وفقًا لحجم العمل. فيما يلي مثال للرسم البياني لطلبات Prometheus CPU (الخط الأزرق الرفيع) التي تم تعديلها بواسطة VPA مع مرور الوقت:

وفر تكاليف سحابة Kubernetes على AWS

يستخدم Zalando VPA في جميع مجموعاته لمكونات البنية التحتية. يمكن للتطبيقات غير الهامة أيضًا استخدام VPA.

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

وفر تكاليف سحابة Kubernetes على AWS

كتبت صغيرة مدونة حول VPA في عام 2019، ومؤخراً في ناقش مجتمع المستخدمين النهائيين لـ CNCF مشكلة VPA.

استخدام مثيلات EC2 Spot

أخيرًا وليس آخرًا، يمكن تقليل تكاليف AWS EC2 باستخدام مثيلات Spot كعقد عاملة في Kubernetes [3]. تتوفر المثيلات الفورية بخصم يصل إلى 90% مقارنة بالأسعار عند الطلب. يعد تشغيل Kubernetes على EC2 Spot مزيجًا جيدًا: تحتاج إلى تحديد عدة أنواع مختلفة من المثيلات لتوفير أعلى، مما يعني أنه يمكنك الحصول على عقدة أكبر بنفس السعر أو بسعر أقل، ويمكن استخدام السعة المتزايدة من خلال أعباء عمل Kubernetes المضمنة في حاويات.

كيفية تشغيل Kubernetes على EC2 Spot؟ هناك العديد من الخيارات: استخدم خدمة خارجية مثل SpotInst (تسمى الآن "Spot"، لا تسألني عن السبب)، أو قم ببساطة بإضافة Spot AutoScalingGroup (ASG) إلى مجموعتك. على سبيل المثال، إليك مقتطف CloudFormation لـ Spot ASG "المُحسّن للسعة" مع أنواع مثيلات متعددة:

MySpotAutoScalingGroup:
 Properties:
   HealthCheckGracePeriod: 300
   HealthCheckType: EC2
   MixedInstancesPolicy:
     InstancesDistribution:
       OnDemandPercentageAboveBaseCapacity: 0
       SpotAllocationStrategy: capacity-optimized
     LaunchTemplate:
       LaunchTemplateSpecification:
         LaunchTemplateId: !Ref LaunchTemplate
         Version: !GetAtt LaunchTemplate.LatestVersionNumber
       Overrides:
         - InstanceType: "m4.2xlarge"
         - InstanceType: "m4.4xlarge"
         - InstanceType: "m5.2xlarge"
         - InstanceType: "m5.4xlarge"
         - InstanceType: "r4.2xlarge"
         - InstanceType: "r4.4xlarge"
   LaunchTemplate:
     LaunchTemplateId: !Ref LaunchTemplate
     Version: !GetAtt LaunchTemplate.LatestVersionNumber
   MinSize: 0
   MaxSize: 100
   Tags:
   - Key: k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot
     PropagateAtLaunch: true
     Value: "true"

بعض الملاحظات حول استخدام Spot مع Kubernetes:

  • تحتاج إلى التعامل مع إنهاءات Spot، على سبيل المثال عن طريق دمج العقدة عند إيقاف المثيل
  • يستخدم زالاندو شوكة القياس التلقائي للمجموعة الرسمية مع أولويات تجمع العقدة
  • العقد الموضعية يمكن أن يجبر قبول "تسجيلات" أعباء العمل للتشغيل في Spot

ملخص

أتمنى أن تجد بعض الأدوات المقدمة مفيدة في تقليل فاتورة السحابة الخاصة بك. يمكنك العثور على معظم محتويات المقالة أيضًا على محاضرتي في DevOps Gathering 2019 على YouTube وفي الشرائح.

ما هي أفضل ممارساتك لتوفير تكاليف السحابة على Kubernetes؟ يرجى إعلامي على تويتر (@try_except_).

[1] في الواقع، سيظل أقل من 3 وحدات معالجة مركزية افتراضية قابلة للاستخدام حيث يتم تقليل إنتاجية العقدة بواسطة موارد النظام المحجوزة. يميز Kubernetes بين سعة العقدة الفعلية والموارد "المقدمة" (العقدة قابلة للتخصيص).

[2] مثال على الحساب: تبلغ تكلفة مثيل m5.large الذي يحتوي على 8 جيجا بايت من الذاكرة حوالي 84 دولارًا أمريكيًا شهريًا (eu-central-1، عند الطلب)، أي. يبلغ حظر العقدة 1/8 حوالي 10 دولارات شهريًا.

[3] هناك العديد من الطرق لتقليل فاتورة EC2، مثل المثيلات المحجوزة وخطة التوفير وما إلى ذلك. - لن أغطي هذه المواضيع هنا، ولكن يجب عليك بالتأكيد النظر فيها!

تعلم المزيد عن الدورة.

المصدر: www.habr.com

إضافة تعليق