هي آرٽيڪل توهان کي سمجهڻ ۾ مدد ڏيندو ته ڪبرنيٽس ۾ لوڊ بيلنس ڪيئن ڪم ڪندو آهي، ڇا ٿيندو آهي جڏهن ڊگھي رهندڙ ڪنيڪشنن کي اسڪيل ڪيو ويندو آهي، ۽ جيڪڏهن توهان HTTP/2، gRPC، RSockets، AMQP، يا ٻيا ڊگھي زندگي پروٽوڪول استعمال ڪندا آهيو ته توهان کي ڪلائنٽ سائڊ بيلنسنگ تي ڇو غور ڪرڻ گهرجي. .
ڪبرنيٽس ۾ ٽرئفڪ کي ٻيهر ورهائڻ بابت ٿورڙو
ڪبرنيٽس ايپليڪيشنن کي ترتيب ڏيڻ لاءِ ٻه آسان خلاصا فراهم ڪري ٿو: خدمتون ۽ ترتيبون.
تعیناتيون بيان ڪن ٿيون ته توهان جي ايپليڪيشن جون ڪيتريون ڪاپيون ڪنهن به وقت تي هلڻ گهرجن. هر ايپليڪيشن کي پوڊ طور لڳايو ويو آهي ۽ هڪ IP پتو لڳايو ويو آهي.
خدمتون لوڊ بيلنس جي ڪم ۾ ساڳيون آهن. اهي ٺهيل آهن ٽرئفڪ کي ورهائڻ لاءِ ڪيترن ئي پوڊن ۾.
اچو ته ڏسو ته اهو ڇا ٿو لڳي.
هيٺ ڏنل آريگرام ۾ توهان هڪ ئي ايپليڪيشن جا ٽي مثال ۽ لوڊ بيلنس ڏسي سگهو ٿا:
لوڊ بيلنس کي خدمت سڏيو ويندو آهي ۽ هڪ IP پتو لڳايو ويو آهي. ڪا به ايندڙ درخواست پوڊ مان هڪ ڏانهن موڪلي وئي آهي:
ترتيب ڏيڻ واري صورتحال ايپليڪيشن جي مثالن جو تعداد طئي ڪري ٿي. توهان کي تقريبن ڪڏهن به سڌو سنئون هيٺ نه وڌائڻو پوندو:
هر پوڊ کي پنهنجو IP پتو لڳايو ويو آهي:
IP پتي جي مجموعن جي طور تي خدمتن کي سوچڻ لاء مفيد آهي. هر دفعي توهان خدمت تائين رسائي ڪريو ٿا، IP پتي مان هڪ فهرست مان چونڊيو ويو آهي ۽ منزل جي پتي طور استعمال ڪيو ويندو آهي.
اهو ڏسڻ ۾ اچي ٿو.
هڪ curl 10.96.45.152 درخواست ملي ٿي خدمت ڏانهن:
خدمت منزل جي طور تي ٽن پوڊ پتي مان هڪ کي چونڊيندو آهي:
ٽرئفڪ کي هڪ مخصوص پوڊ ڏانهن منتقل ڪيو ويو آهي:
جيڪڏهن توهان جي درخواست هڪ فرنٽ اينڊ ۽ هڪ پس منظر تي مشتمل آهي، ته پوءِ توهان وٽ هر هڪ لاءِ هڪ خدمت ۽ هڪ مقرري هوندي.
جڏهن فرنٽ اينڊ پس منظر کي درخواست ڪري ٿو، ان کي اهو ڄاڻڻ جي ضرورت ناهي ته پس منظر ۾ ڪيترا پوڊ ڪم ڪري ٿو: اتي هڪ، ڏهه، يا سئو ٿي سگهي ٿو.
انهي سان گڏ، فرنٽ اينڊ کي پوڊ جي پتي جي باري ۾ ڪجھ به نه ڄاڻندو آهي پس منظر جي خدمت ڪندي.
جڏهن فرنٽ اينڊ هڪ درخواست ڪري ٿو پس منظر ڏانهن، اهو استعمال ڪري ٿو IP پتي جو پس منظر سروس، جيڪو تبديل نٿو ڪري.
اهو ڪيئن ڏسڻ ۾ اچي ٿو.
1 جي تحت اندروني پس منظر جزو جي درخواست ڪري ٿو. پس منظر لاءِ هڪ مخصوص چونڊڻ بدران، اها خدمت لاءِ درخواست ڪري ٿي:
خدمت ھڪڙي ھڪڙي پس منظر واري پوڊ کي منزل جي پتي جي طور تي چونڊيندي آھي:
جيڪڏهن فرنٽ اينڊ موڪلي ٿو 100 درخواستون في سيڪنڊ پس منظر ڏانهن، پوءِ 100 مختلف TCP ڪنيڪشن کوليا ۽ بند ڪيا ويندا.
توهان هڪ TCP ڪنيڪشن کولڻ ۽ ان کي ايندڙ سڀني HTTP درخواستن لاءِ استعمال ڪندي درخواست جي پروسيسنگ وقت ۽ لوڊ کي گهٽائي سگهو ٿا.
HTTP پروٽوڪول ۾ هڪ خاصيت آهي جنهن کي HTTP Keep-alive، يا ڪنيڪشن ٻيهر استعمال ڪيو ويندو آهي. انهي صورت ۾، هڪ واحد TCP ڪنيڪشن ڪيترن ئي HTTP درخواستن ۽ جوابن کي موڪلڻ ۽ وصول ڪرڻ لاءِ استعمال ڪيو ويندو آهي:
ھي خصوصيت ڊفالٽ طور فعال نه ڪئي وئي آھي: ٻئي سرور ۽ ڪلائنٽ کي ترتيب ڏنل ھجڻ گھرجي.
ڇا ٿيندو جيڪڏهن اسان ڪبرنيٽس سروس ۾ Keep-alive استعمال ڪريون؟
اچو ته فرض ڪريون ته ٻئي فرنٽ اينڊ ۽ پس منظر جي حمايت زندهه رکو.
اسان وٽ فرنٽ اينڊ جي هڪ ڪاپي ۽ پسمنظر جون ٽي ڪاپيون آهن. فرنٽ اينڊ پهرين درخواست ڪري ٿو ۽ کولي ٿو TCP ڪنيڪشن کي پس منظر ڏانهن. درخواست خدمت تائين پهچندي آهي، پسمانده پوڊ مان هڪ کي منزل جي پتي طور چونڊيو ويندو آهي. پس منظر هڪ جواب موڪلي ٿو، ۽ فرنٽ اينڊ ان کي وصول ڪري ٿو.
معمولي صورتحال جي برعڪس جتي جواب ملڻ کان پوءِ TCP ڪنيڪشن بند ڪيو وڃي ٿو، ان کي هاڻي وڌيڪ HTTP درخواستن لاءِ کليل رکيو ويو آهي.
جيئن ته سڀئي ايندڙ درخواستون اڳ ۾ ئي کليل TCP ڪنيڪشن تي آهن، iptables ضابطن کي هاڻي نه سڏيو ويندو آهي.
اچو ته ڏسو ته اهو ڇا ٿو لڳي.
پهرين پوڊ سروس ڏانهن هڪ درخواست موڪلي ٿو:
توهان اڳ ۾ ئي ڄاڻو ٿا ته اڳتي ڇا ٿيندو. خدمت موجود ناهي، پر اتي موجود آهن iptables ضابطا جيڪي درخواست تي عمل ڪندا:
ھڪڙي پس منظر واري پوڊ کي منزل جي پتي طور چونڊيو ويندو:
درخواست پوڊ تائين پهچي ٿي. هن نقطي تي، ٻن پوڊ جي وچ ۾ هڪ مسلسل TCP ڪنيڪشن قائم ڪيو ويندو:
پهرين پوڊ کان ايندڙ ڪنهن به درخواست اڳ ۾ ئي قائم ڪيل ڪنيڪشن ذريعي ويندي:
نتيجو تيز جوابي وقت ۽ اعليٰ ذريعي آهي، پر توهان پس منظر کي ماپڻ جي صلاحيت وڃائي ڇڏيو.
جيتوڻيڪ توهان وٽ پس منظر ۾ ٻه پوڊ آهن، مسلسل ڪنيڪشن سان، ٽرئفڪ هميشه انهن مان هڪ ڏانهن ويندي.
thisا اهو درست ٿي سگهي ٿو؟
جيئن ته ڪبرنيٽس کي خبر ناهي ته مسلسل ڪنيڪشن کي ڪيئن توازن ڪجي، اهو ڪم توهان تي پوي ٿو.
خدمتون IP پتي ۽ بندرگاهن جو مجموعو آهن جن کي آخري پوائنٽ سڏيو ويندو آهي.
توهان جي ايپليڪيشن سروس مان آخري پوائنٽن جي هڪ فهرست حاصل ڪري سگهي ٿي ۽ فيصلو ڪري سگهي ٿي ته انهن جي وچ ۾ درخواستون ڪيئن ورهائجن. توھان ھر پوڊ سان مسلسل ڪنيڪشن کولي سگھو ٿا ۽ انھن ڪنيڪشنن جي وچ ۾ بيلنس جي درخواستن کي گول-روبن استعمال ڪندي.
جڏهن هڪ درخواست ڪرڻ جي ضرورت آهي، استعمال ڪريو کليل ڪنيڪشن مان هڪ.
آخري پوائنٽن جي لسٽ کي باقاعده طور تي تازه ڪاري ڪريو، نوان ٺاھيو يا پراڻا لڳاتار ڪنيڪشن بند ڪريو جيڪڏھن لسٽ تبديل ٿي وڃي.
اھو اھو آھي جيڪو اھو نظر ايندو.
خدمت ڏانهن درخواست موڪلڻ واري پهرين پوڊ جي بدران، توهان ڪلائنٽ جي طرف درخواستن کي بيلنس ڪري سگهو ٿا:
توهان کي ڪوڊ لکڻ جي ضرورت آهي جيڪو پڇي ٿو ته ڪهڙا پوڊ سروس جو حصو آهن:
هڪ دفعو توهان وٽ لسٽ آهي، ان کي ڪلائنٽ جي پاسي تي محفوظ ڪريو ۽ پوڊ سان ڳنڍڻ لاء استعمال ڪريو:
توهان لوڊ بيلنسنگ الگورتھم جا ذميوار آهيو:
هاڻي سوال پيدا ٿئي ٿو: ڇا اهو مسئلو صرف HTTP کي زنده رکڻ تي لاڳو ٿئي ٿو؟
ڪلائنٽ طرف لوڊ توازن
HTTP واحد پروٽوڪول نه آهي جيڪو استعمال ڪري سگهي ٿو مسلسل TCP ڪنيڪشن.
جيڪڏهن توهان جي ايپليڪيشن ڊيٽابيس استعمال ڪري ٿي، ته پوءِ هڪ TCP ڪنيڪشن نه کوليندو آهي هر وقت توهان کي ڊيٽابيس مان ڪا درخواست ڪرڻ يا ٻيهر حاصل ڪرڻ جي ضرورت آهي.
ان جي بدران، ڊيٽابيس سان مسلسل TCP ڪنيڪشن کوليو ۽ استعمال ڪيو ويو آهي.
جيڪڏهن توهان جو ڊيٽابيس ڪبرنيٽس تي لڳايو ويو آهي ۽ رسائي هڪ خدمت جي طور تي مهيا ڪئي وئي آهي، ته پوءِ توهان ساڳئي مسئلن کي منهن ڏيندا جيڪي اڳئين حصي ۾ بيان ڪيا ويا آهن.
ھڪڙي ڊيٽابيس جي نقل ٻين کان وڌيڪ لوڊ ٿي ويندي. Kube-proxy ۽ Kubernetes ڪنيڪشن کي توازن ۾ مدد نه ڪندا. توهان کي خيال رکڻ گهرجي ته سوالن کي توهان جي ڊيٽابيس ۾ بيلنس ڪرڻ.
ڊيٽابيس سان ڳنڍڻ لاءِ توهان ڪهڙي لائبريري استعمال ڪندا آهيو ان تي منحصر ڪري، توهان وٽ هن مسئلي کي حل ڪرڻ لاءِ مختلف آپشن هوندا.
هيٺ Node.js مان MySQL ڊيٽابيس ڪلستر تائين رسائي جو هڪ مثال آهي:
var mysql = require('mysql');
var poolCluster = mysql.createPoolCluster();
var endpoints = /* retrieve endpoints from the Service */
for (var [index, endpoint] of endpoints) {
poolCluster.add(`mysql-replica-${index}`, endpoint);
}
// Make queries to the clustered MySQL database
ٻيا ڪيترائي پروٽوڪول آھن جيڪي مسلسل TCP ڪنيڪشن استعمال ڪن ٿا:
WebSockets ۽ محفوظ WebSockets
HTTP / 2
جي آر پي سي
RSockets
ايم پي پي
توھان کي انھن مان گھڻا پروٽوڪول کان واقف ٿيڻ گھرجي.
پر جيڪڏهن اهي پروٽوڪول تمام مشهور آهن، اتي هڪ معياري توازن حل ڇو نه آهي؟ ڪلائنٽ منطق کي تبديل ڪرڻ جي ضرورت ڇو آهي؟ ڇا ھڪڙو اصلي Kubernetes حل آھي؟
Kube-proxy ۽ iptables ٺهيل آهن اڪثر عام استعمال جي ڪيسن کي ڍڪڻ لاءِ جڏهن ڪبرنيٽس کي ترتيب ڏيو. هي سهولت لاءِ آهي.
جيڪڏهن توهان هڪ ويب سروس استعمال ڪري رهيا آهيو جيڪا هڪ REST API کي ظاهر ڪري ٿي، توهان قسمت ۾ آهيو - انهي صورت ۾، مسلسل TCP ڪنيڪشن استعمال نه ڪيا ويا آهن، توهان ڪنهن به ڪبرنيٽس سروس استعمال ڪري سگهو ٿا.
پر هڪ دفعو توهان لڳاتار TCP ڪنيڪشن استعمال ڪرڻ شروع ڪيو، توهان کي اهو معلوم ڪرڻو پوندو ته لوڊ کي پس منظر ۾ هڪجهڙائي سان ڪيئن ورهايو وڃي. ڪبرنيٽس هن ڪيس لاءِ تيار ڪيل حل تي مشتمل ناهي.
پهرين ٽي خدمتون هڪ مجازي IP پتي جي بنياد تي هلن ٿيون، جيڪو iptables قاعدن کي ٺاهڻ لاء kube-proxy پاران استعمال ڪيو ويندو آهي. پر سڀني خدمتن جو بنيادي بنياد بغير سر جي خدمت آهي.
هيڊ بيس سروس ان سان لاڳاپيل ڪو به IP پتو نه آهي ۽ صرف IP پتي جي فهرست ۽ ان سان لاڳاپيل پوڊس (آخري پوائنٽس) جي بندرگاهن کي ٻيهر حاصل ڪرڻ لاءِ هڪ ميکانيزم مهيا ڪري ٿي.
سڀئي خدمتون سر جي بغير خدمت تي ٻڌل آهن.
ClusterIP سروس ڪجھ اضافن سان گڏ ھڪڙو بي سر سروس آھي:
انتظامي پرت ان کي هڪ IP پتو تفويض ڪري ٿو.
Kube-proxy ضروري iptables ضابطا ٺاهي ٿو.
هن طريقي سان توهان kube-proxy کي نظر انداز ڪري سگهو ٿا ۽ سڌو سنئون استعمال ڪري سگهو ٿا آخري پوائنٽس جي لسٽ حاصل ڪيل هيڊ لیس سروس مان توهان جي ايپليڪيشن کي بيلنس لوڊ ڪرڻ لاءِ.
پر اسان ڪلستر ۾ مقرر ڪيل سڀني ايپليڪيشنن ۾ ساڳيو منطق ڪيئن شامل ڪري سگهون ٿا؟
جيڪڏهن توهان جي اپليڪيشن اڳ ۾ ئي ترتيب ڏني وئي آهي، اهو ڪم ناممڪن لڳي سگهي ٿو. تنهن هوندي به، اتي هڪ متبادل اختيار آهي.