پرو ہوسٹر > بلاگ > انتظامیہ > کبرنیٹس میں نیٹ ورکنگ کے لیے کیلیکو: ایک تعارف اور تھوڑا سا تجربہ
کبرنیٹس میں نیٹ ورکنگ کے لیے کیلیکو: ایک تعارف اور تھوڑا سا تجربہ
مضمون کا مقصد قارئین کو Kubernetes میں نیٹ ورکنگ اور نیٹ ورک کی پالیسیوں کے انتظام کی بنیادی باتوں کے ساتھ ساتھ تھرڈ پارٹی کیلیکو پلگ ان سے متعارف کرانا ہے جو معیاری صلاحیتوں کو بڑھاتا ہے۔ راستے میں، ہمارے آپریٹنگ تجربے سے حقیقی مثالوں کا استعمال کرتے ہوئے ترتیب کی آسانی اور کچھ خصوصیات کا مظاہرہ کیا جائے گا۔
اس مضمون کے تناظر میں، یہ نوٹ کرنا ضروری ہے کہ K8s خود کنٹینرز اور نوڈس کے درمیان نیٹ ورک کنیکٹیویٹی کے لیے ذمہ دار نہیں ہے: اس کے لیے، مختلف CNI پلگ انز (کنٹینر نیٹ ورکنگ انٹرفیس)۔ اس تصور کے بارے میں مزید ہم انہوں نے مجھے بھی بتایا.
مثال کے طور پر، ان پلگ ان میں سب سے زیادہ عام ہے۔ فلالین - تمام کلسٹر نوڈس کے درمیان مکمل نیٹ ورک کنیکٹیویٹی فراہم کرتا ہے ہر نوڈ پر پل بڑھا کر، اس کو سب نیٹ تفویض کر کے۔ تاہم، مکمل اور غیر منظم رسائی ہمیشہ فائدہ مند نہیں ہوتی۔ کلسٹر میں کسی قسم کی کم سے کم تنہائی کو یقینی بنانے کے لیے، فائر وال کی ترتیب میں مداخلت کرنا ضروری ہے۔ عام صورت میں، اسے اسی CNI کے کنٹرول میں رکھا جاتا ہے، یہی وجہ ہے کہ iptables میں فریق ثالث کی مداخلت کی غلط تشریح کی جا سکتی ہے یا اسے یکسر نظر انداز کیا جا سکتا ہے۔
اور Kubernetes کلسٹر میں نیٹ ورک پالیسی مینجمنٹ کو منظم کرنے کے لیے "آؤٹ آف دی باکس" فراہم کیا گیا ہے۔ نیٹ ورک پالیسی API. یہ وسیلہ، منتخب کردہ نام کی جگہوں پر تقسیم کیا گیا ہے، اس میں ایک ایپلیکیشن سے دوسری تک رسائی میں فرق کرنے کے اصول شامل ہو سکتے ہیں۔ یہ آپ کو مخصوص پوڈز، ماحولیات (نام کی جگہوں) یا IP پتوں کے بلاکس کے درمیان رسائی کو ترتیب دینے کی بھی اجازت دیتا ہے:
یہ اس کی سب سے قدیم مثال نہیں ہے۔ سرکاری دستاویزات نیٹ ورک کی پالیسیاں کیسے کام کرتی ہیں اس کی منطق کو سمجھنے کی خواہش کی حوصلہ شکنی کر سکتا ہے۔ تاہم، ہم پھر بھی نیٹ ورک کی پالیسیوں کا استعمال کرتے ہوئے ٹریفک کے بہاؤ پر کارروائی کرنے کے بنیادی اصولوں اور طریقوں کو سمجھنے کی کوشش کریں گے...
یہ منطقی ہے کہ ٹریفک کی 2 قسمیں ہیں: پوڈ میں داخل ہونا (انگریس) اور اس سے باہر جانا (ایگریس)۔
دراصل سیاست کو تحریک کی سمت کی بنیاد پر ان 2 زمروں میں تقسیم کیا گیا ہے۔
اگلی مطلوبہ صفت سلیکٹر ہے؛ وہ جس پر اصول لاگو ہوتا ہے۔ یہ پوڈ (یا پھلیوں کا ایک گروپ) یا ماحول (یعنی نام کی جگہ) ہو سکتا ہے۔ ایک اہم تفصیل: ان اشیاء کی دونوں اقسام میں ایک لیبل ہونا ضروری ہے (لیبل Kubernetes اصطلاحات میں) - یہ وہ ہیں جن کے ساتھ سیاست دان کام کرتے ہیں۔
کسی نہ کسی قسم کے لیبل کے ذریعے متحد ہونے والے منتخب کنندگان کی محدود تعداد کے علاوہ، مختلف تغیرات میں "Allow/deny everything/everyone" جیسے اصول لکھنا ممکن ہے۔ اس مقصد کے لئے، فارم کی تعمیرات کا استعمال کیا جاتا ہے:
کلسٹر کے لیے CNI پلگ ان کے انتخاب پر واپس جانا، یہ بات قابل غور ہے۔ ہر نیٹ ورک پلگ ان نیٹ ورک پالیسی کو سپورٹ نہیں کرتا ہے۔. مثال کے طور پر، پہلے ہی ذکر کردہ فلالین نیٹ ورک کی پالیسیوں کو ترتیب دینے کا طریقہ نہیں جانتا ہے، جو یہ براہ راست کہا جاتا ہے سرکاری ذخیرے میں۔ وہاں ایک متبادل کا بھی ذکر کیا گیا ہے - ایک اوپن سورس پروجیکٹ کیلیکو۔، جو نیٹ ورک کی پالیسیوں کے لحاظ سے Kubernetes APIs کے معیاری سیٹ کو نمایاں طور پر پھیلاتا ہے۔
کیلیکو کو جاننا: تھیوری
کیلیکو پلگ ان کو فلالین کے ساتھ انضمام میں استعمال کیا جا سکتا ہے (سب پروجیکٹ چینل) یا آزادانہ طور پر، نیٹ ورک کنیکٹیویٹی اور دستیابی کے انتظام کی صلاحیتوں دونوں کا احاطہ کرتا ہے۔
K8s "باکسڈ" حل اور Calico سے API سیٹ کا استعمال کیا مواقع فراہم کرتا ہے؟
نیٹ ورک پالیسی میں جو کچھ بنایا گیا ہے وہ یہ ہے:
سیاست دان ماحول سے محدود ہوتے ہیں۔
پالیسیاں لیبل کے ساتھ نشان زد پوڈز پر لاگو ہوتی ہیں۔
اصول پوڈز، ماحولیات یا ذیلی نیٹ پر لاگو کیے جا سکتے ہیں۔
قواعد میں پروٹوکول، نام یا علامتی بندرگاہ کی وضاحتیں شامل ہوسکتی ہیں۔
یہاں ہے کہ کیلیکو ان افعال کو کیسے بڑھاتا ہے:
پالیسیاں کسی بھی چیز پر لاگو کی جا سکتی ہیں: پوڈ، کنٹینر، ورچوئل مشین یا انٹرفیس؛
قواعد میں ایک مخصوص کارروائی شامل ہوسکتی ہے (ممانعت، اجازت، لاگنگ)؛
اصولوں کا ہدف یا ذریعہ ایک بندرگاہ، بندرگاہوں کی ایک رینج، پروٹوکول، HTTP یا ICMP کی خصوصیات، IP یا سب نیٹ (چوتھی یا چھٹی نسل)، کوئی بھی سلیکٹر (نوڈ، میزبان، ماحول) ہو سکتا ہے؛
مزید برآں، آپ DNAT سیٹنگز اور ٹریفک فارورڈنگ پالیسیوں کا استعمال کرتے ہوئے ٹریفک کے گزرنے کو ریگولیٹ کر سکتے ہیں۔
کیلیکو ریپوزٹری میں GitHub پر پہلی کمٹمنٹ جولائی 2016 کی ہے، اور ایک سال بعد پروجیکٹ نے Kubernetes نیٹ ورک کنیکٹیویٹی کو منظم کرنے میں ایک اہم مقام حاصل کیا - اس کا ثبوت مثال کے طور پر، سروے کے نتائج سے ملتا ہے، دی نیو اسٹیک کے ذریعہ منعقد کیا گیا۔:
کارکردگی کے طور پر، یہاں سب کچھ بہت اچھا ہے. اپنے پروڈکٹ کی جانچ میں، کیلیکو ڈیولپمنٹ ٹیم نے فلکیاتی کارکردگی کا مظاہرہ کیا، 50000 فزیکل نوڈس پر 500 سے زیادہ کنٹینرز چلاتے ہوئے 20 کنٹینرز فی سیکنڈ کی تخلیق کی شرح کے ساتھ۔ اسکیلنگ کے ساتھ کسی بھی مسئلے کی نشاندہی نہیں کی گئی۔ ایسے نتائج اعلان کیا گیا تھا پہلے ہی پہلے ورژن کے اعلان پر۔ تھرو پٹ اور وسائل کی کھپت پر توجہ مرکوز کرنے والے آزاد مطالعہ بھی اس بات کی تصدیق کرتے ہیں کہ کیلیکو کی کارکردگی تقریباً اتنی ہی اچھی ہے جتنی فلانیل کی ہے۔ مثال کے طور پر:
پروجیکٹ بہت تیزی سے ترقی کر رہا ہے، یہ K8s، OpenShift، OpenStack کے زیر انتظام مقبول حلوں میں کام کی حمایت کرتا ہے، کلسٹر کو استعمال کرتے وقت کیلیکو کو استعمال کرنا ممکن ہے۔ لات مارناسروس میش نیٹ ورکس کی تعمیر کے حوالے موجود ہیں (یہاں ایک مثال ہے Istio کے ساتھ مل کر استعمال کیا جاتا ہے)۔
کیلیکو کے ساتھ مشق کریں۔
ونیلا کبرنیٹس کے استعمال کے عمومی معاملے میں، CNI انسٹال کرنا فائل کو استعمال کرنے پر آتا ہے۔ calico.yaml, سرکاری ویب سائٹ سے ڈاؤن لوڈ کیا گیا۔، کے ذریعے kubectl apply -f.
ایک اصول کے طور پر، پلگ ان کا موجودہ ورژن Kubernetes کے تازہ ترین 2-3 ورژن کے ساتھ مطابقت رکھتا ہے: پرانے ورژن میں آپریشن کا تجربہ نہیں کیا جاتا ہے اور اس کی کوئی ضمانت نہیں ہے۔ ڈویلپرز کے مطابق، کیلیکو iptables یا IPVS کے اوپری حصے پر، CentOS 3.10، Ubuntu 7 یا Debian 16 پر چلنے والے 8 سے اوپر کے لینکس کرنل پر چلتا ہے۔
ماحول کے اندر تنہائی
ایک عام فہم کے لیے، آئیے یہ سمجھنے کے لیے ایک سادہ کیس کو دیکھتے ہیں کہ کیلیکو اشارے میں نیٹ ورک کی پالیسیاں معیاری پالیسیوں سے کس طرح مختلف ہیں اور قواعد بنانے کا طریقہ ان کی پڑھنے کی اہلیت اور ترتیب کی لچک کو کیسے آسان بناتا ہے:
کلسٹر میں 2 ویب ایپلیکیشنز تعینات ہیں: Node.js اور PHP میں، جن میں سے ایک Redis استعمال کرتی ہے۔ PHP سے Redis تک رسائی کو روکنے کے لیے، Node.js کے ساتھ رابطے کو برقرار رکھتے ہوئے، صرف درج ذیل پالیسی کا اطلاق کریں:
بنیادی طور پر ہم نے Node.js سے Redis پورٹ پر آنے والی ٹریفک کی اجازت دی۔ اور انہوں نے واضح طور پر کسی اور چیز کو منع نہیں کیا۔ جیسے ہی نیٹ ورک پالیسی ظاہر ہوتی ہے، اس میں مذکور تمام سلیکٹرز الگ تھلگ ہونے لگتے ہیں، جب تک کہ دوسری صورت میں اس کی وضاحت نہ کی جائے۔ تاہم، الگ تھلگ قوانین دیگر اشیاء پر لاگو نہیں ہوتے ہیں جن کا سلیکٹر کے ذریعے احاطہ نہیں کیا جاتا ہے۔
مثال استعمال کرتا ہے۔ apiVersion باکس سے باہر Kubernetes، لیکن کوئی بھی چیز آپ کو اسے استعمال کرنے سے نہیں روکتی کیلیکو ڈیلیوری سے اسی نام کا وسیلہ. وہاں کا نحو زیادہ مفصل ہے، اس لیے آپ کو مندرجہ بالا صورت کے لیے اصول کو درج ذیل شکل میں دوبارہ لکھنا ہو گا۔
ریگولر NetworkPolicy API کے ذریعے تمام ٹریفک کی اجازت دینے یا انکار کرنے کے لیے مذکورہ بالا تعمیرات قوسین کے ساتھ تعمیرات پر مشتمل ہیں جنہیں سمجھنا اور یاد رکھنا مشکل ہے۔ کیلیکو کے معاملے میں، فائر وال کے اصول کی منطق کو اس کے برعکس تبدیل کرنے کے لیے، صرف تبدیل کریں action: Allow پر action: Deny.
ماحول کے لحاظ سے تنہائی
اب اس صورت حال کا تصور کریں جہاں ایک ایپلیکیشن Prometheus میں جمع کرنے کے لیے بزنس میٹرکس اور گرافانا کا استعمال کرتے ہوئے مزید تجزیہ تیار کرتی ہے۔ اپ لوڈ میں حساس ڈیٹا ہو سکتا ہے، جو دوبارہ عوامی طور پر بطور ڈیفالٹ دیکھا جا سکتا ہے۔ آئیے اس ڈیٹا کو آنکھوں سے چھپاتے ہیں:
Prometheus، ایک اصول کے طور پر، ایک علیحدہ سروس ماحول میں رکھا جاتا ہے - مثال کے طور پر یہ نام کی جگہ اس طرح ہوگی:
فیلڈ metadata.labels یہ کوئی حادثہ نہیں نکلا۔ جیسا کہ اوپر درج ہے، namespaceSelector (اس کے ساتھ ساتھ podSelector) لیبل کے ساتھ کام کرتا ہے۔ لہذا، ایک مخصوص پورٹ پر تمام پوڈز سے میٹرکس لینے کی اجازت دینے کے لیے، آپ کو کسی قسم کا لیبل شامل کرنا ہوگا (یا موجودہ سے لینا ہوگا)، اور پھر کنفیگریشن کو لاگو کرنا ہوگا جیسے:
عام طور پر، مخصوص ضروریات کے لیے اس قسم کی پالیسیاں شامل کر کے، آپ کلسٹر میں ایپلی کیشنز کے آپریشن میں بدنیتی یا حادثاتی مداخلت سے حفاظت کر سکتے ہیں۔
کیلیکو کے تخلیق کاروں کے مطابق، بہترین عمل ہے "ہر چیز کو مسدود کریں اور اپنی ضرورت کو واضح طور پر کھولیں" نقطہ نظر، جس میں دستاویزی سرکاری دستاویزات (دوسرے بھی اسی طرح کے نقطہ نظر کی پیروی کرتے ہیں - خاص طور پر، میں پہلے ہی ذکر شدہ مضمون).
اضافی کیلیکو آبجیکٹ کا استعمال
میں آپ کو یاد دلاتا ہوں کہ Calico APIs کے توسیعی سیٹ کے ذریعے آپ نوڈس کی دستیابی کو ریگولیٹ کر سکتے ہیں، نہ کہ pods تک محدود۔ مندرجہ ذیل مثال میں استعمال کرتے ہوئے GlobalNetworkPolicy کلسٹر میں آئی سی ایم پی کی درخواستوں کو منتقل کرنے کی صلاحیت بند ہے (مثال کے طور پر، پوڈ سے نوڈ تک، پوڈ کے درمیان، یا نوڈ سے آئی پی پوڈ پر پنگ):
مذکورہ صورت میں، کلسٹر نوڈس کے لیے ICMP کے ذریعے ایک دوسرے تک "پہنچنا" اب بھی ممکن ہے۔ اور اس مسئلے کو ذرائع سے حل کیا جاتا ہے۔ GlobalNetworkPolicy، ایک ہستی پر لاگو کیا گیا۔ HostEndpoint:
آخر میں، میں قریب کلسٹر تعامل کے معاملے کے لیے کیلیکو فنکشنز کے استعمال کی ایک بہت ہی حقیقی مثال دوں گا، جب پالیسیوں کا ایک معیاری سیٹ کافی نہیں ہے۔ ویب ایپلیکیشن تک رسائی حاصل کرنے کے لیے، کلائنٹ ایک VPN ٹنل استعمال کرتے ہیں، اور اس رسائی کو سختی سے کنٹرول کیا جاتا ہے اور استعمال کے لیے اجازت دی گئی خدمات کی مخصوص فہرست تک محدود ہے:
کلائنٹ معیاری UDP پورٹ 1194 کے ذریعے VPN سے جڑتے ہیں اور جب منسلک ہوتے ہیں تو پوڈز اور سروسز کے کلسٹر سب نیٹس کے راستے حاصل کرتے ہیں۔ پورے ذیلی نیٹ کو آگے بڑھایا جاتا ہے تاکہ دوبارہ شروع کرنے اور پتے تبدیل کرنے پر خدمات ضائع نہ ہوں۔
کنفیگریشن میں پورٹ معیاری ہے، جو ایپلیکیشن کو کنفیگر کرنے اور اسے Kubernetes کلسٹر میں منتقل کرنے کے عمل پر کچھ باریکیاں عائد کرتی ہے۔ مثال کے طور پر، اسی AWS LoadBlancer میں UDP کے لیے پچھلے سال کے آخر میں خطوں کی ایک محدود فہرست میں لفظی طور پر ظاہر ہوا، اور NodePort کو تمام کلسٹر نوڈس پر فارورڈ کرنے کی وجہ سے استعمال نہیں کیا جا سکتا اور سرور کی مثالوں کی تعداد کو پیمانہ کرنا ناممکن ہے۔ غلطی رواداری کے مقاصد اس کے علاوہ، آپ کو بندرگاہوں کی ڈیفالٹ رینج کو تبدیل کرنا پڑے گا...
ممکنہ حل تلاش کرنے کے نتیجے میں، درج ذیل کا انتخاب کیا گیا:
وی پی این کے ساتھ پوڈز فی نوڈ میں شیڈول کیے گئے ہیں۔ hostNetwork، یعنی اصل IP پر۔
سروس کے ذریعے باہر پوسٹ کیا جاتا ہے۔ ClusterIP. نوڈ پر ایک پورٹ فزیکل طور پر انسٹال ہوتا ہے، جو باہر سے معمولی تحفظات (اصلی IP ایڈریس کی مشروط موجودگی) کے ساتھ قابل رسائی ہے۔
اس نوڈ کا تعین کرنا جس پر پھلی گلاب ہے ہماری کہانی کے دائرہ کار سے باہر ہے۔ میں صرف یہ کہوں گا کہ آپ سروس کو کسی نوڈ پر ہارڈ وائر کر سکتے ہیں یا ایک چھوٹی سائڈ کار سروس لکھ سکتے ہیں جو VPN سروس کے موجودہ IP ایڈریس کی نگرانی کرے گی اور کلائنٹس کے ساتھ رجسٹرڈ DNS ریکارڈز میں ترمیم کرے گی - جس کے پاس کافی تخیل ہے۔
روٹنگ کے نقطہ نظر سے، ہم VPN سرور کے ذریعہ جاری کردہ IP ایڈریس کے ذریعہ VPN کلائنٹ کی منفرد شناخت کر سکتے ہیں۔ ذیل میں اس طرح کے کلائنٹ کی خدمات تک رسائی کو محدود کرنے کی ایک ابتدائی مثال دی گئی ہے، جس کی مثال مذکورہ Redis پر دی گئی ہے:
یہاں، پورٹ 6379 سے منسلک ہونا سختی سے ممنوع ہے، لیکن ایک ہی وقت میں DNS سروس کے آپریشن کو محفوظ کیا جاتا ہے، جس کے کام کو اکثر قواعد تیار کرتے وقت متاثر ہوتا ہے. کیونکہ، جیسا کہ پہلے ذکر کیا گیا ہے، جب کوئی سلیکٹر ظاہر ہوتا ہے، ڈیفالٹ انکار پالیسی اس پر لاگو ہوتی ہے جب تک کہ دوسری صورت میں وضاحت نہ کی جائے۔
کے نتائج
اس طرح، Calico کے جدید API کا استعمال کرتے ہوئے، آپ لچکدار طریقے سے ترتیب دے سکتے ہیں اور کلسٹر کے اندر اور اس کے ارد گرد روٹنگ کو متحرک طور پر تبدیل کر سکتے ہیں۔ عام طور پر، اس کا استعمال ایک توپ سے چڑیوں کو گولی مارنے کی طرح نظر آتا ہے، اور BGP اور IP-IP سرنگوں کے ساتھ L3 نیٹ ورک کو لاگو کرنا فلیٹ نیٹ ورک پر سادہ Kubernetes انسٹالیشن میں خوفناک لگتا ہے۔ .
سیکورٹی کے تقاضوں کو پورا کرنے کے لیے کلسٹر کو الگ تھلگ کرنا ہمیشہ ممکن نہیں ہوتا، اور یہ وہ جگہ ہے جہاں Calico (یا اسی طرح کا حل) بچاؤ کے لیے آتا ہے۔ اس مضمون میں دی گئی مثالیں (معمولی ترمیم کے ساتھ) AWS میں ہمارے کلائنٹس کی کئی تنصیبات میں استعمال ہوتی ہیں۔