Istio سان microservices ڏانهن واپس. حصو 1

Istio سان microservices ڏانهن واپس. حصو 1

نوٽ. ترجمو: سروس ميشز يقيني طور تي هڪ لاڳاپيل حل بڻجي چڪا آهن جديد انفراسٽرڪچر ۾ ايپليڪيشنن لاءِ هيٺين مائڪرو سروس آرڪيٽيڪچر. جڏهن ته Istio ڪيترن ئي DevOps انجنيئرن جي لبن تي ٿي سگهي ٿو، اهو هڪ بلڪل نئين پيداوار آهي، جڏهن ته جامع صلاحيتن جي لحاظ کان اهو مهيا ڪري ٿو، شايد ان سان واقف ٿيڻ لاء هڪ اهم وقت جي ضرورت هجي. جرمن انجنيئر رينور مالوڪو، جيڪو ٽيليڪميونيڪيشن ڪمپني اورينج نيٽ ورڪ ۾ وڏن ڪلائنٽ لاءِ ڪلائوڊ ڪمپيوٽنگ جو ذميوار آهي، مواد جو هڪ شاندار سلسلو لکيو آهي، جيڪو توهان کي Istio ۾ تيزيءَ سان ۽ گهڻيءَ حد تائين لڪائڻ جي اجازت ڏئي ٿو. هو پنهنجي ڪهاڻي شروع ڪري ٿو ته Istio عام طور تي ڇا ڪري سگهي ٿو ۽ توهان ڪيئن جلدي پنهنجي اکين سان ڏسي سگهو ٿا.

استيو - هڪ اوپن سورس پروجيڪٽ گوگل، آئي بي ايم ۽ ليفٽ جي ٽيمن جي تعاون سان تيار ڪيو ويو. اهو پيچيدگين کي حل ڪري ٿو جيڪي مائڪرو سروسز تي ٻڌل ايپليڪيشنن ۾ پيدا ٿين ٿيون، جهڙوڪ:

  • ٽرئفڪ جو انتظام: وقت ختم ٿيڻ، ٻيهر ڪوششون، لوڊ توازن؛
  • حفاظت: آخر صارف جي تصديق ۽ اختيار؛
  • مشاهدو: جاچڻ، نگراني ڪرڻ، لاگنگ ڪرڻ.

اهي سڀ حل ٿي سگهن ٿا ايپليڪيشن جي سطح تي، پر ان کان پوءِ توهان جون خدمتون نه هونديون ”مائڪرو“. انهن مسئلن کي حل ڪرڻ لاءِ تمام اضافي ڪوشش ڪمپني وسيلن جو ضايع آهي جيڪو سڌو سنئون ڪاروباري قدر لاءِ استعمال ٿي سگهي ٿو. اچو ته هڪ مثال ڏسو:

پروجيڪٽ مئنيجر: موٽڻ جي خاصيت شامل ڪرڻ ۾ ڪيترو وقت وٺندو آهي؟
ڊولپر: ٻه اسپرنٽ.

ايم پي: ڇا؟... اهو صرف CRUD آهي!
R: CRUD ڪرڻ آسان حصو آهي، پر اسان کي اڃا تائين صارفين ۽ خدمتن جي تصديق ۽ اجازت ڏيڻ جي ضرورت آهي. جيئن ته نيٽ ورڪ ناقابل اعتبار آهي، توهان کي بار بار درخواستون لاڳو ڪرڻ جي ضرورت پوندي، انهي سان گڏ سرڪٽ برڪر جو نمونو گراهڪن ۾. انهي سان گڏ، پڪ ڪرڻ لاء ته سڄو سسٽم خراب نه ٿئي، توهان کي وقت جي ضرورت پوندي ۽ بائيڪاٽز (ٻنهي ذڪر ڪيل نمونن بابت وڌيڪ تفصيل لاءِ، بعد ۾ مضمون ۾ ڏسو - تقريباً ترجمو.)، ۽ مسئلن کي ڳولڻ لاءِ ، نگراني ، ٽريڪنگ ، […]

ايم پي: اوه، پوءِ اچو ته ان خصوصيت کي پراڊڪٽ سروس ۾ داخل ڪريون.

منهنجو خيال آهي ته خيال واضح آهي: هڪ خدمت شامل ڪرڻ لاءِ گهربل قدم ۽ ڪوشش جي مقدار تمام وڏي آهي. هن آرٽيڪل ۾، اسان ڏسندا سين ته ڪيئن Istio مٿي بيان ڪيل سڀني پيچيدگين کي هٽائي ٿو (جيڪو ڪاروبار منطق جو ارادو نه آهي) خدمتن مان.

Istio سان microservices ڏانهن واپس. حصو 1

ويچاري: هي آرٽيڪل فرض ڪري ٿو ته توهان کي ڪبرنيٽس جي ڪم ڪندڙ ڄاڻ آهي. ٻي صورت ۾، مان پڙهڻ جي صلاح ڏيان ٿو ڪبرنيٽس سان منهنجو تعارف ۽ صرف ان کان پوء هن مواد کي پڙهڻ جاري رکو.

Istio خيال

Istio کان سواء دنيا ۾، هڪ خدمت سڌو سنئون درخواست ڪري ٿي ٻئي کي، ۽ ناڪامي جي صورت ۾، خدمت کي پاڻ کي سنڀالڻ گهرجي: هڪ نئين ڪوشش ڪريو، هڪ وقت فراهم ڪريو، سرڪٽ بريڪر کوليو، وغيره.

Istio سان microservices ڏانهن واپس. حصو 1
Kubernetes ۾ نيٽ ورڪ ٽرئفڪ

Istio هڪ خاص حل پيش ڪري ٿو، مڪمل طور تي خدمتن ۽ ڪم کان الڳ ٿي نيٽ ورڪ رابطي سان مداخلت ڪندي. ۽ اهڙيء طرح اهو لاڳو ٿئي ٿو:

  • غلطي رواداري: جواب ۾ اسٽيٽس ڪوڊ جي بنياد تي، اهو سمجهي ٿو ته ڇا درخواست ناڪام ٿي ۽ ان کي ٻيهر عمل ۾ آڻيندي.
  • ڪينري رول آئوٽ: خدمت جي نئين ورزن ڏانهن درخواستن جو صرف هڪ مقرر سيڪڙو ريڊائريڪٽس.
  • مانيٽرنگ ۽ ميٽرڪ: خدمت کي جواب ڏيڻ ۾ ڪيترو وقت لڳو؟
  • ٽريڪنگ ۽ مشاهدو: هر درخواست تي خاص هيڊر شامل ڪري ٿو ۽ انهن کي ڪلستر ۾ نشانو بڻائي ٿو.
  • حفاظت: JWT ٽوڪن حاصل ڪري ٿو، تصديق ڪري ٿو ۽ صارفين کي اختيار ڪري ٿو.

اهي صرف چند امڪان آهن (واقعي صرف چند!) توهان کي دلچسپ ڪرڻ لاء. هاڻي اچو ته ٽيڪنيڪل تفصيلن تي غور ڪريو!

Istio فن تعمير

Istio سڀني نيٽ ورڪ ٽرئفڪ کي روڪي ٿو ۽ ان تي ضابطن جو هڪ سيٽ لاڳو ڪري ٿو، هر پوڊ ۾ هڪ سائڊ ڪار ڪنٽينر جي صورت ۾ هڪ سمارٽ پراکسي داخل ڪندي. پراڪسيون جيڪي سڀني صلاحيتن کي چالو ڪن ٿيون a ڊيٽا جهاز، ۽ انهن کي متحرڪ طور تي استعمال ڪندي ترتيب ڏئي سگهجي ٿو ڪنٽرول جهاز.

ڊيٽا جهاز

پوڊز ۾ داخل ڪيل پراڪسز Istio کي آساني سان پورا ڪرڻ جي اجازت ڏين ٿيون جيڪي اسان جي ضرورتن جي ضرورتن کي پورو ڪن ٿيون. مثال طور، اچو ته ٻيهر ڪوشش ڪريو ۽ سرڪٽ بريڪر افعال کي ڏسو.

Istio سان microservices ڏانهن واپس. حصو 1
ڪيئن ٻيهر ڪوششون ۽ سرڪٽ بريڪنگ اينووي ۾ لاڳو ٿين ٿيون

سمجهه

  1. دوها (اسان هڪ سائڊ ڪار ڪنٽينر ۾ واقع هڪ پراکسي بابت ڳالهائي رهيا آهيون، جيڪو ورهايو ويو آهي الڳ پيداوار - لڳ ڀڳ ترجمو.) خدمت B جي پهرين مثال لاءِ درخواست موڪلي ٿو ۽ ناڪام ٿئي ٿو.
  2. ايلچي سائڊڪر ٻيهر ڪوشش ڪري ٿو (ٻيهر ڪوشش). (1)
  3. درخواست ناڪام ٿئي ٿي ۽ پراکسي ڏانهن موٽايو ويو آهي جيڪو ان کي سڏيو ويندو آهي.
  4. هي سرڪٽ برڪر کوليندو آهي ۽ ايندڙ درخواستن لاءِ ايندڙ خدمت کي سڏيندو آهي. (2)

ان جو مطلب اهو آهي ته توهان کي ٻي ٻيهر ڪوشش لائبريري استعمال ڪرڻ جي ضرورت ناهي، توهان کي سرڪٽ بريڪنگ ۽ سروس دريافت کي پروگرامنگ ٻولي X، Y يا Z ۾ پنهنجو پاڻ تي لاڳو ڪرڻ جي ضرورت ناهي. اهو سڀ ۽ گهڻو ڪجهه دٻي کان ٻاهر موجود آهي. Istio ۾ ۽ ضرورت ناهي نه ڪوڊ ۾ تبديليون.

زبردست! ھاڻي توھان چاھيو ٿا سفر تي Istio سان، پر توھان اڃا تائين ڪجھ شڪ، کليل سوال آھن. جيڪڏهن اهو هڪ آفاقي حل آهي زندگي جي سڀني موقعن لاء، پوء توهان وٽ هڪ قدرتي شڪ آهي: سڀ کان پوء، حقيقت ۾ اهي سڀئي حل ڪنهن به صورت ۾ غير مناسب هوندا.

۽ آخرڪار توهان پڇو: "ڇا اهو حسب ضرورت آهي؟"

ھاڻي توھان تيار آھيو سامونڊي سفر لاءِ، اچو ته ڄاڻون ڪنٽرول جهاز سان.

ڪنٽرول جهاز

اهو ٽن حصن تي مشتمل آهي: پائلٽ, ميٽرر и قلعي، جيڪي گڏجي ڪم ڪن ٿا سفيرن کي ترتيب ڏيڻ لاءِ ٽريفڪ کي روٽ ڪرڻ، پاليسيون لاڳو ڪرڻ، ۽ ٽيلي ميٽري ڊيٽا گڏ ڪرڻ. Schematically اهو سڀ ڪجهه هن طرح نظر اچي ٿو:

Istio سان microservices ڏانهن واپس. حصو 1
ڊيٽا جهاز سان ڪنٽرول جهاز جو تعامل

سفير (يعني ڊيٽا جهاز) استعمال ڪندي ترتيب ڏنل آهن ڪبرنيٽس CRD (Custom Resource Definitions) Istio پاران بيان ڪيل ۽ خاص طور تي هن مقصد لاءِ. ان جو مطلب توهان لاءِ اهو آهي ته اهي ڪبرنيٽس ۾ هڪ واقف نحو سان گڏ هڪ ٻيو وسيلو نظر اچن ٿا. هڪ دفعو ٺاهي وئي، هي وسيلو ڪنٽرول جهاز ذريعي ورتو ويندو ۽ سفيرن تي لاڳو ڪيو ويندو.

Istio سان خدمتن جو تعلق

اسان بيان ڪيو آهي Istio جو تعلق خدمتن سان آهي، پر ان جي ابتڙ نه: خدمتن جو Istio سان ڪهڙو تعلق آهي؟

ايمانداريءَ سان، خدمتون Istio جي موجودگيءَ کان ائين ئي واقف آهن جيئن مڇيون پاڻيءَ جون هونديون آهن جڏهن هو پاڻ کان پڇندا آهن ته ”پاڻي ڇا آهي؟

Istio سان microservices ڏانهن واپس. حصو 1
مثال ڏيڻ وڪٽوريا Dimitrakopoulos:- توهان کي پاڻي ڪيئن پسند آهي؟ - بهرحال پاڻي ڇا آهي؟

ان ڪري، توهان هڪ ڪم ڪندڙ ڪلستر وٺي سگهو ٿا ۽ Istio اجزاء کي ترتيب ڏيڻ کان پوء، ان ۾ موجود خدمتون ڪم ڪندا رهندا، ۽ انهن حصن کي هٽائڻ کان پوء، سڀ ڪجهه ٻيهر ٺيڪ ٿي ويندو. اهو واضح آهي ته هن حالت ۾ توهان Istio پاران مهيا ڪيل صلاحيتون وڃائي ڇڏينداسين.

ڪافي نظريو - اچو ته هن علم کي عملي طور تي رکون!

Istio عملي طور تي

Istio کي گھٽ ۾ گھٽ 4 وي سي پي يوز ۽ 8 GB ريم سان گڏ ڪبرنيٽس ڪلستر جي ضرورت آھي. جلدي هڪ ڪلستر قائم ڪرڻ ۽ آرٽيڪل مان ڏنل هدايتن تي عمل ڪرڻ لاءِ، مان گوگل ڪلائوڊ پليٽ فارم استعمال ڪرڻ جي صلاح ڏيان ٿو، جيڪو نوان استعمال ڪندڙن کي پيش ڪري ٿو مفت $300.

هڪ ڪلستر ٺاهڻ ۽ ڪنسول يوٽيليٽي ذريعي ڪبرنيٽس تائين پهچ کي ترتيب ڏيڻ کان پوءِ، توهان هيلم پيڪيج مئنيجر ذريعي Istio انسٽال ڪري سگهو ٿا.

هيلم جي تنصيب

توهان جي ڪمپيوٽر تي هيلم ڪلائنٽ انسٽال ڪريو، جيئن بيان ڪيو ويو آهي سرڪاري دستاويز. اسان هن کي استعمال ڪنداسين ٽيمپليٽس ٺاهڻ لاءِ Istio انسٽال ڪرڻ لاءِ ايندڙ حصي ۾.

Istio انسٽال ڪرڻ

ڊائون لوڊ ڪريو Istio وسيلن تان تازو رليز (اصل ليکڪ جو لنڪ نسخو 1.0.5 ڏانهن تبديل ڪيو ويو آهي موجوده هڪ، يعني 1.0.6 - تقريباً ترجمو.)، مواد کي ھڪڙي ڊاريڪٽري ۾ ڪڍو، جنھن کي مان ھاڻي سڏيندس [istio-resources].

Istio وسيلن کي آساني سان سڃاڻڻ لاء، K8s ڪلستر ۾ نالي جي جڳھ ٺاھيو istio-system:

$ kubectl create namespace istio-system

ڊاريڪٽري ڏانهن وڃڻ سان انسٽاليشن مڪمل ڪريو [istio-resources] ۽ حڪم هلائڻ:

$ helm template install/kubernetes/helm/istio 
  --set global.mtls.enabled=false 
  --set tracing.enabled=true 
  --set kiali.enabled=true 
  --set grafana.enabled=true 
  --namespace istio-system > istio.yaml

هي حڪم هڪ فائل ڏانهن Istio جي اهم حصن کي ڪڍي ڇڏيندو istio.yaml. اسان پاڻ کي مناسب ڪرڻ لاءِ معياري ٽيمپليٽ کي تبديل ڪيو، ھيٺ ڏنل پيرا ميٽرن کي بيان ڪندي:

  • global.mtls.enabled ۾ نصب false (يعني mTLS جي تصديق بند ٿيل آهي - تقريبن.)اسان جي تاريخن جي عمل کي آسان ڪرڻ لاء؛
  • tracing.enabled Jaeger استعمال ڪندي درخواست ٽريڪنگ شامل آهي؛
  • kiali.enabled خدمتن ۽ ٽرئفڪ کي ڏسڻ لاءِ ڪلستر ۾ ڪيلي کي انسٽال ڪري ٿو.
  • grafana.enabled گڏ ڪيل ميٽرڪس کي ڏسڻ لاءِ گرافانا کي انسٽال ڪري ٿو.

اچو ته تيار ڪيل وسيلن کي حڪم سان استعمال ڪريون:

$ kubectl apply -f istio.yaml

ڪلستر تي Istio جي انسٽاليشن مڪمل ٿي وئي آهي! انتظار ڪريو جيستائين سڀئي پوڊ نالي جي جاء تي آهن istio-system ڪري سگهندا Running يا Completedهيٺ ڏنل حڪم هلائڻ سان:

$ kubectl get pods -n istio-system

ھاڻي اسان ايندڙ سيڪشن ۾ جاري رکڻ لاءِ تيار آھيون، جتي اسان اپليڪيشن حاصل ڪنداسين ۽ ھلائينداسين.

جذبي جي تجزيي جي ايپليڪيشن جو فن تعمير

اچو ته مثال طور استعمال ڪريون Sentiment Analysis microservice ايپليڪيشن جو اڳ ۾ ئي ذڪر ڪيل ۾ استعمال ڪيو ويو ڪبرنيٽس جو تعارفي مضمون. اهو ڪافي پيچيده آهي Istio جي صلاحيتن کي عملي طور تي ڏيکارڻ لاء.

اپليڪيشن چار microservices تي مشتمل آهي:

  1. خدمت SA- فرنٽيڊ، جيڪو Reactjs ايپليڪيشن جي فرنٽ اينڊ کي ڪم ڪندو آهي؛
  2. خدمت SA-WebApp، جيڪو جذبي جي تجزيي جي سوالن جي خدمت ڪري ٿو؛
  3. خدمت SA- منطق، جيڪو پاڻ انجام ڏئي ٿو جذباتي تجزيو;
  4. خدمت SA- راءِ, جيڪو تجزيو جي درستگي بابت صارفين کان موٽ حاصل ڪري ٿو.

Istio سان microservices ڏانهن واپس. حصو 1

هن آريگرام ۾، خدمتن کان علاوه، اسان انگريس ڪنٽرولر پڻ ڏسون ٿا، جيڪو ڪبرنيٽس ۾ مناسب خدمتن ڏانهن ايندڙ درخواستن کي روٽ ڪري ٿو. Istio ان جي Ingress Gateway جي اندر ھڪڙو ساڳيو تصور استعمال ڪري ٿو، جنھن جا وڌيڪ تفصيل اڳتي وڌندا.

Istio کان پراکسي سان ايپليڪيشن کي هلائڻ

مضمون ۾ ذڪر ڪيل وڌيڪ عملن لاءِ، ڪلون ڪريو پنھنجي مخزن کي استقامت. اهو ڪبرنيٽس ۽ اسٽيو لاءِ ايپليڪيشن ۽ منشور تي مشتمل آهي.

سائڊ ڪارز داخل ڪرڻ

داخل ڪري سگهجي ٿو خودڪار يا هٿ سان. خود بخود سائڊ ڪار ڪنٽينر داخل ڪرڻ لاءِ، توھان کي ضرورت پوندي ھڪڙي ليبل مقرر ڪرڻ لاءِ نالي جي جڳھ istio-injection=enabled، جيڪو هيٺ ڏنل حڪم سان ڪيو ويندو آهي:

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

ھاڻي ھر پوڊ جيڪو ڊفالٽ نالي اسپيس ۾ لڳايو ويندو (default) ان جي سائڊ ڪار ڪنٽينر وصول ڪندي. انهي جي تصديق ڪرڻ لاءِ، اچو ته ٽيسٽ ايپليڪيشن کي ترتيب ڏيون ريپوزٽري جي روٽ ڊاريڪٽري ڏانهن [istio-mastery] ۽ ھيٺ ڏنل حڪم هلائڻ:

$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment.extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app created

خدمتن کي ترتيب ڏيڻ کان پوء، اچو ته چيڪ ڪريو ته پوڊ وٽ ٻه ڪنٽينرز آهن (سروس پاڻ ۽ ان جي سائڊ ڪار سان) ڪمانڊ هلائڻ سان kubectl get pods ۽ پڪ ڪريو ته ڪالمن جي هيٺان READY بيان ڪيل قدر 2/2، علامت آهي ته ٻنهي ڪنٽينر هلائي رهيا آهن:

$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
sa-feedback-55f5dc4d9c-c9wfv   2/2       Running   0          12m
sa-frontend-558f8986-hhkj9     2/2       Running   0          12m
sa-logic-568498cb4d-2sjwj      2/2       Running   0          12m
sa-logic-568498cb4d-p4f8c      2/2       Running   0          12m
sa-web-app-599cf47c7c-s7cvd    2/2       Running   0          12m

بصري طور تي هن طرح نظر اچي ٿو:

Istio سان microservices ڏانهن واپس. حصو 1
هڪ پوڊ ۾ انسائيڪلوپيڊيا پراکسي

هاڻي ته ايپليڪيشن مٿي ۽ هلندڙ آهي، اسان کي ايندڙ ٽرئفڪ کي ايپليڪيشن ۾ اچڻ جي اجازت ڏيڻ جي ضرورت پوندي.

داخلا گيٽ وي

ھن کي حاصل ڪرڻ لاءِ بھترين مشق (ڪلسٽر ۾ ٽرئفڪ جي اجازت ڏيو) ذريعي آھي داخلا گيٽ وي Istio ۾، جيڪو ڪلستر جي "ڪنار" تي واقع آهي ۽ توهان کي Istio خاصيتن کي فعال ڪرڻ جي اجازت ڏئي ٿو جهڙوڪ روٽنگ، لوڊ بيلنس، سيڪيورٽي ۽ ايندڙ ٽرئفڪ جي نگراني.

Ingress Gateway جزو ۽ خدمت جيڪا ان کي ٻاھرين طور تي اڳتي وڌائي ٿي ڪلستر ۾ اسٽيو تنصيب دوران نصب ڪيو ويو. خدمت جي ٻاهرين IP پتي کي ڳولڻ لاء، هلائڻ:

$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP
istio-ingressgateway   LoadBalancer   10.0.132.127   13.93.30.120

اسان هن IP کي استعمال ڪندي ايپليڪيشن تائين رسائي جاري رکنداسين (آئون ان کي EXTERNAL-IP طور حوالو ڏيندس)، تنهنڪري سهولت لاءِ اسين قيمت کي متغير ۾ لکنداسين:

$ EXTERNAL_IP=$(kubectl get svc -n istio-system 
  -l app=istio-ingressgateway 
  -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

جيڪڏهن توهان هاڻي برائوزر ذريعي هن IP تائين رسائي ڪرڻ جي ڪوشش ڪندا، توهان کي هڪ خدمت غير دستياب غلطي ملي ويندي، ڇاڪاڻ ته ڊفالٽ Istio سڀني ايندڙ ٽرئفڪ کي بلاڪ ڪري ٿو، گيٽ وي جي اڃا تائين وضاحت نه ڪئي وئي آهي.

گيٽ وي وسيلن

گيٽ وي ڪبرنيٽس ۾ هڪ CRD (ڪسٽم ريسورس ڊيفينيشن) آهي، جيڪو ڪلستر ۾ Istio کي انسٽال ڪرڻ کان پوءِ بيان ڪيو ويو آهي ۽ انهن بندرگاهن، پروٽوڪول ۽ ميزبانن کي بيان ڪرڻ جي صلاحيت کي چالو ڪرڻ لاءِ جنهن لاءِ اسان ايندڙ ٽرئفڪ کي اجازت ڏيڻ چاهيون ٿا.

اسان جي حالت ۾، اسان سڀني ميزبانن لاء بندرگاهن 80 تي HTTP ٽرئفڪ جي اجازت ڏيڻ چاهيون ٿا. ڪم هيٺ ڏنل تعريف سان لاڳو ٿئي ٿو (http-gateway.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
- "*"

ھن ٺاھ جوڙ کي ڪنھن وضاحت جي ضرورت نه آھي سواءِ چونڊيندڙ جي istio: ingressgateway. هن چونڊيندڙ سان اسان وضاحت ڪري سگھون ٿا ته ڪھڙي انگريس گيٽ وي کي ترتيب ڏيڻ لاءِ. اسان جي حالت ۾، اهو آهي Ingress Gateway ڪنٽرولر، جيڪو Istio ۾ ڊفالٽ طرفان نصب ڪيو ويو آهي.

ٺاھ جوڙ ھيٺ ڏنل حڪم کي سڏڻ سان لاڳو ٿئي ٿو:

$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created

گيٽ وي هاڻي بندرگاهه 80 تائين رسائي جي اجازت ڏئي ٿو، پر ڪا به خبر ناهي ته درخواستن کي ڪٿي روٽ ڪجي. هن لاء توهان جي ضرورت پوندي ورچوئل سروسز.

VirtualService Resource

VirtualService Ingress Gateway کي ٻڌائي ٿي ته ڪئين درخواستن کي روٽ ڪجي جن کي ڪلستر جي اندر اجازت ڏني وڃي.

http-گيٽ وي ذريعي اچڻ واري اسان جي ايپليڪيشن لاءِ درخواستون ضرور موڪليا وڃن sa-frontend، sa-web-app ۽ sa-feedback خدمتن:

Istio سان microservices ڏانهن واپس. حصو 1
رستا جن کي VirtualServices سان ترتيب ڏيڻ جي ضرورت آهي

اچو ته انهن درخواستن تي نظر رکون جيڪي SA-Frontend ڏانهن موڪليا وڃن:

  • رستي ۾ بلڪل صحيح / index.html حاصل ڪرڻ لاءِ SA-Frontend ڏانهن موڪليو وڃي.
  • اڳواٽ رستا /static/* لازمي طور تي موڪليو وڃي SA-Frontend ۾ استعمال ٿيل جامد فائلون حاصل ڪرڻ لاءِ، جيئن CSS ۽ JavaScript؛
  • باقاعده اظهار سان ملندڙ رستا '^.*.(ico|png|jpg)$'SA-Frontend ڏانهن موڪليو وڃي، ڇاڪاڻ ته اهي تصويرون صفحي تي ڏيکاريل آهن.

عمل هيٺ ڏنل ترتيب جي ذريعي حاصل ڪئي وئي آهي (sa-virtualservice-external.yaml):

kind: VirtualService
metadata:
  name: sa-external-services
spec:
  hosts:
  - "*"
  gateways:
  - http-gateway                      # 1
  http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*.(ico|png|jpg)

Важные моменты:

  1. Этот VirtualService относится к запросам, приходящим через http-gateway;
  2. В destination определяется сервис, куда отправляются запросы.
Примечание: Конфигурация выше хранится в файле sa-virtualservice-external.yaml, который также содержит настройки для маршрутизации в SA-WebApp и SA-Feedback, но был сокращён здесь в статье для лаконичности. Применим VirtualService вызовом:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created

Примечание: Когда мы применяем ресурсы Istio, Kubernetes API Server создаёт событие, которое получает Istio Control Plane, и уже после этого новая конфигурация применяется к прокси-серверам Envoy каждого pod'а. А контроллер Ingress Gateway представляется очередным Envoy, сконфигурированным в Control Plane. Всё это на схеме выглядит так:

Назад к микросервисам вместе с Istio. Часть 1
Конфигурация Istio-IngressGateway для маршрутизации запросов

Приложение Sentiment Analysis стало доступным по http://{EXTERNAL-IP}/. Не переживайте, если вы получаете статус Not Found: иногда требуется чуть больше времени для того, чтобы конфигурация вступила в силу и кэши Envoy обновились.

Перед тем, как продолжить, поработайте немного с приложением, чтобы сгенерировать трафик (его наличие необходимо для наглядности в последующих действиях — прим. перев.).

Kiali : наблюдаемость

Чтобы попасть в административный интерфейс Kiali, выполните следующую команду:

$ kubectl port-forward 
    $(kubectl get pod -n istio-system -l app=kiali 
    -o jsonpath='{.items[0].metadata.name}') 
    -n istio-system 20001

… и откройте http://localhost:20001/, залогинившись под admin/admin. Здесь вы найдете множество полезных возможностей, например, для проверки конфигурации компонентов Istio, визуализации сервисов по информации, собранной при перехвате сетевых запросов, получения ответов на вопросы «Кто к кому обращается?», «У какой версии сервиса возникают сбои?» и т.п. В общем, изучите возможности Kiali перед тем, как двигаться дальше — к визуализации метрик с Grafana.

Назад к микросервисам вместе с Istio. Часть 1

Grafana: визуализация метрик

Собранные в Istio метрики попадают в Prometheus и визуализируются с Grafana. Чтобы попасть в административный интерфейс Grafana, выполните команду ниже, после чего откройте http://localhost:3000/:

$ kubectl -n istio-system port-forward 
    $(kubectl -n istio-system get pod -l app=grafana 
    -o jsonpath={.items[0].metadata.name}) 3000

Кликнув на меню Home слева сверху и выбрав Istio Service Dashboard в левом верхнем углу, начните с сервиса sa-web-app, чтобы посмотреть на собранные метрики:

Назад к микросервисам вместе с Istio. Часть 1

Здесь нас ждёт пустое и совершенно скучное представление — руководство никогда такое не одобрит. Давайте же создадим небольшую нагрузку следующей командой:

$ while true; do 
    curl -i http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "I love yogobella"}'; 
    sleep .8; done

Вот теперь у нас гораздо более симпатичные графики, а в дополнение к ним — замечательные инструменты Prometheus для мониторинга и Grafana для визуализации метрик, что позволят нам узнать о производительности, состоянии здоровья, улучшениях/деградации в работе сервисов на протяжении времени.

Наконец, посмотрим на трассировку запросов в сервисах.

Jaeger : трассировка

Трассировка нам потребуется, потому что чем больше у нас сервисов, тем сложнее добраться до причины сбоя. Посмотрим на простой случай из картинки ниже:

Назад к микросервисам вместе с Istio. Часть 1
Типовой пример случайного неудачного запроса

Запрос приходит, падает — в чём же причина? Первый сервис? Или второй? Исключения есть в обоих — давайте посмотрим на логи каждого. Как часто вы ловили себя за таким занятием? Наша работа больше похожа на детективов программного обеспечения, а не разработчиков…

Это широко распространённая проблема в микросервисах и решается она распределёнными системами трассировки, в которых сервисы передают друг другу уникальный заголовок, после чего эта информация перенаправляется в систему трассировки, где она сопоставляется с данными запроса. Вот иллюстрация:

Назад к микросервисам вместе с Istio. Часть 1
Для идентификации запроса используется TraceId

В Istio используется Jaeger Tracer, который реализует независимый от вендоров фреймворк OpenTracing API. Получить доступ к пользовательского интерфейсу Jaeger можно следующей командой:

$ kubectl port-forward -n istio-system 
    $(kubectl get pod -n istio-system -l app=jaeger 
    -o jsonpath='{.items[0].metadata.name}') 16686

Теперь зайдите на http://localhost:16686/ и выберите сервис sa-web-app. Если сервис не показан в выпадающем меню — проявите/сгенерируйте активность на странице и обновите интерфейс. После этого нажмите на кнопку Find Traces, которая покажет самые последние трейсы — выберите любой — покажется детализированная информация по всем трейсам:

Назад к микросервисам вместе с Istio. Часть 1

Этот трейс показывает:

  1. Запрос приходит в istio-ingressgateway (это первое взаимодействие с одним из сервисов, и для запроса генерируется Trace ID), после чего шлюз направляет запрос в сервис sa-web-app.
  2. В сервисе sa-web-app запрос подхватывается Envoy sidecar'ом, создаётся «ребёнок» в span'е (поэтому мы видим его в трейсах) и перенаправляется в контейнер sa-web-app. (Span — логическая единица работы в Jaeger, имеющая название, время начало операции и её продолжительность. Span'ы могут быть вложенными и упорядоченными. Ориентированный ациклический граф из span'ов образует trace. — прим. перев.)
  3. Здесь запрос обрабатывается методом sentimentAnalysis. Эти трейсы уже сгенерированы приложением, т.е. для них потребовались изменения в коде.
  4. С этого момента инициируется POST-запрос в sa-logic. Trace ID должен быть проброшен из sa-web-app.

Примечание: На 4 шаге приложение должно увидеть заголовки, сгенерированные Istio, и передать их в последующие запросы, как показано на изображении ниже:

Назад к микросервисам вместе с Istio. Часть 1
(A) За проброс заголовков отвечает Istio; (B) За заголовки отвечают сервисы

Istio делает основную работу, т.к. генерирует заголовки для входящих запросов, создаёт новые span'ы в каждом sidecare'е и пробрасывает их. Однако без работы с заголовками внутри сервисов полный путь трассировки запроса будет утерян.

Необходимо учитывать (пробрасывать) следующие заголовки:

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context

Это несложная задача, однако для упрощения её реализации уже существует множество библиотек — например, в сервисе sa-web-app клиент RestTemplate пробрасывает эти заголовки, если просто добавить библиотеки Jaeger и OpenTracing в его зависимости.

Заметьте, что приложение Sentiment Analysis демонстрирует реализации на Flask, Spring и ASP.NET Core.

Теперь, когда стало ясно, что мы получаем из коробки (или почти «из коробки»), рассмотрим вопросы тонко настраиваемой маршрутизации, управления сетевым трафиком, безопасности и т.п.!

Прим. перев.: об этом читайте в следующей части материалов по Istio от Rinor Maloku, переводы которых последуют в нашем блоге в ближайшее время. UPDATE (14 марта): Вторая часть уже опубликована.

P.S. от переводчика

Читайте также в нашем блоге:

Источник: habr.com

route:
- destination:
host: sa-frontend # 2
port:
number: 80

اهم نقطا:

  1. هي VirtualService ذريعي اچڻ واري درخواستن ڏانهن اشارو آهي http-گيٽ وي;
  2. В destination خدمت جنهن تي درخواستون موڪليا ويا آهن طئي ٿيل آهي.

ويچاري: مٿي ڏنل ٺاھ جوڙ ھڪڙي فائل ۾ ذخيرو ٿيل آھي sa-virtualservice-external.yaml, جنهن ۾ SA-WebApp ۽ SA-Feedback ۾ روٽنگ لاءِ سيٽنگون به شامل آهن، پر اختصار لاءِ مضمون ۾ هتي مختصر ڪيو ويو آهي.

اچو ته ڪال ڪري VirtualService لاڳو ڪريون:


ويچاري: جڏهن اسان Istio وسيلن کي استعمال ڪندا آهيون، Kubernetes API سرور هڪ واقعو ٺاهي ٿو جيڪو Istio ڪنٽرول جهاز طرفان وصول ڪيو ويو آهي، ۽ ان کان پوء نئين ترتيب هر پوڊ جي اينوائي پروڪسز تي لاڳو ٿيندي آهي. ۽ Ingress Gateway ڪنٽرولر ظاهر ٿئي ٿو ته ڪنٽرول جهاز ۾ ترتيب ڏنل هڪ ٻيو ايلچي. هي سڀ ڪجهه هن طرح نظر اچي ٿو هن تصوير ۾:

Istio سان microservices ڏانهن واپس. حصو 1
Istio-IngressGateway ترتيب جي درخواست جي رستي لاءِ

جذبي جي تجزيي جي ايپليڪيشن هاڻي دستياب آهي http://{EXTERNAL-IP}/. پريشان نه ڪريو جيڪڏهن توهان حاصل نه ڪيو اسٽيٽس: ڪڏھن ڪڏھن ٿورڙي دير لڳندي آھي ٺاھ جوڙ کي اثر انداز ٿيڻ لاءِ ۽ تازه ڪاري ڪرڻ لاءِ Envoy caches.

اڳتي وڌڻ کان اڳ، ٽريفڪ پيدا ڪرڻ لاءِ ايپ سان ٿورو کيڏو. (ان جي موجودگي ايندڙ عملن ۾ وضاحت لاءِ ضروري آهي - تقريباً ترجمو.).

ڪيلي: مشاهدو

Kiali انتظامي انٽرفيس حاصل ڪرڻ لاء، ھيٺ ڏنل حڪم ھلايو:


... ۽ کليل http://localhost:20001/، منتظم/ منتظم طور لاگ ان ٿيو. هتي توهان کي ڪيتريون ئي ڪارائتيون خاصيتون ملنديون، مثال طور، Istio اجزاء جي ترتيب کي جانچڻ لاءِ، نيٽ ورڪ جي درخواستن کي مداخلت ڪرڻ کان گڏ ڪيل معلومات استعمال ڪندي خدمتن کي ڏسڻ، سوالن جا جواب حاصل ڪريو "ڪير ڪير رابطو ڪري رهيو آهي؟"، "سروس جو ڪهڙو نسخو تجربو ڪري رهيو آهي. ناڪامي؟" ۽ ايئن. عام طور تي، Grafana سان ميٽرڪس کي ڏسڻ لاءِ اڳتي وڌڻ کان اڳ ڪيلي جي صلاحيتن کي ڳوليو.

Istio سان microservices ڏانهن واپس. حصو 1

گرافانا: ميٽرڪ ويزولائيزيشن

Istio ۾ گڏ ڪيل ميٽرڪس Prometheus ۾ وڃن ٿا ۽ گرافانا سان ڏسڻ ۾ اچن ٿا. حاصل ڪرڻ لاءِ Grafana انتظامي انٽرفيس، ھيٺ ڏنل حڪم ھلايو ۽ پوءِ کوليو http://localhost:3000/:


مينيو تي ڪلڪ ڪندي گھر جي مٿي کاٻي ۽ چونڊيو Istio سروس ڊيش بورڊ مٿين کاٻي ڪنڊ ۾، خدمت سان شروع ڪريو sa-web-appگڏ ڪيل ماپن کي ڏسڻ لاءِ:

Istio سان microservices ڏانهن واپس. حصو 1

هتي جيڪو اسان جو انتظار ڪري رهيو آهي اهو هڪ خالي ۽ مڪمل طور تي بورنگ ڪارڪردگي آهي - انتظاميا هن کي ڪڏهن به منظور نه ڪندي. اچو ته ھيٺ ڏنل حڪم سان ھڪڙو ننڍڙو لوڊ ٺاھيو.


ھاڻي اسان وٽ تمام بھتر گرافس آھن، ۽ انھن کان علاوه، شاندار پروميٿيوس اوزار مانيٽرنگ لاءِ ۽ گرافانا ميٽرڪس کي ڏسڻ لاءِ جيڪي اسان کي وقت گذرڻ سان گڏ خدمتن ۾ ڪارڪردگي، صحت، سڌارن/تنزل بابت سکڻ جي اجازت ڏين ٿا.

آخرڪار، اچو ته خدمتن ۾ ٽريڪنگ درخواستن کي ڏسو.

جيگر: جاچڻ

اسان کي ٽريڪنگ جي ضرورت پوندي ڇو ته اسان وٽ جيتريون خدمتون آهن، اوترو وڌيڪ ڏکيو آهي ناڪامي جي سبب تائين پهچڻ. اچو ته هيٺ ڏنل تصوير مان هڪ سادي ڪيس ڏسو:

Istio سان microservices ڏانهن واپس. حصو 1
بي ترتيب ناڪام درخواست جو عام مثال

درخواست اچي ٿي، پوي ٿي - سبب ڇا آهي؟ پهرين خدمت؟ يا ٻيو؟ ٻنهي ۾ استثنا آهن - اچو ته هر هڪ جي لاگن کي ڏسو. توهان ڪيترا ڀيرا پاڻ کي پڪڙي ورتو آهي اهو ڪندي؟ اسان جو ڪم ڊولپرز کان وڌيڪ سافٽ ويئر جاسوسن وانگر آهي ...

اهو مائڪرو سروسز ۾ هڪ عام مسئلو آهي ۽ ورهايل ٽريڪنگ سسٽم ذريعي حل ڪيو ويندو آهي، جنهن ۾ خدمتون هڪ ٻئي ڏانهن هڪ منفرد هيڊر پاس ڪندا آهن، جنهن کان پوءِ اها معلومات ٽريڪنگ سسٽم ڏانهن موڪلي ويندي آهي، جتي ان جو مقابلو ڊيٽا جي درخواست سان ڪيو ويندو آهي. هتي هڪ مثال آهي:

Istio سان microservices ڏانهن واپس. حصو 1
TraceId درخواست جي سڃاڻپ ڪرڻ لاء استعمال ڪيو ويندو آهي

Istio استعمال ڪري ٿو Jaeger Tracer، جيڪو لاڳو ڪري ٿو وينڊر-آزاد OpenTracing API فريم ورڪ. توھان ھيٺ ڏنل حڪم سان Jaeger يوزر انٽرفيس تائين رسائي ڪري سگھو ٿا:


ھاڻي ڏانھن وڃو http://localhost:16686/ ۽ هڪ خدمت چونڊيو sa-web-app. جيڪڏهن خدمت نه ڏيکاريل آهي ڊراپ-ڊائون مينيو ۾، ڏيکاريو/پيج تي سرگرمي پيدا ڪريو ۽ انٽرفيس کي اپڊيٽ ڪريو. ان کان پوء، بٽڻ تي ڪلڪ ڪريو نشان ڳوليو، جيڪو تازو نشان ڏيکاريندو - ڪو به چونڊيو - سڀني نشانين تي تفصيلي معلومات ظاهر ٿيندي:

Istio سان microservices ڏانهن واپس. حصو 1

هي نشان ڏيکاري ٿو:

  1. درخواست اچي ٿي istio-ingressgateway (اها پهرين ڳالهه ٻولهه آهي ڪنهن هڪ خدمتن سان، ۽ هڪ ٽريس ID درخواست لاءِ ٺاهي وئي آهي)، جنهن کان پوءِ گيٽ وي سروس ڏانهن درخواست موڪلي ٿو. sa-web-app.
  2. خدمت ۾ sa-web-app درخواست کي ايلچي سائڊ ڪار طرفان ورتو ويو آهي، هڪ "ٻار" جي مدت ۾ ٺاهي وئي آهي (ان ڪري اسان ان کي نشانن ۾ ڏسون ٿا) ۽ ڪنٽينر ڏانهن منتقل ڪيو ويو آهي. sa-web-app. (span - Jaeger ۾ ڪم جو هڪ منطقي يونٽ، جنهن جو نالو آهي، آپريشن جي شروعات جو وقت ۽ ان جي مدت. spans nested ۽ حڪم ڪري سگهجي ٿو. اسپانن جو ھڪ ھدايت ڪيل ايڪائيڪل گراف ھڪڙو نشان ٺاھي ٿو. - لڳ ڀڳ ترجمو.)
  3. هتي درخواست جي طريقي سان عمل ڪيو ويندو آهي جذباتي تجزيو. اهي نشان اڳ ۾ ئي ايپليڪيشن پاران ٺاهيا ويا آهن، يعني. انهن کي ڪوڊ تبديلين جي ضرورت آهي.
  4. هن وقت کان، پوسٽ جي درخواست شروع ڪئي وئي آهي سا- منطق. ٽريڪ ID کان اڳتي وڌڻ گهرجي sa-web-app.
  5. ...

ويچاري: قدم 4 ۾، ايپليڪيشن کي ڏسڻ گهرجي هيڊرز Istio پاران ٺاهيل آهن ۽ انهن کي ايندڙ درخواستن ڏانهن منتقل ڪرڻ گهرجي جيئن هيٺ ڏنل تصوير ۾ ڏيکاريل آهي:

Istio سان microservices ڏانهن واپس. حصو 1
(الف) Istio هيڊر اڳتي وڌائڻ جو ذميوار آهي؛ (ب) خدمتون سربراهن لاءِ ذميوار آهن

Istio گهڻو ڪري ڪم ڪري ٿو ڇاڪاڻ ته ... ايندڙ درخواستن لاءِ هيڊر ٺاهي ٿو، هر پاسي جي سنڀال ۾ نوان اسپن ٺاهي ٿو ۽ انهن کي اڳتي وڌائي ٿو. جڏهن ته، خدمتن جي اندر هيڊرن سان ڪم ڪرڻ کان سواء، مڪمل درخواست جو رستو گم ٿي ويندو.

ھيٺين سرن کي حساب ۾ رکڻ گھرجي:


اهو هڪ ڏکيو ڪم نه آهي، پر ان جي عمل کي آسان ڪرڻ لاء اڳ ۾ ئي آهي ڪيتريون ئي لائبريريون - مثال طور، sa-web-app سروس ۾، RestTemplate ڪلائنٽ انهن هيڊرز کي اڳتي وڌائيندو آهي جيڪڏهن توهان صرف Jaeger ۽ OpenTracing لائبريرين کي شامل ڪريو ٿا هن جون عادتون.

نوٽ ڪريو ته جذبي جي تجزيي جي ايپليڪيشن فلاسڪ، اسپرنگ، ۽ ASP.NET ڪور ۾ عمل درآمد کي ظاهر ڪري ٿي.

هاڻي ته اهو واضح آهي ته اسان دٻي مان ڇا حاصل ڪريون ٿا (يا تقريباً دٻي کان ٻاهر)، اچو ته ڏسون ته ٺيڪ ٺهندڙ روٽنگ، نيٽ ورڪ ٽرئفڪ مئنيجمينٽ، سيڪيورٽي وغيره!

نوٽ. ترجمو: ان بابت پڙهو مواد جي ايندڙ حصي ۾ Istio from Rinor Maloku، جن جا ترجما اسان جي بلاگ تي ويجهي مستقبل ۾ پيروي ڪندا. UPDATE (14 مارچ): ٻيو حصو اڳ ۾ ئي شايع ڪيو ويو آهي.

پي ايس مترجم کان

اسان جي بلاگ تي پڻ پڙهو:

جو ذريعو: www.habr.com