شیل آپریٹر کا آئیڈیا کافی آسان ہے: Kubernetes آبجیکٹ کے ایونٹس کو سبسکرائب کریں، اور جب یہ ایونٹس موصول ہوں تو ایک بیرونی پروگرام شروع کریں، اسے ایونٹ کے بارے میں معلومات فراہم کریں:
اس کی ضرورت اس وقت پیش آئی جب کلسٹرز کے آپریشن کے دوران چھوٹے چھوٹے کام نظر آنے لگے کہ ہم واقعی درست طریقے سے خودکار کرنا چاہتے ہیں۔ یہ تمام چھوٹے کام آسان باش اسکرپٹس کا استعمال کرتے ہوئے حل کیے گئے تھے، حالانکہ جیسا کہ آپ جانتے ہیں، آپریٹرز کو گولانگ میں لکھنا بہتر ہے۔ ظاہر ہے، ایسے ہر چھوٹے کام کے لیے آپریٹر کی مکمل ترقی میں سرمایہ کاری بے اثر ہوگی۔
15 منٹ میں آپریٹر
آئیے ایک مثال دیکھیں کہ کبرنیٹس کلسٹر میں خودکار کیا جا سکتا ہے اور شیل آپریٹر کس طرح مدد کر سکتا ہے۔ ایک مثال درج ذیل ہو گی: ڈاکر رجسٹری تک رسائی کے لیے ایک راز کو نقل کرنا۔
پوڈز جو نجی رجسٹری سے تصاویر استعمال کرتے ہیں ان کے مینی فیسٹ میں رجسٹری تک رسائی کے لیے ڈیٹا کے ساتھ راز کا لنک ہونا چاہیے۔ پوڈز بنانے سے پہلے اس راز کو ہر نام کی جگہ میں بنانا ضروری ہے۔ یہ دستی طور پر کیا جا سکتا ہے، لیکن اگر ہم متحرک ماحول قائم کرتے ہیں، تو ایک درخواست کے لیے نام کی جگہ بہت زیادہ ہو جائے گی۔ اور اگر 2-3 درخواستیں بھی نہ ہوں... رازوں کی تعداد بہت زیادہ ہو جاتی ہے۔ اور راز کے بارے میں ایک اور بات: میں وقتاً فوقتاً رجسٹری تک رسائی کے لیے کلید کو تبدیل کرنا چاہوں گا۔ بالآخر، دستی آپریشنز ایک حل کے طور پر مکمل طور پر غیر موثر - ہمیں رازوں کی تخلیق اور اپ ڈیٹ کو خودکار کرنے کی ضرورت ہے۔
سادہ آٹومیشن
آئیے ایک شیل اسکرپٹ لکھتے ہیں جو ہر N سیکنڈ میں ایک بار چلتا ہے اور کسی خفیہ کی موجودگی کے لئے نام کی جگہوں کو چیک کرتا ہے، اور اگر کوئی راز نہیں ہے، تو یہ بن جاتا ہے۔ اس حل کا فائدہ یہ ہے کہ یہ کرون میں شیل اسکرپٹ کی طرح لگتا ہے - ایک کلاسک اور ہر ایک کے لیے قابل فہم نقطہ نظر۔ منفی پہلو یہ ہے کہ اس کے لانچوں کے درمیان وقفہ میں ایک نیا نام کی جگہ بنائی جا سکتی ہے اور کچھ وقت کے لیے یہ راز کے بغیر رہے گا، جس سے پوڈز کو لانچ کرنے میں غلطیاں پیدا ہوں گی۔
شیل آپریٹر کے ساتھ آٹومیشن
ہمارے اسکرپٹ کو صحیح طریقے سے کام کرنے کے لیے، کلاسک کرون لانچ کو لانچ سے تبدیل کرنے کی ضرورت ہے جب نام کی جگہ شامل کی جائے: اس صورت میں، آپ اسے استعمال کرنے سے پہلے ایک راز بنا سکتے ہیں۔ آئیے دیکھتے ہیں کہ شیل آپریٹر کا استعمال کرتے ہوئے اسے کیسے نافذ کیا جائے۔
سب سے پہلے، اسکرپٹ کو دیکھتے ہیں. شیل آپریٹر کی اصطلاحات میں اسکرپٹ کو ہکس کہتے ہیں۔ ہر ہک جب جھنڈے کے ساتھ چلتا ہے۔ --config شیل آپریٹر کو اس کی پابندیوں کے بارے میں مطلع کرتا ہے، یعنی کن واقعات پر اسے شروع کیا جانا چاہئے۔ ہمارے معاملے میں ہم استعمال کریں گے۔ onKubernetesEvent:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
fi
یہاں بیان کیا گیا ہے کہ ہم واقعات کو شامل کرنے میں دلچسپی رکھتے ہیں (addقسم کی اشیاء namespace.
اب آپ کو اس کوڈ کو شامل کرنے کی ضرورت ہے جو واقعہ کے پیش آنے پر عمل میں لایا جائے گا:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
# конфигурация
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
else
# реакция:
# узнать, какой namespace появился
createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
# создать в нём нужный секрет
kubectl create -n ${createdNamespace} -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
...
data:
...
EOF
fi
زبردست! نتیجہ ایک چھوٹا، خوبصورت اسکرپٹ تھا۔ اسے "دوبارہ زندہ" کرنے کے لیے، دو مراحل باقی ہیں: تصویر تیار کریں اور اسے کلسٹر میں لانچ کریں۔
ہک کے ساتھ تصویر تیار کرنا
اگر آپ اسکرپٹ کو دیکھتے ہیں، تو آپ دیکھ سکتے ہیں کہ کمانڈز استعمال کیے گئے ہیں۔ kubectl и jq. اس کا مطلب یہ ہے کہ امیج میں درج ذیل چیزیں ہونی چاہئیں: ہمارا ہک، ایک شیل آپریٹر جو واقعات کی نگرانی کرے گا اور ہک کو چلائے گا، اور ہک (kubectl اور jq) کے ذریعے استعمال ہونے والی کمانڈز۔ Hub.docker.com کے پاس پہلے سے ہی ایک ریڈی میڈ امیج ہے جس میں شیل آپریٹر، کیوبیکٹل اور جے کیو پیک کیا گیا ہے۔ جو کچھ باقی ہے وہ ایک سادہ ہک شامل کرنا ہے۔ Dockerfile:
آئیے ہک کو دوبارہ دیکھتے ہیں اور اس بار لکھیں کہ یہ کلسٹر میں کون سے اعمال اور کن چیزوں کے ساتھ انجام دیتا ہے:
نام کی جگہ تخلیق کے واقعات کو سبسکرائب کرتا ہے؛
نام کی جگہوں میں اس کے علاوہ جہاں اسے لانچ کیا گیا ہے ایک راز بناتا ہے۔
اس سے پتہ چلتا ہے کہ جس پوڈ میں ہماری تصویر لانچ کی جائے گی اس کے پاس یہ کارروائیاں کرنے کی اجازت ہونی چاہیے۔ یہ آپ کا اپنا سروس اکاؤنٹ بنا کر کیا جا سکتا ہے۔ اجازت کلسٹر رول اور کلسٹر رول بائنڈنگ کی شکل میں ہونی چاہیے، کیونکہ ہم پورے کلسٹر کی اشیاء میں دلچسپی رکھتے ہیں۔
بس اتنا ہے: شیل آپریٹر شروع کرے گا، نام کی جگہ بنانے کے واقعات کو سبسکرائب کرے گا اور ضرورت پڑنے پر ہک چلائے گا۔
اس طرح، ایک سادہ شیل اسکرپٹ Kubernetes کے لیے ایک حقیقی آپریٹر میں بدل گیا۔ اور ایک کلسٹر کے حصے کے طور پر کام کرتا ہے۔ اور یہ سب گولانگ میں آپریٹرز کی ترقی کے پیچیدہ عمل کے بغیر:
اس سلسلے میں ایک اور مثال ہے...
ہم مندرجہ ذیل اشاعتوں میں سے کسی ایک میں اس کے معنی کو مزید تفصیل سے ظاہر کریں گے۔
فلٹرنگ
اشیاء کا سراغ لگانا اچھا ہے، لیکن اکثر اس پر ردعمل ظاہر کرنے کی ضرورت ہوتی ہے۔ کچھ آبجیکٹ کی خصوصیات کو تبدیل کرنامثال کے طور پر، تعیناتی میں نقل کی تعداد کو تبدیل کرنے یا آبجیکٹ لیبلز کو تبدیل کرنے کے لیے۔
جب کوئی واقعہ آتا ہے، شیل آپریٹر کو آبجیکٹ کا JSON مینی فیسٹ ملتا ہے۔ ہم ان خصوصیات کو منتخب کرسکتے ہیں جو اس JSON میں ہماری دلچسپی رکھتے ہیں اور ہک چلا سکتے ہیں۔ صرف جب وہ بدل جاتے ہیں. اس کے لیے ایک میدان ہے۔ jqFilter، جہاں آپ کو jq اظہار کی وضاحت کرنے کی ضرورت ہے جو JSON مینی فیسٹ پر لاگو ہوگا۔
مثال کے طور پر، تعیناتی اشیاء کے لیبل میں تبدیلیوں کا جواب دینے کے لیے، آپ کو فیلڈ کو فلٹر کرنے کی ضرورت ہے۔ labels میدان سے metadata. تشکیل اس طرح ہوگی:
ایک چھوٹا سا اختلاف: ہاں، شیل آپریٹر سپورٹ کرتا ہے۔ کرونٹاب اسٹائل اسکرپٹس چل رہا ہے۔. مزید تفصیلات میں مل سکتی ہیں۔ دستاویزات.
یہ تمیز کرنے کے لیے کہ ہک کیوں لانچ کیا گیا، شیل آپریٹر ایک عارضی فائل بناتا ہے اور ہک کے متغیر میں اس کا راستہ پاس کرتا ہے۔ BINDING_CONTEXT_TYPE. فائل میں ہک چلانے کی وجہ کی JSON تفصیل ہے۔ مثال کے طور پر، ہر 10 منٹ میں ہک درج ذیل مواد کے ساتھ چلے گا:
کھیتوں کے مواد کو ان کے ناموں سے سمجھا جا سکتا ہے، اور مزید تفصیلات اس میں پڑھی جا سکتی ہیں۔ دستاویزات. فیلڈ سے وسائل کا نام حاصل کرنے کی ایک مثال resourceName jq کا استعمال پہلے ہی ایک ہک میں دکھایا گیا ہے جو راز کو نقل کرتا ہے:
jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH
آپ اسی طرح دوسرے فیلڈز حاصل کرسکتے ہیں۔
اس کے بعد کیا ہے؟
پروجیکٹ کے ذخیرے میں، میں /examples ڈائریکٹریز، ہکس کی مثالیں ہیں جو کلسٹر پر چلنے کے لئے تیار ہیں۔ اپنے ہکس لکھتے وقت، آپ انہیں بنیاد کے طور پر استعمال کرسکتے ہیں۔
Prometheus کا استعمال کرتے ہوئے میٹرکس کو جمع کرنے کے لیے تعاون موجود ہے - دستیاب میٹرکس کو سیکشن میں بیان کیا گیا ہے۔ میٹرکس.
جیسا کہ آپ اندازہ لگا سکتے ہیں، شیل آپریٹر گو میں لکھا گیا ہے اور اوپن سورس لائسنس (Apache 2.0) کے تحت تقسیم کیا گیا ہے۔ ہم کسی بھی ترقیاتی امداد کے شکر گزار ہوں گے۔ GitHub پر پروجیکٹ: اور ستارے، اور مسائل، اور پل کی درخواستیں۔
رازداری کا پردہ اٹھاتے ہوئے، ہم آپ کو یہ بھی بتائیں گے کہ شیل آپریٹر ہے۔ چھوٹا ہمارے سسٹم کا وہ حصہ جو Kubernetes کلسٹر میں انسٹال کردہ ایڈ آنز کو اپ ٹو ڈیٹ رکھ سکتا ہے اور مختلف خودکار کارروائیاں کر سکتا ہے۔ اس نظام کے بارے میں مزید پڑھیں بتایا لفظی طور پر پیر کو سینٹ پیٹرزبرگ میں HighLoad++ 2019 میں - ہم جلد ہی اس رپورٹ کی ویڈیو اور ٹرانسکرپٹ شائع کریں گے۔
ہمارے پاس اس سسٹم کے باقی حصوں کو کھولنے کا منصوبہ ہے: ایڈون آپریٹر اور ہمارے ہکس اور ماڈیولز کا مجموعہ۔ ویسے ایڈون آپریٹر پہلے سے ہی ہے۔ گیتوب پر دستیاب ہے۔، لیکن اس کے لیے دستاویزات ابھی بھی راستے میں ہیں۔ ماڈیولز کے مجموعہ کی رہائی کا منصوبہ موسم گرما کے لیے بنایا گیا ہے۔