جائزہ: GitLab Runners on Kubernetes پر تکنیکی گہرائی، آپریٹر انسٹال، Helm کی قیمتیں، خودکار پیمانہ بڑھانا اور FinOps کا خرچہ ماڈل۔ مختصر ورژن کے لیے، پڑھیںخالی CI کے لیے پیسہ نہ دینا.
زیادہ تر ٹیمیں مسلسل انٹیگریشن کے لیے اتنے پیسے دیتی ہیں جیسے ہر رات اور ہر ہفتے کا دن ابھی بھی پیر کی صبح ہو۔ سرور گرم رہتے ہیں۔ ڈسک مختص رہتا ہے۔ کوئی کوڈ نہیں مل رہا — اور بل کو فرق نہیں پڑتا۔ وہ جملہ ایک نعرہ نہیں ہے؛ یہ ایک فکسڈ رنر فلیٹ کا ڈیفالٹ شکل ہے۔
یہ طویل مضمون ایک ہاتھ سے چلنے والے عمل کا تکنیکی ساتھی ہےGitLab Server اور GitLab Runner on Kubernetesپر: Kubernetes ایکسیکیوٹر کیسے ہر CI جاب کو ایک عارضی پوڈ میں بدل دیتا ہے، اس سے کیسے ڈائنامک پرووائزن اور ڈی-پرووائزن ممکن ہوتا ہے، اور اس ڈیزائن سے کیسےبہت بڑی بچتممکن ہوتی ہے جب رات اور ہفتے کے دن طلب گر جاتی ہے۔
دونوں سیشنز پہلے دیکھیں، پھر اس صفحے کو لکھتے ہوئے آرکائیچر اور خرچہ ماڈل کے طور پر استعمال کریں۔
1. Runners & pipelines— Kubernetes پر GitLab Runner ورک لوڈز کا خودکار پیمانہ بڑھانا۔
دیکھیں: مکمل GitLab Runners اور CI/CD on Kubernetes· آسان زبان میں:خالی CI کے لیے پیسہ نہ دینا
2. GitLab سرور HA Kubernetes— آپریشنر کے ساتھ GitLab کو چند منٹوں میں ڈپلوی کریں۔
دیکھیں: آپریشنر کا استعمال کرتے ہوئے HA Kubernetes کلัสٹر میں GitLab ڈپلوی کریں· دستاویزات:GitLab آپریشنر انسٹالیشن
1. تھیسس
GitLab on Kubernetes + Kubernetes ایکزیکیوٹرCI کیپاسٹی کی اکائی کو "مہینے بھر ہماری ملکیت کا مشین" سے "ان جاب کے لیے کرائے پر لیے جانے والے پوڈز (اور نڈز)" میں تبدیل کرتا ہے۔ رنر مینیجر چھوٹا رہتا ہے اور ہمیشہ آن رہتا ہے۔ جاب پوڈز ایک بلڈنگ کے لیے ظاہر ہوتے ہیں اور بعد میں غائب ہو جاتے ہیں۔ کلัสٹر آٹو اسکیلنگ کے ساتھ، ورکر نڈز ایک ہی کورو کے ساتھ چلتے ہیں۔ یہی طریقہ ہے جس سے آپ پیر کی صبح کی ٹھوس پیداوار کو تحفظ دیتے ہیں اور پیر کی صبح کے نرخوں کو دوسرے دن 03:00 پر اور پرسکون شہتوئوں پر نہیں دیتے۔
ایک لائن میں — جو عام لوگوں کے لیے گائیڈ کی ایک ہی لائن ہے:چوٹ پر فراہم کریں، گھٹاؤ پر ختم کریں.
2. مہنگی عادت، جسے ایک آرکٹیکچر سمن (architecture smell) کے طور پر بیان کیا گیا ہے
روایتی CI اکثر مستقل فلیٹ (permanent fleet) کی طرح لگتا ہے: ایک فکسڈ سیٹ آف بیلڈ میکانز جو "صرف احتیاط کے لیے" رہتے ہیں۔ یہ تب کام کرتا ہے جب ٹریفک مستقل ہو۔ یہ تب پیسے ضائع کرتا ہے جب ڈیمانڈ پھٹ پھٹ ہو۔
- دن کے وقت:ڈیولپرز شاخیں دھکیلتے ہیں، میرج ریکویسٹس کھولتے ہیں، ٹیسٹ چلائے جاتے ہیں — ڈیمانڈ پھٹ پھٹ ہو جاتا ہے۔
- شام اور رات:سرگرمی کم ہو جاتی ہے؛ میکانز اب بھی CPU اور RAM جلانے لگے رہتے ہیں۔
- ہفتے کے دن:اکثر تقریباً بے کار — لیکن اسٹوریج وولیمز اور کلاؤڈ نوڈز ابھی بھی ریزرو ہوئے ہوئے اور بل ہو رہے ہوئے ہو سکتے ہیں۔
آپ "کئے گئے بیلڈز" کے لیے نہیں بلکہ اس کیپاسٹی کے لیے ادا کر رہے ہیں جو موجود ہے چاہے کوئی اسے استعمال کرے یا نہ کرے۔ فکسڈ فلیٹس بھی اسٹکی اسٹیٹ جمع کرتے ہیں: "رانر 3 پر کام کرتا ہے"، ڈریفٹڈ پیکجز، کیشز جو کبھی ختم نہیں ہوتے۔ الیسٹک پوڈز خود سے ڈسپلن حل نہیں کرتے، لیکن وہ کلین-اسلیٹ کو ڈیفالٹ بنا دیتے ہیں۔
3. نظام نقشہ
| تہہ | کردار | عام مقام |
|---|---|---|
| GitLab سرور | SCM، CI کوآرڈینیشن، رجسٹری، UI/API | Kubernetes کے ذریعے GitLab آپریٹر / Helm چارٹ (جیسے k3s لیب) |
| رنر مینیجر | جوکوں کے لیے پوچھنے والا رجسٹرڈ ایجنٹ | Helm ریلیز ایک مخصوص نام سپیس میں (جیسےgitlab-runner) |
| جوک پوڈز | اصل تعمیر / ٹیسٹ / پیکجنگ مراحل | ہر جوک کے لیے Kubernetes ایکسیکیوٹر کے ذریعے بنائے گئے، پھر حذف کر دیے گئے |
| اختیاری DinD سروس | Docker تعمیرات جوک کے اندر | جوک کے ساتھ ساتھ خصوصی سروس کنٹینر |
| کلسٹر / نود خودکار اسکیلر | پوڈ دباؤ کے تحت ورکر نودز کا اضافہ/حذف | کلاؤڈ ASG، کلسٹر اسکیلر، Karpenter، یا مساوی |
عام گائیڈ سے اس تہہ پر بھی مشابہت قائم رہتی ہے: GitLab رنر کام کرنے والا ہے؛ Kubernetes وہ ڈسپچر ہے جو کاموں (جوکوں) کی آمد پر ہی کام کرنے والوں کو بلاتا ہے، پھر انہیں گھر بھیجتا ہے۔
4. GitLab کی انسٹالیشن کلัสٹر پر (آپریٹر راستہ)
ڈے 1 ٹریننگ راستہ سرور کو آفیشل آپریٹر کے ساتھ GitLab انسٹال کرتا ہے تاکہ سرور ایک ہی Kubernetes بنیاد کا اشتراک کرے جو رنرز کی بھی ہے۔ ساتھی ویڈیوآپریٹر کے ذریعے HA Kubernetes کلัสٹر میں GitLab ڈیپلوی کریںاس انسٹالیشن کو چند منٹوں میں گزراتا ہے۔ ضروری شرائط: ایک کلัสٹر جس میں انگریس، Helm،kubectlہو اور جب چارٹ TLS کو انتظام کرتا ہو تو سیرٹ مینجر۔
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm install gitlab-operator gitlab/gitlab-operator \
--create-namespace \
--namespace gitlab-system
kubectl -n gitlab-system get deployment gitlab-controller-manager
# Apply the GitLab custom resource (pin chart version in the manifest)
kubectl -n gitlab-system apply -f deploy_gitlab_server.yaml
نمونہ CR شکل (اپنے ماحول کے لیے ڈومین اور ایسوسیٹر ای میل کو موزوں کریں):
apiVersion: apps.gitlab.com/v1beta1
kind: GitLab
metadata:
name: gitlab
spec:
chart:
version: "9.2.2"
values:
global:
hosts:
domain: "example.com"
ingress:
configureCertmanager: true
certmanager-issuer:
email: you@example.com
پہلی انسٹالیشن عام طور پر تقریباً 10–15 منٹ لیتی ہے جبکہ ویب سروس، سائیڈک، ڈیٹا اسٹورز اور متعلقہ اجزاء سکون پا لیتے ہیں۔ کلัสٹر راز سے ابتدائی روٹ پاس ورڈ حاصل کریں:
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab-system \
-o jsonpath='{.data.password}' | base64 -d
حوالہ:GitLab آپریٹر انسٹالیشن(اس صفحے پر Helm ٹیب)۔ چارٹ کا جائزہ:docs.gitlab.com/charts· انسٹال گائیڈ:چارٹس انسٹالیشن.
5. Kubernetes ایکسیکیوٹر کے ساتھ GitLab رنر
GitLab رنر وہ ایپلیکیشن ہے جو GitLab CI/CD کے ساتھ کام کرتا ہے تاکہ پائپ لائن میں نوکریاں چلائی جا سکیں۔Kubernetes ایکسیکیوٹرکے ساتھ، مینیجر خود پر کمپائل نہیں کرتا۔ ہر نوکری کے لیے:
- ایک پوڈ بناتا ہے (بہت سے مددگار / سروس کنٹینرز کی ترتیب کے مطابق)۔
- لوگس کو GitLab واپس بھیجتا ہے۔
- آرٹیفیکٹس اور اخراج کی حیثیت کو اکٹھا کرتا ہے۔
- پوڈ کو حذف کرتا ہے — CPU اور RAM کو کلัสٹر واپس کرتا ہے۔
وہ بنانے/چلانے/حذف کرنے کا لوپ پہلا خرچ کا لور ہے۔ مکمل شدہ کام رات بھر وقفہ ڈیڈیکیٹڈ مشین کو چھوڑنا نہیں چاہیے۔
5.1 Helm انسٹالیشن پیراڈرن
ٹریننگ اسکرپٹس ایک نینس پیس بناتے ہیں، رجسٹریشن ٹوکن پاس کرتے ہیں، اور ایک سے زیادہ ریلیز انسٹال کر سکتے ہیں (مثال کے طور پر alpine-based اور ubuntu-based رنرز) تاکہ جابز مختلف ماحول منتخب کر سکیں۔ سرکاری طریقہ:GitLab Runner کو Helm چارٹکے ساتھ انسٹال کریں؛ ویلیوز ریفرنس:GitLab Runner Helm چارٹکو ترتیب دیں۔
helm upgrade --install --namespace gitlab-runner gitlab-runner-alpine \
-f config-runner-alpine.yaml \
--set serviceAccount.create=true \
gitlab/gitlab-runner \
--create-namespace
GitLab UI (انسٹینس / گروپ / پروجیکٹ رنرز) یا آپریٹر-منیجڈ سیکرٹس سے ٹوکن حاصل کریں۔ جدید رنر اتھنٹیکیشن ٹوکنز کو ترجیح دیں؛ رجسٹریشن ٹوکنز GitLab 18 کی طرف deprecated ہو رہے ہیں۔کبھی بھی لائی ٹوکنز— لیب اسکرپٹس کبھی کبھی ایسے پلیس ہولڈرز رکھتے ہیں جنہیں مقامی طور پر تبدیل کرنا ضروری ہوتا ہے۔
5.2 اہمیت رکھنے والے اقدار پیمانہ بندی اور الگ تھلگ رہنے کے لیے
Workstation ٹیمپلیٹس سے (gitlab-runner-values-template.yaml/ جنریٹڈconfig-runner-*.yaml):
| سیٹنگ | اس کی اہمیت |
|---|---|
concurrent | یہ مینیجر ایک ساتھ کتنے کام چلا سکتا ہے۔ دن کے عروج کے لیے بڑھائیں (ٹریننگ نوٹس میں دہائیوں کا ذکر ہے، جیسے 20–40، مصروف لیبارٹریوں میں)۔ کلوسٹر حدود سے پہلے نرم تھروٹل۔ |
runners.privileged/ ایگزیکٹورprivileged | اکثر Docker-in-Docker کے لیے ضروری ہوتا ہے؛ اگر آپ کو ڈین ڈینڈ کی ضرورت نہیں تو سخت کریں۔ |
[runners.kubernetes].namespace | جہاں کام کے پوڈز گرہٹتے ہیں — جیٹ لیب سسٹم اجزاء سے الگ رکھیں۔ |
ڈیفالٹimage/ ہیلپر امیج | پائیداری کے لیے ٹیگز پین کریں (الپائن/یو بی انٹنٹ پوزلز میں)۔ |
[[runners.kubernetes.services]]ڈین ڈینڈ | سائیڈ کارdocker:dindامیج بنانے کے لیے؛ رجسٹری آئیناروں / غیر محفوظ رجسٹریز صرف ضرورت کے مطابق ترتیب دیں۔ |
RBACclusterWideAccess | صرف تب اگر کاموں کو کلوسٹر وائڈ وسائل کا انتظام کرنا ہو؛ پروڈکشن میں کم سے کم اختیارات کو ترجیح دیں۔ |
| ہوسٹ ایلیاسز / DNS کانفیگ | لیبارٹری کی آسانی کے لیے کلوسٹر میں جیٹ لیب اور رجسٹری ہوسٹ نیمز کے لیے۔ |
gitlabUrl: http://gitlab-webservice-default.gitlab-system.svc.cluster.local:8080/
concurrent: 2
rbac:
create: true
clusterWideAccess: true
runners:
privileged: true
config: |
[[runners]]
environment = ["GIT_SSL_NO_VERIFY=1"]
[runners.kubernetes]
namespace = "gitlab-runner"
image = "alpine/git:latest"
service_account = "gitlab-runner"
privileged = true
CPU کے بغیر کنکوریئنسی صرف قطار کو لمبا کرتی ہے۔concurrentکو اصل نود ہیڈ روم یا نود خودکار اسکیلنگ کے ساتھ جوڑیں۔
6. خودکار پیمان کاری دو (در حقیقت چار) سطحوں پر
"GitLab Runners کو Kubernetes پر خودکار پیمان کاری" ایک سوئچ نہیں ہے۔ ان لوریز کو آپس میں رکھیں:
- جاب پوڈ کی لچک— یہ Kubernetes ایگزیکٹور میں بنیادی طور پر شامل ہے۔ صفر جابز → صفر جاب پوڈز۔ یہ ایک ہی مشترکہ کلسٹر پر زیادہ تر فی جاب ضیاع کو ختم کر دیتا ہے۔
- رنر
concurrentاور متعدد رنر ڈپلوائمنٹس— الپائن بمقابلہ یونٹو (یا CPU بمقابلہ بڑے بیلڈرز) کو الگ الگ رکھیں تاکہ مخصوص صلاحیت غلط ملاپ کے لیے بے کار نہ رہے۔ - کلسٹر / نود خودکار پیمان کاری— پینڈنگ پوڈز نودز شامل کرتے ہیں؛ خالی نودز شام کے بھاگ کے بعد چھوٹ جاتے ہیں۔
- اختیاری شیڈول سے آگاہ پالیسی— راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفتے کے آخر میں راتوں/ہفت
6.2 ڈائنامک فراہمی اور غیر فعال کرنا (Dynamic provision and de-provision) سرے سے آخر تک
ٹریس کریں ایک پائپ لائن جاب:
- ڈیولپر پش کرتا ہے؛ GitLab پینڈنگ کوئو میں ایک جاب بناتا ہے۔
- رنر مینیجر جاب کا دعویٰ کرتا ہے اور API سے ایک پوڈ مانگتا ہے۔
- اگر کلسٹر میں CPU/رام کی کمی ہو، تو آٹو اسکیلر ایک نیا نوڈ شامل کرتا ہے (فراہمی)۔
- پوڈ اسکرپٹ چلائے گا، آرٹیفیکٹس اپ لوڈ کرے گا، اور باہر نکل جائے گا۔
- پوڈ حذف ہو جائے گا؛ وسائل دوبارہ پوول میں واپس جائیں گے (جاب کی سطح پر غیر فعال کرنا)۔
- جب بہت سے نوڈز اسکیل ڈاؤن تھریشولڈ سے زیادہ خالی بیٹھ جائیں — عام طور پر شام اور پورے ہفتے کے بعد — نوڈز چلے جائیں گے (انفراسٹرکچر کی سطح پر غیر فعال کرنا)۔
وہ مکمل لوپ یہی ہے جس کا ویڈیو ہائپرسکیل پر GitLab Runners کے لیے کوسٹ آپٹیمائزیشن کا مطلب ہے: کوئی بھی ایک خاص فلگ نہیں، بلکہ جاب لائف سائیکل اور کلسٹر الیسٹیسٹیٹا ایک دوسرے کے ساتھ کام کر رہے ہیں۔
7. کوسٹ ماڈل: جہاں بڑی ڈالر کی بچت ظاہر ہوتی ہے
درست رہیں۔ آٹو اسکیلنگ بلڈز کو مفت نہیں بناتی۔ یہ آپ کو آف-پیک گھنٹوں کے لیے پیک ریٹز ادا کرنے سے روکتی ہے۔ بچت اصل ڈیمانڈ کے مطابق خرچ کرنے سے آتی ہے — سادہ گائیڈ سے چار نکات، آپریٹرز کے لیے پھیلائے گئے۔
7.1 صرف تب ہی اسکیل اپ کریں جب لوگ (یا بوٹس) کام کر رہے ہوں
جب ایک مصروف صبح درجنوں پائپ لائنز کو لگائے، تو Kubernetes بہت سی جاب پوڈز کو پیرلل میں شیڈول کرتا ہے تک کہ کنکریونسی اور کلسٹر کی حدیں پوری ہوں۔ ٹھوس دیکھنے میں آتا ہے جب میرج پریشر واقعی ہو۔
7.2 جب طلب ختم ہو جائے تو سختی سے پیمانہ کم کریں
جب کام مکمل ہو جائیں تو پوڈز غائب ہو جائیں گے۔ کلسٹر خودکار پیمانہ بڑھانے (یا ایک مناسب سائز کے نوڈ پول کے ساتھ)، غیر استعمال شدہ کلاؤڈ نوڈز پول سے باہر ہو جائیں گے۔ راتوں اور ہفتہ کے دن — عام طور پر پروڈکٹ ٹیموں کے لیے سب سے پرسکون کھڑکیاں — وہ پہلی صلاحیت ہیں جس پر آپ چھوڑنا چاہیں گے۔
7.3 CPU، RAM اور اسٹوریج کا ضیاع بند کریں
وسائل ہمیشہ چلنے والی رنر وی ایمز Kubernetes کام کے پوڈز + نوڈ خودکار پیمانہ بڑھانے CPU خالی ہوئے ہوئے قطار کے دوران رکے ہوئے ریزروڈ کورز پوڈز نکلنے پر آزاد؛ نوڈز اندر پیمانہ بڑھا سکتے ہیں RAM ایجنٹ آپریٹنگ سسٹم + 24×7 رہنے والے خالی ایگزیکٹرز ہر پوڈ حذف کرنے پر میموری واپس آ جاتی ہے اسٹوریج ہر وی ایم پر گرم ڈسکس اور امیج لیئر ڈیفالٹ میں عارضی خراش؛ شیئرڈ کیچز ایک واضح، سائز شدہ انتخاب بن جاتے ہیں ایک مہینے تک، پرسکون گھنٹے گھڑی پر غالب ہوتے ہیں۔ راتوں اور ہفتہ کے دنوں کو بحال کرنا وہاں ہے جہاںڈالر کی بچتیں مرکب ہوتی ہیں۔
7.4 نتائج کے لیے ادا کریں، فرنیچر کے لیے نہیں
آپ اب بھی GitLab اور ایک پتلا کنٹرول پلین (رانر مینیجر + کلسٹر ضروریات) کے لیے ادا کرتے ہیں۔ جس چیز کے لیے آپ ادا کرنا بند کر رہے ہیں وہ ایک خالی سیٹوں کا گودام ہے۔
7.5 کامیاب ہونے کی شوقین بصیرت (ایک بنائی ہوئی معیار نہیں)
فرض کریں کہ دن کے وقت میں پائیدار طور پر 20 مصروف ایگزیکٹر اسلوٹس کی ضرورت ہوتی ہے، لیکن رات اور ہفتے کے دنوں میں صرف 2۔ ایک مستقل فلیٹ جو 20 کے لیے ڈیزائن کیا گیا ہو، پورے دن اور رات 20 کے لیے ادا کرتا ہے۔ ایک لچکدار پول دن کے وقت تقریباً 20 اور پرسکون وقت میں تقریباً 2 (بالاں سے کنٹرول پلین) کے لیے ادا کرتا ہے۔ بہت سے پروڈکٹ ٹیموں کے لیے پرسکون گھنٹے مہینے کا ایک بڑا حصہ ہوتے ہیں — اس لیے انہیں واپس لینا یہی ہے کہ بچتیںعظیمہو جائیں بغیر کسی مارکیٹنگ فیصد کی ایجاد کے۔ فنans مالیاتی محکمہ مقامی نوڈ-گھنٹے کے قیمتوں کو ضرب دیتا ہے؛ آرکٹیکچر کا کام یہ ہے کہ بلنگ اکاؤنٹ میں خالی گھنٹے واقعی خالی ہوں۔
عظیم لاگت کی بچت تب ظاہر ہوتی ہے جب پیر کی چوٹی اب دوسرے دن کی 3 بجے کی بل کو نہیں طے کرتی — اور جب شہر کے خاموشی آخر کار بل پر بھی پرسکون نظر آتی ہے۔
7.6 آپ کا مقصد سے کیا ادا کرتے ہیں
- GitLab سرور اجزاء — صارفین اور CI کی ترتیب کے لیے سائز کریں، کمپائل فارم کے لیے نہیں۔
- رنر مینیجر ڈیپلوائمنٹس — کمپائل فارمز کے مقابلے میں چھوٹے۔
- منصوبہ بند کیچز (ڈپینڈنسی پراکسی، PVCس) — مفید، لیکن سائز کردہ؛ کیچز مفت اسٹوریج نہیں ہیں۔
- پرائیویلیجڈ ڈائن ڈی — آسان اور بھاری؛ جب کثافت اور الگ تھلگ ہونا مشابہت سے زیادہ اہم ہو تو کانیکو/بیلڈکٹ پر غور کریں۔
8. CI/CD عملیاتی نالیاں
جب رنرز آن لائن ہوں، تو
.gitlab-ci.ymlمراحل اور نوکریاں تعریف کرتا ہے۔ GitLab شیڈولنگ کرتا ہے؛ Kubernetes ایگزیکٹور پوڈز کو حقیقت میں لاتا ہے۔ نالوں کو اخراجات کے حوالے سے سچ رکھیں:- لینٹ/یونٹ پر جلدی ناکام ہوں بھاری امیج بنانے سے پہلے۔
- استعمال کریں
rules/workflowتاکہ ڈرافٹ شاخیں مکمل میٹرکس میں پھیل نہ جائیں۔ - واضح کلیز والے شیئرڈ کیوشز کو ترجیح دیں بجائے غیر محدود فی-وی ایم ڈسک بڑھاؤ کے۔
- نوکریاں درست رنر پول (الپائن بمقابلہ یونٹبو، چھوٹے بمقابلہ بڑے بنانے والے) کے ساتھ ٹیگ کریں۔
stages: [lint, test, build] workflow: rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH lint: stage: lint image: alpine:3.19 script: - echo "cheap checks first" test: stage: test tags: [kubernetes, alpine] script: - echo "unit tests" build: stage: build tags: [kubernetes, dind] rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH script: - echo "heavy image build only on default branch"معاشی خیال پلیٹ فارم کے خیال جیسا ہی ہے: مہنگی کام کو شیڈول نہ کریں جب ایک سستا چیک ناکام ہو سکتا تھا، اور خاص رنرز کو گرم نہ رکھیں جن کی نوکریاں ہفتے کے دن کبھی نہیں آتی۔
9. سیکیورٹی اور ٹیننسی نوٹس
عارضی پوڈز صفائی کو بہتر بناتے ہیں (کم چپچپا اسٹیٹ) لیکن خصوصی ڈین ڈینڈ اور کلسٹر-وائڈ RBAC پھیلنے والے دائرے کو وسیع کر سکتے ہیں۔ زیادہ تر ٹیموں کے لیے عملی ڈیفالٹس:
- نوکری پوڈز کو ایک مخصوص نام اسپیس میں چلائیں جس میں ResourceQuotas اور LimitRanges ہوں۔
- جہاں ممکن ہو غیر خصوصی بنائوں کو ترجیح دیں؛ ڈین ڈینڈ رنرز کو مخصوص ٹیگز کے پیچھے الگ تھلگ کریں۔
- ہر نوکری میں لمبی مدت کے کلاؤڈ کریڈنشیلز کو ماؤنٹ کرنے سے گریز کریں؛ ہر نالے کے لیے مختصر مدت کے ٹوکنز انجیکٹ کریں۔
- رنر رجسٹریشن ٹوکنز کو راز سمجھیں — جب لوگ چھوٹ جائیں یا لیبارٹریاں شیئر کی جائیں تو انہیں گھمائیں۔
- اگر کئی ٹیمیں ایک کلسٹر شیئر کرتی ہیں تو رنر مینیجرز کو الگ کریں (اور اختیاری طور پر نوڈ پولز) تاکہ ایک شورنگ پڑوسی پوری فارم کو گرم نہ رکھ سکے — اور اخراجات کی کہانی کو فی ٹیم قابلِ نسبت رکھیں۔
10. قابلِ مشاہدہ بنیادی طور پر بچتوں کی تصدیق کرتا ہے
آپ رات اور ہفتہ کے دنوں کی بچت کا دعویٰ نہیں کر سکتے بغیر دیکھنے کے۔ کم از کم یہ ٹریک کریں:
سگنل "اچھا" کیسا نظر آتا ہے ہر گھنٹے کے مطابق جاب پوڈ کی تعداد ہفتہ کے دنوں کے کام کے گھنٹوں پر چوٹیاں؛ رات اور ہفتہ کے دنوں پر قریبِ زمین پینڈنگ پوڈز چوٹی پر صرف عارضی طور پر چوٹیاں؛ مستقل پینڈنگ کا مطلب ہے کہ کم آئیں کنکرنسی/نوڈز نوڈ CPU / نوڈ کی تعداد پوڈ کی مانگ کو ٹریک کرتا ہے؛ خالی نوڈز گھنٹوں تک نہیں رہتے رنر مینیجر CPU/RAM جاب فارم کے لحاظ سے سیدھا اور چھوٹا ہفتے کے گھنٹے کے لحاظ سے کلاؤڈ بل خاموش دورانیے میں کٹ آؤر کے بعد واضح طور پر سستا اگر رات کو پوڈ کی تعداد گرتی ہے لیکن نوڈ بل نہیں گرتا، تو اسکیل ڈاؤن سیٹنگز — جیٹ لیب نہیں — اگلے کنوب ہیں۔
11. VMs مقرر شدہ (Fixed) بمقابلہ Kubernetes ایگزیکٹرز (فیصلہ سازی کا جدول)
مقرر شدہ رنر VMs Kubernetes ایگزیکٹور + خودکار پیمانہ بڑھانا (Autoscaling) صلاحیت کی اکائی پوری مشین، ہمیشہ مختص پوڈ (اور اختیاری طور پر نود) ہر کام کے لیے پیر کے چوٹی کے گھنٹے قطار یا زیادہ خریداری کی VMs متوازی بڑھائیں اور نودز کو پیمانہ بڑھائیں راتیں / ہفتے کے آخر اگر VMs چل رہی ہیں تو ابھی بھی بل ہوگا پوڈز ختم ہو گئے؛ نودز چھوٹ سکتے ہیں CPU / RAM / اسٹوریج کا ضیاع خالی پڑنے پر ڈھانچہاتی ڈیفالٹ طور پر واپس لیا جاتا ہے ڈریفٹ / "رانر 3 پر کام کرتا ہے" عام کم (ڈیفالٹ طور پر عارضی) آپریشنل پیچیدگی ابتدائی طور پر کم زیادہ (کلسٹر مہارتیں ضروری) مقرر شدہ VMs کا انتخاب صرف اس وقت کریں جب آپ کو واقعی یکساں 24×7 مانگ ہو یا پابندیاں جو کلسٹر کو منع کرتی ہوں۔ باقی سب لوگ جن کے اسپائکی انسانی چلائے گئے پائپ لائنز ہیں وہ فرنیچر ٹیکس ادا کر رہے ہیں۔
12. وہ جو آپ نہیں دے رہے
خودکار پیمانہ بڑھانا "کوئی کنٹرول نہیں" کا مطلب نہیں ہے۔ آپ اب بھی متوازی کام، اجازت دی گئی تصاویر، DinD اختیارات، نیٹ ورک پالیسی، اور رجسٹریشن دائرہ کار سیٹ کرتے ہیں۔ مقصد ان کنٹرولز کو برقرار رکھنا ہے جبکہ غیر استعمال شدہ صلاحیت بخار ہو جائے — سادہ زبان والے ٹکسے کی طرح ہی اطمینان، اب RBAC، نامے جاتے (namespaces)، اور الگ رنر ریلیز کے ساتھ نافذ۔
13. کارکردی چیک لسٹ
- پین آپریٹر/شارٹ ورژنز؛ ضرورت پڑنے پر اپ گریڈ کریں۔
- رنر ٹوکنز گھمائیں؛ پبلش کرنے سے پہلے کسی بھی اسکرپٹ سے لیب ٹوکنز صاف کریں۔
- الگ نام سپیسز: GitLab سسٹم بمقابلہ رنر جابز۔
- دیکھیںپینڈنگپوڈز — بڑھتے ہوئے پینڈنگ کا مطلب یہ ہے کہ پیک میں کنکوریسینسی یا نود کی صلاحیت کم ہے۔
- دیکھیںخالی نود گھنٹے— رات بھر خالی رہنے والے نودز کا مطلب یہ ہے کہ اسکیل ڈاؤن تاخیر ہے یا پول پالیسی کو ٹیوننگ کی ضرورت ہے۔
- پرائیویلیجڈ رنرز کو صرف ان جابز تک محدود رکھیں جنہیں ان کی ضرورت ہو۔
- GitLab کو رنر کی الیسٹیسٹیٹک سے آزاد طور پر بیک اپ کریں۔
- جب الیسٹک CI زندہ ہو تو ہفتے کے گھنٹے کے لحاظ سے بل کا جائزہ لیں — رات اور ہفتے کے دن نمایاں طور پر گرنے چاہئیں۔
14. یہ کس کے لیے ہے
- پلیٹ فارم انجینئرز اور SREs جو GitLab CI کو Kubernetes پر لاگو کر رہے ہیں۔
- DevOps لیڈز جو کھڑے رنر وی ایمز کو ایکزیکیٹر پوڈز سے بدل رہے ہیں۔
- انجینئرنگ اور فنانس پارٹنرز جو CI کو استعمال کی بنیاد پر یوٹیلیٹی جیسا چلنے کی ضرورت محسوس کرتے ہیں، نہ کہ فرنیچر۔
15. سرکاری GitLab دستاویزات
یہ صفحات اوپر بیان کردہ Helm ڈیپلویمنٹس اور اسکیلنگ رویے کے لیے معیاری حوالے ہیں۔ جب ورژنز تبدیل ہوں تو انہیں بلاگ پوسٹس سے ترجیح دیں۔
سرور GitLab پر Kubernetes
- آپریٹر GitLab انسٹال کریں— ٹریننگ واکتھرو میں استعمال ہونے والا آپریٹر + Helm انسٹال پتہ۔
- GitLab Helm چارٹس— چھتری چارٹ دستاویزات۔
- GitLab کو Helm چارٹ کے ساتھ انسٹال کریں— جب آپ چارٹس کے ذریعے GitLab ڈپلوی کرتے ہیں، نہ کہ آپریٹر کے ذریعے۔
- gitlab-runner سب چارٹ (GitLab چارٹ)— چلنے والا GitLab کے ساتھ بنیادی چارٹ میں شامل ہے (الگ تھلگ چلنے والے چارٹ سے مختلف)۔
GitLab Runner Helm چارٹ
- GitLab Runner کو Helm چارٹ کے ساتھ انسٹال کریں—
helm repo add gitlab، انسٹال/اپ گریڈ، OCI چارٹ نوٹس۔ - GitLab Runner Helm چارٹ کی ترتیب کریں—
concurrent، ترتیب کے ٹیمپلیٹس، RBAC، کیشز، تصویر کے انتخاب۔ - gitlab-runner چارٹ
values.yaml— مکمل ڈیفالٹ ویلیوز (شامل اختیاری HPA اسٹب)۔
Kubernetes ایگزیکٹور اور خودکار پیمانہ بندی
- Kubernetes ایگزیکٹور— جاب پوڈز، مددگار، سروسز (جیسے DinD)، وسائل کی درخواستیں، RBAC فعل۔
- خودکار پیمانہ بندی کی ترتیب دیں (Kubernetes ایگزیکٹور / چارٹ)— پوڈز کو روکیں،
[runners.kubernetes.autoscaler]، دورانیہ پالیسیاں (رات/ہفتہ کے دن خالی)۔ - GitLab Runner کی خودکار پیمانہ بندی— عمومی خودکار پیمانہ بندی ماڈل (اس میں تقسیم شدہ کشش بھی شامل ہے)۔
- GitLab Runner فلیٹ کا منصوبہ بنائیں اور انتظام کریں— فلیٹ سطح کی پیمانہ بندی اور آپریشنز۔
- پیشرفت کی ترتیب (
config.toml)— عالمیconcurrentاور ایگزیکٹور سیکشنز جو Helmrunners.configمیں شامل ہیں۔
GitLab میں CI جابز، بلڈز، اور رنر سیٹنگز
- GitLab میں رنرز کی ترتیب دیں— رجسٹریشن، ٹیگز، run-untagged، محفوظ رنرز۔
- Docker کا استعمال CI میں امیجز بنانے کے لیے— DinD اور متبادل (جب
privileged/ Docker سروس رنر ویلیوز میں فعال ہو)۔
رات اور ہفتہ کے دن کے اخراجات کے کنٹرول کے لیے، درج ذیل کا مجموعہ کریں: (1) Kubernetes ایگزیکٹور جاب پوڈز جو صفر پر جائیں، (2) چارٹ
concurrentاور خودکار پیمانہ بندیپالیسیاںجو off-peakidle_count = 0پر ہوں، اور (3) کلัสٹر/نڈ آٹوسکیلنگ تاکہ خالی نڈز پول سے نکل جائیں — جیسا کہ سیکشنز 6–7 میں بیان کیا گیا ہے۔16. واپس ویڈیو اور ریپو میں مپنگ
یوٹیوب سیشن —تقریباً 20 منٹ میں مکمل GitLab۔ Kubernetes پر GitLab Runner ورک لوڈز کا خودکار پیمانہ (Autoscaling)— یہ GitLab کو Kubernetes پر، Helm کے ذریعے رنرز کو، اور ہائپرسکیل کوسٹ کہانی کو ظاہر کرتا ہے: ڈائنامک طور پر انفراسٹرکچر کی فراہمی اور اس سے ہٹاؤں تاکہ آپ خالی راتوں اور ہفتہ کے دنوں کے لیے پیک ریٹس نہیں ادا کر رہے ہوں۔ اس ریپو میں دیے گئے کورس بلڈ پرامپٹ
gitlab-runners-k3s-hyperscale-course.prompt.mdکا استعمال کریں، اور اوپر دی گئی سرکاری دستاویزات کو ورژنڈ سورس آف ٹروتھ کے طور پر استعمال کریں۔ اسی خیالات کی غیر تکنیکی ترتیب کے لیے دیکھیںخالی CI کے لیے پیسے نہ ادا کریں۔اختتام
Kubernetes صرف GitLab رنرز کو میزبان نہیں کرتا۔ مناسب طریقے سے استعمال کیا جائے تو یہ CI کی معاشیات کو تبدیل کر دیتا ہے:ضرورت پڑنے پر فراہم کریں، خالی ہونے پر ہٹائیں، جب انسان گھر جاتے ہیں تو CPU/رام/اسٹوریج واپس حاصل کریں۔ یہی ہائپرسکیل پیٹرن ہے — جو اس ٹیم کے لیے دستیاب ہے جو ایک قائم فلیٹ کو پوڈز کی قطار کے بدلے دینے کو تیار ہو۔
ویڈیو سے شروع کریں، لیب میں آپریٹر + رنر Helm کھڑا کریں، نوڈ خودکار پیمانہ (node autoscaling) آن کریں، پھر چیک کریں کہ کیا سبت کو آخر کار بل پر خاموشی نظر آتی ہے۔
شائع کیا گیاWorkstationسے۔