বিঃদ্রঃ. অনুবাদ: মাইক্রোসার্ভিস আর্কিটেকচার অনুসরণ করে অ্যাপ্লিকেশনের জন্য আজকের পরিকাঠামোতে সার্ভিস মেশ অবশ্যই একটি আলোচিত বিষয় হয়ে উঠেছে। যদিও Istio অনেক DevOps ইঞ্জিনিয়ারদের রাডারে থাকতে পারে, এটি একটি মোটামুটি নতুন পণ্য যা এটি প্রদান করে বৈশিষ্ট্যগুলির পরিপ্রেক্ষিতে জটিল হলেও তা জানার জন্য একটি উল্লেখযোগ্য পরিমাণ সময় নিতে পারে। জার্মান প্রকৌশলী রিনর মালোকু, যিনি টেলিকমিউনিকেশন কোম্পানি অরেঞ্জ নেটওয়ার্কের বৃহৎ ক্লায়েন্টদের জন্য ক্লাউড কম্পিউটিং-এর দায়িত্বে আছেন, তিনি একটি চমৎকার সিরিজের উপকরণ লিখেছেন যা আপনাকে দ্রুত এবং গভীরভাবে ইস্টিওতে ডুব দিতে দেয়। তিনি তার গল্প শুরু করেন ইস্টিও কী করতে পারে এবং কীভাবে আপনি নিজের চোখে এটি দেখতে পারেন।
ইসতিও — ওপেন সোর্স-প্রকল্প, Google, IBM এবং Lyft-এর টিমের সহযোগিতায় তৈরি। এটি মাইক্রোসার্ভিসের উপর ভিত্তি করে অ্যাপ্লিকেশনগুলিতে উদ্ভূত জটিলতাগুলি সমাধান করে, উদাহরণস্বরূপ, যেমন:
ট্রাফিক ব্যবস্থাপনা: টাইমআউট, পুনরায় চেষ্টা, লোড ব্যালেন্সিং;
নিরাপত্তা: শেষ ব্যবহারকারীর প্রমাণীকরণ এবং অনুমোদন;
পর্যবেক্ষণযোগ্যতা: ট্রেসিং, পর্যবেক্ষণ, লগিং।
এগুলি সবই অ্যাপ্লিকেশন স্তরে সমাধান করা যেতে পারে, তবে এর পরে আপনার পরিষেবাগুলি আর "মাইক্রো" থাকবে না। এই সমস্যাগুলি সমাধান করার জন্য সমস্ত অতিরিক্ত প্রচেষ্টা কোম্পানির সম্পদের অপচয় যা সরাসরি ব্যবসায়িক মূল্যের জন্য ব্যবহার করা যেতে পারে। একটি উদাহরণ বিবেচনা করুন:
প্রজেক্ট ম্যানেজার: ফিডব্যাক ফিচার যোগ করতে কতক্ষণ লাগে?
বিকাশকারী: দুটি স্প্রিন্ট।
সাংসদ: কি?... এটা শুধুই ক্রুড!
R: CRUD করা টাস্কের সহজ অংশ, কিন্তু আমাদের এখনও ব্যবহারকারী এবং পরিষেবাগুলিকে প্রমাণীকরণ এবং অনুমোদন করতে হবে। যেহেতু নেটওয়ার্কটি অবিশ্বস্ত, তাই আপনাকে বারবার অনুরোধ বাস্তবায়ন করতে হবে, সেইসাথে সার্কিট ব্রেকার প্যাটার্ন ক্লায়েন্টদের মধ্যে এছাড়াও, নিশ্চিত করতে যে পুরো সিস্টেমটি ক্র্যাশ হয়নি, টাইমআউট এবং বাল্কহেডস(উল্লেখিত উভয় নিদর্শন সম্পর্কে আরো বিস্তারিত জানার জন্য নিবন্ধে পরে দেখুন।), এবং সমস্যা সনাক্ত করার জন্য, পর্যবেক্ষণ, ট্রেসিং, […]
সাংসদ: ওহ, তাহলে এই বৈশিষ্ট্যটি পণ্য পরিষেবাতে রাখা যাক।
আমি মনে করি ধারণাটি পরিষ্কার: একটি একক পরিষেবা যোগ করার জন্য প্রয়োজনীয় পদক্ষেপ এবং প্রচেষ্টার পরিমাণ বিশাল। এই নিবন্ধে, আমরা Istio কীভাবে পরিষেবাগুলি থেকে উপরে উল্লিখিত সমস্ত জটিলতা (ব্যবসায়িক যুক্তি দ্বারা লক্ষ্য নয়) সরিয়ে দেয় তা দেখব।
মন্তব্য: নিবন্ধটি অনুমান করে যে আপনার কুবারনেটস সম্পর্কে কাজের জ্ঞান রয়েছে৷ অন্যথায়, আমি পড়ার পরামর্শ দিই কুবারনেটসের সাথে আমার পরিচয় এবং শুধুমাত্র তারপর এই উপাদান পড়া চালিয়ে যান.
Istio ধারণা
Istio ছাড়া একটি বিশ্বে, একটি পরিষেবা অন্যের কাছে সরাসরি অনুরোধ করে, এবং ব্যর্থতার ক্ষেত্রে, পরিষেবাটি নিজেই এটি পরিচালনা করতে হবে: একটি নতুন প্রচেষ্টা করুন, একটি সময়সীমার জন্য প্রদান করুন, একটি সার্কিট ব্রেকার খুলুন, ইত্যাদি।
Kubernetes নেটওয়ার্ক ট্রাফিক
অন্যদিকে, Istio একটি বিশেষ সমাধান প্রদান করে যা নেটওয়ার্ক মিথস্ক্রিয়ায় হস্তক্ষেপ করে পরিষেবা এবং ফাংশন থেকে সম্পূর্ণ আলাদা। এবং এইভাবে এটি প্রয়োগ করে:
দোষ সহনশীলতা: প্রতিক্রিয়াতে স্ট্যাটাস কোডের উপর ভিত্তি করে, অনুরোধটি ব্যর্থ হয়েছে কিনা তা বুঝতে পারে এবং এটি পুনরায় জমা দেয়।
ক্যানারি রোলআউটস: পরিষেবার নতুন সংস্করণে অনুরোধের একটি নির্দিষ্ট শতাংশ রিডাইরেক্ট করে।
মনিটরিং এবং মেট্রিক্স: পরিষেবাটির প্রতিক্রিয়া জানাতে কতক্ষণ লেগেছিল?
ট্রেসিং এবং পর্যবেক্ষণযোগ্যতা: প্রতিটি অনুরোধে বিশেষ শিরোনাম যোগ করে এবং ক্লাস্টার জুড়ে তাদের ট্রেস করে।
নিরাপত্তা: একটি JWT টোকেন পুনরুদ্ধার করে, ব্যবহারকারীদের প্রমাণীকরণ এবং অনুমোদন করে।
এগুলি আপনাকে কৌতুহলী করার জন্য কয়েকটি সম্ভাবনার (সত্যিই মাত্র কয়েকটি!) এখন এর প্রযুক্তিগত বিবরণ মধ্যে ডুব দেওয়া যাক!
স্থাপত্য
Istio সমস্ত নেটওয়ার্ক ট্র্যাফিক বাধা দেয় এবং প্রতিটি পডের মধ্যে একটি সাইডকার কন্টেইনার আকারে একটি স্মার্ট প্রক্সি সন্নিবেশ করে এতে নিয়মের একটি সেট প্রয়োগ করে। সমস্ত সম্ভাবনা সক্রিয় করে এমন প্রক্সি গঠন করে a ডেটা প্লেন, এবং তাদের সাথে গতিশীলভাবে সামঞ্জস্য করা যেতে পারে কন্ট্রোল প্লেন.
ডেটা প্লেন
পডগুলিতে যে প্রক্সিগুলি ঢোকানো হয় তা ইস্টিওকে আমাদের প্রয়োজনীয় প্রয়োজনীয়তাগুলি সহজেই অর্জন করতে দেয়। উদাহরণস্বরূপ, আসুন পুনরায় চেষ্টা এবং সার্কিট ব্রেকার ফাংশনগুলি পরীক্ষা করি।
কিভাবে পুনরায় চেষ্টা এবং সার্কিট ব্রেকিং এনভয় প্রয়োগ করা হয়
সংক্ষিপ্ত আপ:
দূত (আমরা একটি সাইডকার কন্টেইনারে অবস্থিত একটি প্রক্সি সম্পর্কে কথা বলছি, যা বিতরণ করা হয় এবং কীভাবে পৃথক পণ্য - প্রায়. অনুবাদ।) পরিষেবা B এর প্রথম উদাহরণে একটি অনুরোধ পাঠায় এবং ব্যর্থ হয়।
দূত সাইডকার আবার চেষ্টা করছে (পুনরায় চেষ্টা করা). (1)
ব্যর্থ অনুরোধটি প্রক্সিতে ফেরত দেওয়া হয় যা এটিকে বলে।
এটি সার্কিট ব্রেকার খোলে এবং পরবর্তী অনুরোধের জন্য পরবর্তী পরিষেবাতে কল করে। (2)
এর মানে হল যে আপনাকে পরবর্তী পুনঃপ্রচার লাইব্রেরি ব্যবহার করতে হবে না, আপনাকে X, Y বা Z প্রোগ্রামিং ভাষায় সার্কিট ব্রেকিং এবং পরিষেবা আবিষ্কারের নিজস্ব বাস্তবায়ন করতে হবে না৷ এই সমস্ত এবং আরও অনেক কিছু পাওয়া যায় Istio মধ্যে বক্স এবং প্রয়োজন নেই কোন কোড পরিবর্তন।
দারুণ! এখন আপনি ইস্টিওর সাথে সমুদ্রযাত্রায় যেতে চাইতে পারেন, তবে এখনও কিছু সন্দেহ, খোলা প্রশ্ন রয়েছে। যদি এটি জীবনের সমস্ত অনুষ্ঠানের জন্য একটি সর্বজনীন সমাধান হয়, তবে আপনার একটি বৈধ সন্দেহ রয়েছে: সর্বোপরি, এই জাতীয় সমস্ত সমাধান আসলে কোনও ক্ষেত্রেই উপযুক্ত নয়।
এবং অবশেষে আপনি জিজ্ঞাসা করুন: "এটি কি কাস্টমাইজযোগ্য?"
এখন আপনি একটি সমুদ্র যাত্রার জন্য প্রস্তুত - এবং আসুন কন্ট্রোল প্লেনের সাথে পরিচিত হই।
কন্ট্রোল প্লেন
এটি তিনটি উপাদান নিয়ে গঠিত: চালক, মিশুক ব্যক্তি и দুর্গ, যা একসাথে দূতদের ট্রাফিক রুট করতে, নীতি প্রয়োগ করতে এবং টেলিমেট্রি ডেটা সংগ্রহ করতে কনফিগার করে। পরিকল্পিতভাবে, এটি সব এই মত দেখায়:
ডেটা প্লেনের সাথে কন্ট্রোল প্লেনের মিথস্ক্রিয়া
দূত (অর্থাৎ ডেটা প্লেন) এর সাথে কনফিগার করা হয়েছে কুবারনেটস সিআরডি (কাস্টম রিসোর্স সংজ্ঞা) Istio দ্বারা সংজ্ঞায়িত এবং বিশেষভাবে এই উদ্দেশ্যে ডিজাইন করা হয়েছে। এটি আপনার কাছে যা বোঝায় তা হল এগুলি একটি পরিচিত সিনট্যাক্স সহ Kubernetes-এর আরেকটি সম্পদ। একবার তৈরি হয়ে গেলে, এই সংস্থানটি নিয়ন্ত্রণ বিমান দ্বারা বাছাই করা হবে এবং দূতদের কাছে প্রয়োগ করা হবে।
Istio পরিষেবার সম্পর্ক
আমরা পরিষেবাগুলির সাথে ইস্টিওর সম্পর্ক বর্ণনা করেছি, তবে অন্যভাবে নয়: পরিষেবাগুলি কীভাবে ইস্টিওর সাথে সম্পর্কিত?
সত্যি কথা বলতে, পরিষেবাগুলি ইস্টিওর উপস্থিতি সম্পর্কে জানে এবং মাছগুলি জল সম্পর্কে জানে, যখন তারা নিজেদেরকে জিজ্ঞাসা করে: "যাইহোক জল কী?"।
এইভাবে, আপনি একটি ওয়ার্কিং ক্লাস্টার নিতে পারেন এবং Istio উপাদানগুলি স্থাপন করার পরে, এতে থাকা পরিষেবাগুলি কাজ করতে থাকবে এবং এই উপাদানগুলি সরানোর পরে, সবকিছু আবার ঠিক হয়ে যাবে। এটা স্পষ্ট যে এই ক্ষেত্রে আপনি Istio দ্বারা প্রদত্ত সুযোগগুলি হারাবেন।
যথেষ্ট তত্ত্ব - চলুন এই জ্ঞান অনুশীলন করা যাক!
অনুশীলনে ইসটিও
Istio-এর জন্য কমপক্ষে 4টি vCPU এবং 8 GB RAM উপলব্ধ সহ একটি Kubernetes ক্লাস্টার প্রয়োজন৷ ক্লাস্টার দ্রুত বাড়াতে এবং নিবন্ধ থেকে নির্দেশাবলী অনুসরণ করতে, আমি Google ক্লাউড প্ল্যাটফর্ম ব্যবহার করার পরামর্শ দিই, যা নতুন ব্যবহারকারীদের অফার করে বিনামূল্যে $300.
ক্লাস্টার তৈরি করার পরে এবং কনসোল ইউটিলিটির মাধ্যমে Kubernetes-এ অ্যাক্সেস সেট আপ করার পরে, আপনি Helm প্যাকেজ ম্যানেজারের মাধ্যমে Istio ইনস্টল করতে পারেন।
হেলম ইনস্টলেশন
আপনার কম্পিউটারে হেলম ক্লায়েন্ট ইনস্টল করুন যেমন বর্ণনা করা হয়েছে অফিসিয়াল ডকুমেন্টেশন. আমরা পরবর্তী বিভাগে Istio ইনস্টল করার জন্য টেমপ্লেট তৈরি করতে এটি ব্যবহার করব।
স্থাপন
থেকে Istio সংস্থান ডাউনলোড করুন সর্বশেষ রিলিজ(সংস্করণ 1.0.5-এর মূল লেখকের লিঙ্কটি বর্তমানটিতে পরিবর্তন করা হয়েছে, অর্থাৎ 1.0.6 - প্রায় অনুবাদ।), একটি একক ডিরেক্টরিতে বিষয়বস্তু বের করুন, যা আমি উল্লেখ করব [istio-resources].
Istio সংস্থানগুলির সহজে সনাক্তকরণের জন্য, K8s ক্লাস্টারে একটি নামস্থান তৈরি করুন istio-system:
$ kubectl create namespace istio-system
ডিরেক্টরিতে নেভিগেট করে ইনস্টলেশন সম্পূর্ণ করুন [istio-resources] এবং কমান্ড চালাচ্ছে:
এই কমান্ডটি একটি ফাইলে Istio এর মূল উপাদানগুলিকে আউটপুট করবে istio.yaml. আমরা নিম্নলিখিত পরামিতিগুলি নির্দিষ্ট করে নিজেদের জন্য আদর্শ টেমপ্লেটটি সংশোধন করেছি:
global.mtls.enabled ইনস্টল করা false(যেমন mTLS প্রমাণীকরণ নিষ্ক্রিয় করা হয়েছে - প্রায় অনুবাদ।)আমাদের ডেটিং প্রক্রিয়া সহজ করতে;
tracing.enabled Jaeger এর সাথে অনুরোধ ট্রেসিং সক্ষম করে;
kiali.enabled সেবা এবং ট্রাফিক কল্পনা করার জন্য একটি ক্লাস্টারে কিয়ালি ইনস্টল করে;
grafana.enabled সংগৃহীত মেট্রিক্স কল্পনা করতে Grafana ইনস্টল করে।
কমান্ড দিয়ে উত্পন্ন সম্পদ প্রয়োগ করুন:
$ kubectl apply -f istio.yaml
ক্লাস্টারে ইস্টিও ইনস্টলেশন সম্পূর্ণ! নামস্থানে সমস্ত পড না হওয়া পর্যন্ত অপেক্ষা করুন istio-system সক্ষম হবে Running বা Completedনীচের কমান্ড চালানোর মাধ্যমে:
$ kubectl get pods -n istio-system
আমরা এখন পরবর্তী বিভাগে যাওয়ার জন্য প্রস্তুত, যেখানে আমরা আবেদনটি উত্থাপন করব এবং চালাব।
সেন্টিমেন্ট অ্যানালাইসিস অ্যাপ্লিকেশন আর্কিটেকচার
ইতিমধ্যে উল্লিখিত সেন্টিমেন্ট অ্যানালাইসিস মাইক্রোসার্ভিস অ্যাপ্লিকেশনটির উদাহরণ ব্যবহার করা যাক কুবারনেটসের ভূমিকা নিবন্ধ. অনুশীলনে ইস্টিওর সম্ভাবনাগুলি দেখানোর জন্য এটি যথেষ্ট জটিল।
অ্যাপ্লিকেশনটি চারটি মাইক্রোসার্ভিস নিয়ে গঠিত:
সেবা SA-ফ্রন্টেন্ড, যা Reactjs-এ ফ্রন্ট-এন্ড অ্যাপ্লিকেশন পরিবেশন করে;
সেবা এসএ ওয়েব অ্যাপ, যা সেন্টিমেন্ট অ্যানালাইসিস প্রশ্নগুলি পরিবেশন করে;
সেবা এসএ প্রতিক্রিয়া, যা সম্পাদিত বিশ্লেষণের নির্ভুলতার উপর ব্যবহারকারীদের কাছ থেকে প্রতিক্রিয়া পায়।
এই ডায়াগ্রামে, পরিষেবাগুলি ছাড়াও, আমরা ইনগ্রেস কন্ট্রোলারও দেখতে পাই, যা কুবারনেটসে সংশ্লিষ্ট পরিষেবাগুলিতে আগত অনুরোধগুলিকে রুট করে। ইস্টিও ইনগ্রেস গেটওয়ের অংশ হিসাবে অনুরূপ ধারণা ব্যবহার করে, যার বিবরণ অনুসরণ করা হবে।
Istio থেকে একটি প্রক্সি সহ একটি অ্যাপ্লিকেশন চালু করা হচ্ছে
নিবন্ধে উল্লিখিত আরও ক্রিয়াকলাপের জন্য, আপনার সংগ্রহস্থল ক্লোন করুন istio- mastery. এটি Kubernetes এবং Istio এর জন্য অ্যাপ্লিকেশন এবং ম্যানিফেস্ট ধারণ করে।
সাইডকার ঢোকানো
সন্নিবেশ করা যেতে পারে স্বয়ংক্রিয়ভাবে বা ম্যানুয়ালি. সাইডকার পাত্রে স্বয়ংক্রিয়ভাবে সন্নিবেশ করতে, আপনাকে নামস্থানে লেবেল সেট করতে হবে istio-injection=enabled, যা নিম্নলিখিত কমান্ড দ্বারা সম্পন্ন হয়:
এখন প্রতিটি পড ডিফল্ট নামস্থানে স্থাপন করা হবে (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-তে, যা ক্লাস্টারের "প্রান্তে" অবস্থিত এবং আপনাকে ইস্টিও বৈশিষ্ট্যগুলি যেমন রাউটিং, লোড ব্যালেন্সিং, নিরাপত্তা, এবং ইনকামিং ট্র্যাফিকের জন্য পর্যবেক্ষণ সক্ষম করতে দেয়৷
ইনগ্রেস গেটওয়ে কম্পোনেন্ট এবং পরিষেবা যা এটিকে বাইরের দিকে এগিয়ে দেয় তা ইস্টিও ইনস্টলেশনের সময় ক্লাস্টারে ইনস্টল করা হয়েছিল। একটি পরিষেবার বাহ্যিক আইপি ঠিকানা খুঁজে বের করতে, চালান:
$ 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
আমরা এই আইপি ব্যবহার করে অ্যাপ্লিকেশনটি অ্যাক্সেস করতে থাকব (আমি এটিকে বাহ্যিক-আইপি হিসাবে উল্লেখ করব), তাই সুবিধার জন্য, আমরা একটি পরিবর্তনশীলের মান লিখব:
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
আপনি যদি এখন ব্রাউজারের মাধ্যমে এই আইপি অ্যাক্সেস করার চেষ্টা করেন, তাহলে আপনি একটি পরিষেবা অনুপলব্ধ ত্রুটি পাবেন, কারণ ডিফল্টরূপে Istio সমস্ত আগত ট্র্যাফিক ব্লক করেযতক্ষণ না গেটওয়ে সংজ্ঞায়িত করা হয়।
গেটওয়ে সম্পদ
গেটওয়ে হল Kubernetes-এর একটি CRD (কাস্টম রিসোর্স ডেফিনিশন), যা একটি ক্লাস্টারে Istio ইনস্টল করার পরে এবং পোর্ট, প্রোটোকল এবং হোস্ট নির্দিষ্ট করার ক্ষমতা সক্ষম করার পরে সংজ্ঞায়িত করা হয় যার জন্য আমরা ইনকামিং ট্রাফিকের অনুমতি দিতে চাই।
আমাদের ক্ষেত্রে, আমরা সমস্ত হোস্টের জন্য পোর্ট 80-এ HTTP ট্র্যাফিকের অনুমতি দিতে চাই। সমস্যাটি নিম্নলিখিত সংজ্ঞা দ্বারা উপলব্ধি করা হয় (http-gateway.yaml):
নির্বাচক ছাড়া এই কনফিগারেশনের কোন ব্যাখ্যার প্রয়োজন নেই istio: ingressgateway. এই নির্বাচকের সাহায্যে, আমরা নির্দিষ্ট করতে পারি কোন ইনগ্রেস গেটওয়েতে কনফিগারেশন প্রয়োগ করতে হবে। আমাদের ক্ষেত্রে, এটি হল ইনগ্রেস গেটওয়ে কন্ট্রোলার, যা ইস্টিওতে ডিফল্টরূপে ইনস্টল করা হয়েছিল।
নিম্নলিখিত কমান্ডটি কল করে কনফিগারেশন প্রয়োগ করা হয়:
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created
গেটওয়েটি এখন পোর্ট 80-এ অ্যাক্সেসের অনুমতি দেয় কিন্তু অনুরোধগুলি কোথায় রুট করতে হবে তার কোন ধারণা নেই। এই জন্য আপনার প্রয়োজন হবে ভার্চুয়াল পরিষেবা.
ভার্চুয়াল পরিষেবা সংস্থান
ভার্চুয়াল সার্ভিস ইনগ্রেস গেটওয়েকে বলে যে কীভাবে ক্লাস্টারের মধ্যে অনুমোদিত অনুরোধগুলিকে রুট করতে হয়।
http-গেটওয়ের মাধ্যমে আসা আমাদের আবেদনের অনুরোধগুলি অবশ্যই sa-frontend, sa-web-app এবং sa-feedback পরিষেবাগুলিতে পাঠাতে হবে:
ভার্চুয়াল সার্ভিসের সাথে কনফিগার করা রুট
SA-Frontend-এ পাঠানো অনুরোধগুলি বিবেচনা করুন:
পথ বরাবর সঠিক মিল / index.html পেতে SA-Frontend-এ পাঠাতে হবে;
একটি উপসর্গ সহ পাথ /static/* ফ্রন্টএন্ডে ব্যবহৃত স্ট্যাটিক ফাইলগুলি পেতে SA-ফ্রন্টেন্ডে পাঠানো উচিত, যেমন CSS এবং JavaScript;
রেগুলার এক্সপ্রেশনের সাথে মেলে পাথ '^.*.(ico|png|jpg)$', অবশ্যই SA-Frontend-এ পাঠাতে হবে, কারণ এই পৃষ্ঠায় প্রদর্শিত ছবি.
Этот VirtualService относится к запросам, приходящим через http-gateway;
В 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-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.
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, чтобы посмотреть на собранные метрики:
Здесь нас ждёт пустое и совершенно скучное представление — руководство никогда такое не одобрит. Давайте же создадим небольшую нагрузку следующей командой:
$ 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 : трассировка
Трассировка нам потребуется, потому что чем больше у нас сервисов, тем сложнее добраться до причины сбоя. Посмотрим на простой случай из картинки ниже:
Типовой пример случайного неудачного запроса
Запрос приходит, падает — в чём же причина? Первый сервис? Или второй? Исключения есть в обоих — давайте посмотрим на логи каждого. Как часто вы ловили себя за таким занятием? Наша работа больше похожа на детективов программного обеспечения, а не разработчиков…
Это широко распространённая проблема в микросервисах и решается она распределёнными системами трассировки, в которых сервисы передают друг другу уникальный заголовок, после чего эта информация перенаправляется в систему трассировки, где она сопоставляется с данными запроса. Вот иллюстрация:
Для идентификации запроса используется 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-ingressgateway (это первое взаимодействие с одним из сервисов, и для запроса генерируется Trace ID), после чего шлюз направляет запрос в сервис sa-web-app.
В сервисе sa-web-app запрос подхватывается Envoy sidecar'ом, создаётся «ребёнок» в span'е (поэтому мы видим его в трейсах) и перенаправляется в контейнер sa-web-app. (Span — логическая единица работы в Jaeger, имеющая название, время начало операции и её продолжительность. Span'ы могут быть вложенными и упорядоченными. Ориентированный ациклический граф из span'ов образует trace. — прим. перев.)
Здесь запрос обрабатывается методом sentimentAnalysis. Эти трейсы уже сгенерированы приложением, т.е. для них потребовались изменения в коде.
С этого момента инициируется POST-запрос в sa-logic. Trace ID должен быть проброшен из sa-web-app.
…
Примечание: На 4 шаге приложение должно увидеть заголовки, сгенерированные Istio, и передать их в последующие запросы, как показано на изображении ниже:
(A) За проброс заголовков отвечает Istio; (B) За заголовки отвечают сервисы
Istio делает основную работу, т.к. генерирует заголовки для входящих запросов, создаёт новые span'ы в каждом sidecare'е и пробрасывает их. Однако без работы с заголовками внутри сервисов полный путь трассировки запроса будет утерян.
Необходимо учитывать (пробрасывать) следующие заголовки:
Это несложная задача, однако для упрощения её реализации уже существует множество библиотек — например, в сервисе sa-web-app клиент RestTemplate пробрасывает эти заголовки, если просто добавить библиотеки Jaeger и OpenTracing в его зависимости.
Заметьте, что приложение Sentiment Analysis демонстрирует реализации на Flask, Spring и ASP.NET Core.
Теперь, когда стало ясно, что мы получаем из коробки (или почти «из коробки»), рассмотрим вопросы тонко настраиваемой маршрутизации, управления сетевым трафиком, безопасности и т.п.!
Прим. перев.: об этом читайте в следующей части материалов по Istio от Rinor Maloku, переводы которых последуют в нашем блоге в ближайшее время. UPDATE (14 марта): Вторая часть уже опубликована.
এই ভার্চুয়াল সার্ভিসের মাধ্যমে আসা অনুরোধগুলি বোঝায় http- গেটওয়ে;
В destination যে পরিষেবাতে অনুরোধ পাঠানো হয় তা সংজ্ঞায়িত করে।
মন্তব্য: উপরের কনফিগারেশনটি একটি ফাইলে সংরক্ষিত আছে sa-virtualservice-external.yaml, যা SA-WebApp এবং SA-প্রতিক্রিয়াতে রাউটিং করার জন্য সেটিংসও ধারণ করে, কিন্তু সংক্ষিপ্ততার জন্য নিবন্ধে এখানে সংক্ষিপ্ত করা হয়েছে।
কল করে VirtualService প্রয়োগ করুন:
মন্তব্য: যখন আমরা ইস্টিও রিসোর্স প্রয়োগ করি, তখন কুবারনেটস এপিআই সার্ভার একটি ইভেন্ট ফায়ার করে যা ইস্টিও কন্ট্রোল প্লেন পায় এবং তার পরে, প্রতিটি পডের এনভয় প্রক্সিতে নতুন কনফিগারেশন প্রয়োগ করা হয়। এবং ইনগ্রেস গেটওয়ে কন্ট্রোলার কন্ট্রোল প্লেনে কনফিগার করা অন্য দূত বলে মনে হচ্ছে। এই সব চিত্রের মত দেখায়:
অনুরোধ রাউটিং এর জন্য Istio-IngressGateway কনফিগারেশন
সেন্টিমেন্ট অ্যানালাইসিস এখন পাওয়া যাচ্ছে http://{EXTERNAL-IP}/. আপনি যদি নট ফাউন্ড স্ট্যাটাস পান তবে চিন্তা করবেন না: কখনও কখনও কনফিগারেশন কার্যকর হতে এবং এনভয় ক্যাশে আপডেট হতে একটু বেশি সময় লাগে.
এগিয়ে যাওয়ার আগে, ট্র্যাফিক তৈরি করতে অ্যাপ্লিকেশনটির সাথে একটু খেলুন (পরবর্তী ক্রিয়ায় স্পষ্টতার জন্য এর উপস্থিতি প্রয়োজনীয় - প্রায় অনুবাদ।).
…এবং খুলুন http://localhost:20001/অ্যাডমিন/অ্যাডমিন হিসেবে লগ ইন করে। এখানে আপনি অনেক দরকারী বৈশিষ্ট্য পাবেন, উদাহরণস্বরূপ, Istio উপাদানগুলির কনফিগারেশন পরীক্ষা করা, নেটওয়ার্ক অনুরোধগুলিকে বাধা দিয়ে সংগৃহীত তথ্য থেকে পরিষেবাগুলিকে কল্পনা করা, "কে কার সাথে যোগাযোগ করছে?", "পরিষেবার কোন সংস্করণটি অনুভব করছে" এই প্রশ্নের উত্তর পান ব্যর্থতা?" এবং তাই সাধারণভাবে, Grafana-এর সাথে মেট্রিক্স ভিজ্যুয়ালাইজ করার জন্য এগিয়ে যাওয়ার আগে Kiali-এর সম্ভাবনাগুলি অন্বেষণ করুন।
গ্রাফানা: মেট্রিক্সের ভিজ্যুয়ালাইজেশন
ইস্টিওতে সংগৃহীত মেট্রিকগুলি প্রমিথিউসে শেষ হয় এবং গ্রাফানা দিয়ে কল্পনা করা হয়। Grafana অ্যাডমিন ইন্টারফেসে যেতে, নীচের কমান্ডটি চালান, তারপর খুলুন http://localhost:3000/:
মেনুতে ক্লিক করে হোম উপরে বাম এবং নির্বাচন করুন Istio পরিষেবা ড্যাশবোর্ড উপরের বাম কোণে, পরিষেবা দিয়ে শুরু করুন sa-ওয়েব-অ্যাপসংগৃহীত মেট্রিক্স দেখতে:
এখানে আমরা একটি খালি এবং সম্পূর্ণ বিরক্তিকর পারফরম্যান্সের জন্য অপেক্ষা করছি - ব্যবস্থাপনা কখনই এটি অনুমোদন করবে না। নিম্নলিখিত কমান্ডের সাহায্যে একটি ছোট লোড তৈরি করা যাক:
এখন আমাদের কাছে অনেক সুন্দর গ্রাফ রয়েছে, এবং সেগুলি ছাড়াও, নিরীক্ষণের জন্য প্রমিথিউস এবং মেট্রিক্সকে ভিজ্যুয়ালাইজ করার জন্য গ্রাফানা চমৎকার টুলস, যা আমাদের কর্মক্ষমতা, স্বাস্থ্যের অবস্থা, সময়ের সাথে সাথে পরিষেবার উন্নতি/অবক্ষয় সম্পর্কে জানতে সাহায্য করবে।
পরিশেষে, আসুন পরিষেবাগুলিতে অনুরোধের সন্ধান করা যাক।
জায়েগার: ট্রেসিং
আমাদের ট্রেসিংয়ের প্রয়োজন হবে, কারণ আমাদের যত বেশি পরিষেবা আছে, ব্যর্থতার কারণ খুঁজে পাওয়া তত বেশি কঠিন। আসুন নীচের ছবিটি থেকে একটি সাধারণ কেস দেখি:
একটি এলোমেলো ব্যর্থ অনুরোধের সাধারণ উদাহরণ
অনুরোধ আসে, পড়ে- কারণ কি? প্রথম সেবা? নাকি দ্বিতীয়? উভয় ক্ষেত্রেই ব্যতিক্রম আছে - আসুন প্রতিটির লগ দেখি। কতবার আপনি নিজেকে এই কাজ ধরা আছে? আমাদের কাজটি বিকাশকারীদের চেয়ে সফ্টওয়্যার গোয়েন্দাদের মতো…
মাইক্রোসার্ভিসে এটি একটি বিস্তৃত সমস্যা এবং এটি বিতরণ করা ট্রেসিং সিস্টেম দ্বারা সমাধান করা হয়, যেখানে পরিষেবাগুলি একে অপরের কাছে একটি অনন্য শিরোনাম প্রেরণ করে, যার পরে এই তথ্যটি ট্রেসিং সিস্টেমে পুনঃনির্দেশিত হয়, যেখানে এটি অনুরোধের ডেটার সাথে তুলনা করা হয়। এখানে একটি দৃষ্টান্ত আছে:
অনুরোধ সনাক্ত করতে TraceId ব্যবহার করা হয়
Istio Jaeger Tracer ব্যবহার করে, যা একটি বিক্রেতা-স্বাধীন OpenTracing API ফ্রেমওয়ার্ক প্রয়োগ করে। আপনি নিম্নলিখিত কমান্ডের সাহায্যে Jaeger ব্যবহারকারী ইন্টারফেস অ্যাক্সেস করতে পারেন:
এখন যান http://localhost:16686/ এবং একটি পরিষেবা নির্বাচন করুন sa-ওয়েব-অ্যাপ. যদি পরিষেবাটি ড্রপডাউন মেনুতে দেখানো না হয়, পৃষ্ঠায় কার্যকলাপ দেখান/জেনারেট করুন এবং ইন্টারফেস আপডেট করুন। এর পর বাটনে ক্লিক করুন ট্রেস খুঁজুন, যা সাম্প্রতিকতম ট্রেসগুলি দেখাবে - যেকোনো নির্বাচন করুন - সমস্ত ট্রেসের বিস্তারিত তথ্য উপস্থিত হবে:
এই ট্রেস দেখায়:
অনুরোধ আসে istio-ইনগ্রেসগেটওয়ে (এটি পরিষেবাগুলির মধ্যে একটির সাথে প্রথম মিথস্ক্রিয়া, এবং অনুরোধের জন্য একটি ট্রেস আইডি তৈরি করা হয়), এর পরে গেটওয়ে পরিষেবাটিতে অনুরোধ পাঠায় sa-ওয়েব-অ্যাপ.
সেবা sa-ওয়েব-অ্যাপ অনুরোধটি এনভয় সাইডকার দ্বারা নেওয়া হয়, স্প্যানে একটি "শিশু" তৈরি করা হয় (তাই আমরা এটিকে চিহ্নগুলিতে দেখতে পাই) এবং কন্টেইনারে পুনঃনির্দেশিত করা হয় sa-ওয়েব-অ্যাপ. (বিঘত - জাইগারে কাজের একটি যৌক্তিক ইউনিট, যার একটি নাম, অপারেশন শুরুর সময় এবং এর সময়কাল রয়েছে। স্প্যানগুলি নেস্ট করা এবং অর্ডার করা যেতে পারে। স্প্যানগুলির একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ একটি ট্রেস গঠন করে। - প্রায়. অনুবাদ।)
এখানে অনুরোধ পদ্ধতি দ্বারা প্রক্রিয়া করা হয় অনুভূতির বিশ্লেষণ. এই ট্রেসগুলি ইতিমধ্যেই অ্যাপ্লিকেশন দ্বারা তৈরি করা হয়েছে, যেমন তারা কোড পরিবর্তন প্রয়োজন.
এই মুহূর্ত থেকে, একটি পোস্ট অনুরোধ শুরু করা হয় সা-যুক্তি. ট্রেস আইডি থেকে ফরোয়ার্ড করতে হবে sa-ওয়েব-অ্যাপ.
...
মন্তব্য: ধাপ 4-এ, অ্যাপ্লিকেশনটি Istio দ্বারা উত্পন্ন শিরোনামগুলি দেখতে পাবে এবং সেগুলিকে পরবর্তী অনুরোধগুলিতে প্রেরণ করবে, যেমনটি নীচের ছবিতে দেখানো হয়েছে:
(ক) হেডার ফরওয়ার্ডিং ইস্টিওর দায়িত্ব; (খ) পরিষেবাগুলি হেডারগুলির জন্য দায়ী৷
Istio কাজ বাল্ক করে কারণ ইনকামিং অনুরোধের জন্য হেডার তৈরি করে, প্রতিটি সাইডকেয়ারে নতুন স্প্যান তৈরি করে এবং সেগুলিকে ফরোয়ার্ড করে। যাইহোক, পরিষেবাগুলির ভিতরে শিরোনামগুলির সাথে কাজ না করে, সম্পূর্ণ অনুরোধের ট্রেস পথটি হারিয়ে যাবে৷
নিম্নলিখিত শিরোনাম বিবেচনা করা আবশ্যক (ফরোয়ার্ড করা):
এটি একটি সহজ কাজ, তবে এর বাস্তবায়নকে সহজ করার জন্য, ইতিমধ্যেই রয়েছে অনেক লাইব্রেরি - উদাহরণস্বরূপ, sa-web-app পরিষেবাতে, RestTemplate ক্লায়েন্ট এই শিরোনামগুলিকে ফরোয়ার্ড করে যদি আপনি কেবল Jaeger এবং OpenTracing লাইব্রেরি যোগ করেন এর নির্ভরতা.
মনে রাখবেন যে সেন্টিমেন্ট অ্যানালাইসিস অ্যাপ্লিকেশনটি ফ্লাস্ক, স্প্রিং এবং ASP.NET কোরে বাস্তবায়ন প্রদর্শন করে।
এখন এটা পরিষ্কার যে আমরা বাক্সের বাইরে কী পাচ্ছি (বা প্রায় বাক্সের বাইরে), আসুন ফাইন-টিউনিং রাউটিং, নেটওয়ার্ক ট্রাফিক ব্যবস্থাপনা, নিরাপত্তা এবং আরও অনেক কিছু দেখি!
বিঃদ্রঃ. অনুবাদ: রিনর মালোকু থেকে ইসটিওতে উপকরণের পরবর্তী অংশে এটি সম্পর্কে পড়ুন, যার অনুবাদগুলি অদূর ভবিষ্যতে আমাদের ব্লগে অনুসরণ করবে৷ হালনাগাদ (১৪ মার্চ): দ্বিতীয় অংশ ইতিমধ্যে প্রকাশিত।