ڪبرنيٽس سان ڪم ڪرڻ وقت ڪلائوڊ خرچن تي ڪيئن بچت ڪجي؟ هتي ڪو به واحد صحيح حل ناهي، پر هي آرٽيڪل ڪيترن ئي اوزارن کي بيان ڪري ٿو جيڪي توهان جي وسيلن کي وڌيڪ مؤثر طريقي سان منظم ڪرڻ ۽ توهان جي ڪلائوڊ ڪمپيوٽنگ جي قيمتن کي گهٽائڻ ۾ مدد ڪري سگھن ٿا.
مون هي مضمون لکيو آهي ڪبرنيٽس سان AWS لاءِ ذهن ۾، پر اهو لاڳو ٿيندو (تقريبا) بلڪل ساڳي طرح ٻين ڪلائوڊ فراهم ڪندڙن تي. مان سمجهان ٿو ته توهان جا ڪلسٽر اڳ ۾ ئي آٽو اسڪيلنگ ترتيب ڏنل آهن (ڪلسٽر-آٽو اسڪيلر). وسيلن کي ختم ڪرڻ ۽ توهان جي تعیناتي کي اسڪيل ڪرڻ صرف توهان کي پئسا بچائيندو جيڪڏهن اهو توهان جي ڪم ڪندڙ نوڊس جي بيبي کي گھٽائي ٿو (EC2 مثالن).
تيز رفتار ماحول ۾ ڪم ڪرڻ وڏو آهي. اسان ٽيڪنالاجي تنظيمون چاهيون ٿا تيز. تيز سافٽ ويئر پهچائڻ جو مطلب پڻ وڌيڪ پي آر ڊيٽنگون، پريويو ماحول، پروٽوٽائپس، ۽ تجزياتي حل. هر شي ڪبرنيٽس تي ترتيب ڏني وئي آهي. ڪنهن وٽ وقت آهي دستي طور تي ٽيسٽ جي ترتيبن کي صاف ڪرڻ؟ اهو هڪ هفتي پراڻي تجربو کي ختم ڪرڻ جي باري ۾ وسارڻ آسان آهي. بادل بل ختم ٿي ويندو ڪجهه سببن جي ڪري جنهن کي اسان بند ڪرڻ وساري ويٺا آهيون:
(هيننگ جيڪبس:
زيزا:
(اقتباس) ڪوري ڪوئن:
افسانه: توهان جو AWS اڪائونٽ توهان جي استعمال ڪندڙن جي تعداد جو هڪ فنڪشن آهي.
حقيقت: توهان جو AWS سکور توهان جي انجنيئرن جي تعداد جو هڪ فنڪشن آهي.
Ivan Kurnosov (جواب ۾):
حقيقي حقيقت: توهان جو AWS سکور انهن شين جي تعداد جو هڪ فنڪشن آهي جيڪو توهان وسري ويو غير فعال / حذف ڪرڻ.)
ڪبرنيٽس جانيٽر (kube-janitor) توهان جي ڪلستر کي صاف ڪرڻ ۾ مدد ڪري ٿي. جينيٽر جي جوڙجڪ ٻنهي عالمي ۽ مقامي استعمال لاء لچڪدار آهي:
هيٺ ڏنل مثال 2020 ۾ سڀني نئين ڊيپلائيمينٽس/StatefulSets لاءِ ڊيپلائيمينٽ ۽ StatefulSet پوڊس تي ايپليڪيشن ليبل جي استعمال کي منظم ڪري ٿو، پر ساڳئي وقت هن ليبل کان سواءِ ٽيسٽن جي عمل جي اجازت ڏئي ٿو هڪ هفتي لاءِ:
- 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 منٽن لاءِ وقت جي محدود ڊيمو هلايو ڪلسٽر تي هلندڙ ڪوبي جينيٽر:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
وڌندڙ خرچن جو ٻيو ذريعو مسلسل حجم (AWS EBS) آھي. Kubernetes StatefulSet کي حذف ڪرڻ ان جي مسلسل حجم کي ختم نٿو ڪري (PVC - PersistentVolumeClaim). غير استعمال ٿيل EBS حجم آساني سان نتيجا ڏئي سگھن ٿا سئو ڊالر في مهيني جي قيمت. Kubernetes Janitor ھڪڙي خاصيت آھي غير استعمال ٿيل PVCs کي صاف ڪرڻ لاءِ. مثال طور، هي قاعدو سڀني 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 توھان جي مدد ڪري سگھي ٿو توھان جي ڪلستر کي صاف رکڻ ۽ ڪلائوڊ ڪمپيوٽنگ جي خرچن کي سست ٿيڻ کان روڪڻ. ترتيب ڏيڻ ۽ ترتيب ڏيڻ جي هدايتن لاء، پيروي ڪريو README kube- دربان.
غير ڪم ڪندڙ ڪلاڪن دوران اسڪيلنگ کي گھٽايو
ٽيسٽ ۽ اسٽيجنگ سسٽم کي عام طور تي صرف ڪاروباري ڪلاڪن دوران هلائڻ جي ضرورت آهي. ڪجھ پيداوار ايپليڪيشنون، جيئن ته واپس آفيس / منتظم اوزار، پڻ صرف محدود دستيابي جي ضرورت هوندي آهي ۽ رات جو معذور ٿي سگھي ٿو.
ڪبرنيٽس ڊائون اسڪيلر (kube-downscaler) صارفين ۽ آپريٽرن کي غير ڪم ڪندڙ ڪلاڪن دوران سسٽم کي گھٽائڻ جي اجازت ڏئي ٿو. ڊيپلائيمينٽس ۽ اسٽيٽفيل سيٽ صفر ريپليڪس تائين ماپ ڪري سگھن ٿا. 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
هتي هفتي جي آخر ۾ ڪلستر ورڪر نوڊس اسڪيلنگ لاءِ هڪ گراف آهي:
~ 13 کان 4 ورڪر نوڊس تائين اسڪيلنگ يقيني طور تي توهان جي AWS بل ۾ قابل ذڪر فرق پيدا ڪري ٿي.
پر ڇا جيڪڏهن مون کي ڪلستر "ڊائون ٽائيم" دوران ڪم ڪرڻ جي ضرورت آهي؟ ڪجھ مقرريون مستقل طور تي اسڪيلنگ کان خارج ڪري سگھجن ٿيون downscaler/exclude: true annotation. ڊيپلائيمينٽن کي عارضي طور تي خارج ڪري سگھجي ٿو downscaler/exclude- تان جو تشريح مڪمل ٽائم اسٽيمپ سان فارميٽ ۾ YYYY-MM-DD HH:MM (UTC). جيڪڏهن ضروري هجي ته، سڄي ڪلستر کي واپس اسڪيل ڪري سگهجي ٿو هڪ پوڊ کي تشريح سان ترتيب ڏيڻ سان downscaler/force-uptime، مثال طور، شروع ڪندي nginx blank:
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
HPA سان افقي آٽو اسڪيلنگ کي ترتيب ڏيڻ هڪ ڊفالٽ عملن مان هجڻ گهرجي ته جيئن بي رياست خدمتن جي ڪارڪردگي کي بهتر بڻائي سگهجي. Spotify وٽ هڪ پيشڪش آهي انهن جي تجربي ۽ سفارشن سان HPA: توهان جي تعیناتي کي ماپ ڪريو، نه توهان جي والٽ.
وسيلن جي اوور بکنگ کي گھٽايو
ڪبرنيٽس ڪم لوڊ انهن جي سي پي يو / ياداشت جي ضرورتن کي "وسيع درخواستن" ذريعي طئي ڪري ٿو. سي پي يو وسيلا ورچوئل ڪور ۾ ماپيا ويندا آهن يا وڌيڪ عام طور تي ”ملي ڪورز“ ۾، مثال طور 500m مطلب 50% vCPU. ياداشت جا ذريعا بائيٽ ۾ ماپيا ويندا آهن، ۽ عام لاڳاپا استعمال ڪري سگھجن ٿا، جهڙوڪ 500Mi، جنهن جو مطلب آهي 500 ميگا بائيٽ. ڪم ڪندڙ نوڊس تي وسيلن جي درخواست ”لاڪ“ جي گنجائش، مطلب ته هڪ پوڊ 1000m سي پي يو جي درخواست سان نوڊ تي 4 وي سي پي يوز سان گڏ صرف 3 وي سي پي يو باقي پوڊز لاءِ دستياب هوندا. [1]
سست (اضافي رزرو) درخواست ڪيل وسيلن ۽ حقيقي استعمال جي وچ ۾ فرق آهي. مثال طور، هڪ پوڊ جيڪو 2 GiB ميموري جي درخواست ڪري ٿو پر صرف 200 MiB استعمال ڪري ٿو ~ 1,8 GiB "اضافي" ياداشت. اضافي خرچ پئسا. ڪو اندازو لڳائي سگھي ٿو ته 1 GiB بيڪار ياداشت جي قيمت ~ $10 هر مهيني. [2]
Kubernetes وسيلن جي رپورٽ (kube-resource-report) اضافي ذخيرا ڏيکاري ٿو ۽ بچت جي صلاحيت کي طئي ڪرڻ ۾ توهان جي مدد ڪري سگهي ٿي:
Kubernetes وسيلن جي رپورٽ ظاھر ڪري ٿو اضافي مجموعو ايپليڪيشن ۽ حڪم سان. هي توهان کي انهن هنڌن کي ڳولڻ جي اجازت ڏئي ٿو جتي وسيلن جي گهرج کي گهٽائي سگهجي ٿي. ٺاهيل HTML رپورٽ صرف وسيلن جي استعمال جو هڪ سنيپ شاٽ مهيا ڪري ٿي. توھان کي ڏسڻ گھرجي سي پي يو / ياداشت جي استعمال کي وقت سان گڏ مناسب وسيلن جي درخواستن جو تعين ڪرڻ لاءِ. هتي هڪ گرافانا چارٽ آهي "عام" سي پي يو-هاري سروس لاءِ: سڀئي پوڊ استعمال ڪري رهيا آهن خاص طور تي 3 درخواست ڪيل سي پي يو ڪور کان گهٽ:
3000m کان ~ 400m تائين CPU جي درخواست کي گھٽائڻ ٻين ڪم لوڊ لاءِ وسيلا آزاد ڪري ٿو ۽ ڪلستر کي ننڍو ٿيڻ جي اجازت ڏئي ٿو.
پر ڇا اسان واقعي چاهيون ٿا ته ماڻهو YAML فائلن ۾ قدر تبديل ڪن؟ نه، مشينون اهو گهڻو بهتر ڪري سگهن ٿيون! ڪبرنيٽس عمودي پوڊ آٽو اسڪيلر (VPA) صرف اهو ڪري ٿو: ڪم جي لوڊ جي مطابق وسيلن جي درخواستن ۽ رڪاوٽن کي ترتيب ڏئي ٿو. هتي Prometheus CPU درخواستن جو هڪ مثال گراف آهي (ٿلهي نيري لائن) وقت سان گڏ VPA پاران ترتيب ڏنل:
سونو وڪڻ Fairwind کان هڪ اوزار آهي جيڪو هر هڪ مقرري لاءِ هڪ وي پي اي ٺاهي ٿو نالي جي جڳهه ۾ ۽ پوءِ ڏيکاري ٿو هڪ وي پي اي سفارش ان جي ڊيش بورڊ تي. اهو ڊولپرز کي انهن جي ايپليڪيشنن لاءِ صحيح سي پي يو / ياداشت جي درخواستن کي ترتيب ڏيڻ ۾ مدد ڪري سگهي ٿو:
آخري نه پر گهٽ ۾ گهٽ، AWS EC2 قيمتون گھٽائي سگھجن ٿيون اسپاٽ مثال استعمال ڪندي ڪبرنيٽس ورڪر نوڊس جي طور تي [3]. آن ڊيمانڊ قيمتن جي مقابلي ۾ اسپاٽ مثال 90٪ رعايت تي دستياب آهن. EC2 اسپاٽ تي ڪبرنيٽس کي هلائڻ هڪ سٺو ميلاپ آهي: توهان کي وڌيڪ دستيابي لاءِ ڪيترن ئي مختلف مثالن جي قسمن کي بيان ڪرڻ جي ضرورت آهي، مطلب ته توهان ساڳئي يا گهٽ قيمت لاءِ وڏو نوڊ حاصل ڪري سگهو ٿا، ۽ وڌايل گنجائش ڪنٽينر ٿيل ڪبرنيٽس ڪم لوڊ ذريعي استعمال ڪري سگهجي ٿي.
EC2 اسپاٽ تي ڪبرنيٽس کي ڪيئن هلائڻ؟ اتي ڪيترائي اختيار آھن: ھڪڙي ٽئين پارٽي جي خدمت استعمال ڪريو جيئن SpotInst (ھاڻي "Spot" سڏيو ويندو آھي، مون کان نه پڇو ڇو)، يا صرف پنھنجي ڪلستر ۾ ھڪڙو Spot AutoScalingGroup (ASG) شامل ڪريو. مثال طور، ھتي آھي CloudFormation snippet for a "capity-optimized" Spot ASG لاءِ گھڻن مثالن جي قسمن سان:
ڪبرنيٽس تي بادل جي خرچن کي بچائڻ لاءِ توهان جا بهترين طريقا ڪهڙا آهن؟ مهرباني ڪري مون کي خبر ڏيو تي Twitter (@try_except_).
[1] حقيقت ۾، 3 وي سي پي يوز کان گھٽ استعمال جي قابل رھندا جيئن نوڊ جي ذريعي گھٽجي ويندي آھي محفوظ ڪيل سسٽم وسيلن جي ذريعي. ڪبرنيٽس فزيڪل نوڊ جي گنجائش ۽ "روزي ڪيل" وسيلن جي وچ ۾ فرق ڪري ٿو (نوڊ مختص).
[2] حساب ڪتاب جو مثال: هڪ m5.large مثال 8 GiB ميموري سان ~$84 هر مهيني آهي (eu-central-1, On-Demand), يعني. 1/8 نوڊ کي بلاڪ ڪرڻ لڳ ڀڳ ~ $10/مهينو آهي.
[3] توھان جي EC2 بل کي گھٽائڻ لاءِ ڪيترائي وڌيڪ طريقا آھن، جھڙوڪ محفوظ ٿيل مثال، بچت جو منصوبو، وغيره. - مان انھن عنوانن کي ھتي نه ڍڪيندس، پر توھان کي انھن تي ضرور غور ڪرڻ گھرجي!