1. স্বাগতম
গুগলের ইস্টিও মাল্টি ক্লাউড বার্স্ট কোডল্যাবে আমাদের সাথে যোগ দেওয়ার জন্য ধন্যবাদ৷ এই কোডল্যাবের জন্য কুবারনেটস, নোড এবং গো-এর সাথে শিক্ষানবিস-স্তরের অভিজ্ঞতা প্রয়োজন৷ আপনি কি প্রয়োজন হবে
|
|
যা শিখবেন
- কিভাবে GKE তে একটি কুবারনেটস ক্লাস্টার তৈরি করবেন
- হেলমের সাথে কুবারনেটস ক্লাস্টারে কীভাবে ইস্টিও ইনস্টল করবেন
- হেলমের সাহায্যে কীভাবে ইস্টিও মাল্টিক্লাস্টার ইনস্টল করবেন
- উৎস থেকে Kubernetes এ একটি ওয়েব অ্যাপ্লিকেশন স্থাপন করা হচ্ছে
- ইস্টিওতে ট্রাফিক রাউটিং নিয়ম লেখা এবং প্রয়োগ করা
- প্রমিথিউস মেট্রিক্স
- একটি Kubernetes ক্লাস্টারের ভিতরে ধারক চিত্রগুলি তৈরি করুন এবং পুশ করুন৷
2. সেট আপ করা হচ্ছে
আপনি যেকোনো একটিতে এই কোডল্যাব অনুসরণ করতে পারেন:
- গুগল ক্লাউড শেল (প্রস্তাবিত) : ইন-ব্রাউজার শেল, ইনস্টল করা সরঞ্জামগুলির সাথে আসে
- আপনার ল্যাপটপ (নীচের নির্দেশাবলী অনুসরণ করুন)
গুগল ক্লাউড প্ল্যাটফর্ম দিয়ে শুরু করুন
- আপনার যদি GCP অ্যাকাউন্ট না থাকে তাহলে প্রশিক্ষকের কাছ থেকে আপনার বিনামূল্যের ব্যবহারকারী অ্যাকাউন্ট কার্ডটি নিন।
- Google ক্লাউড কনসোলে যান এবং "একটি প্রকল্প নির্বাচন করুন" এ ক্লিক করুন:

- কোথাও প্রকল্পের "আইডি" একটি নোট করুন , তারপর এটি নির্বাচন করতে প্রকল্পটিতে ক্লিক করুন:

বিকল্প 1: Google ক্লাউড শেল ব্যবহার করুন (প্রস্তাবিত)
ক্লাউড শেল আপনার ব্রাউজারের ভিতরে আপনার Google ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্টে ইনস্টল করা এবং স্বয়ংক্রিয়ভাবে প্রমাণীকৃত সরঞ্জামগুলির সাথে একটি কমান্ড-লাইন শেল প্রদান করে। (আপনি যদি ক্লাউড শেলে এই অনুশীলনটি চালাতে না চান তবে পরবর্তী বিভাগে যান।)
ক্লাউড কনসোলে যান এবং উপরের ডানদিকে টুলবারে "ক্লাউড শেল সক্রিয় করুন" এ ক্লিক করুন:

ক্লাউড শেল-এ টুল যোগ করুন
-
kubectx**** ইনস্টল করুন : এখান থেকে $PATH-এ একটি অবস্থানে ব্যাশ স্ক্রিপ্ট ডাউনলোড করে। -
helmইনস্টল করুন ****: এই নির্দেশাবলী অনুসরণ করুন।
বিকল্পভাবে ~/.bin এ উভয়ই ইনস্টল করতে এবং আপনার $PATH-এ যোগ করতে এই কমান্ডগুলি চালান:
mkdir -p ~/.bin && \
cd ~/.bin && \
curl -LO https://raw.githubusercontent.com/ahmetb/kubectx/master/kubectx && \
chmod +x kubectx && \
curl -LO https://raw.githubusercontent.com/ahmetb/kubectx/master/kubens && \
chmod +x kubens && \
curl -LO https://storage.googleapis.com/kubernetes-helm/helm-v2.12.0-linux-amd64.tar.gz && \
tar xzf helm-v2.12.0-linux-amd64.tar.gz && \
rm helm-v2.12.0-linux-amd64.tar.gz && \
mv linux-amd64/helm ./helm && \
rm -r linux-amd64 && \
export PATH=${HOME}/.bin:${PATH}
কিছু দ্রুত টিপস যা ক্লাউড শেল ব্যবহার করা সহজ করে তুলতে পারে:
1. একটি নতুন উইন্ডোতে শেলটি বিচ্ছিন্ন করুন: |
|
2. ফাইল এডিটর ব্যবহার করা: একটি ইন-ব্রাউজার ফাইল এডিটর চালু করতে উপরের ডানদিকে পেন্সিল আইকনে ক্লিক করুন। আমরা কোড স্নিপেটগুলি ফাইলগুলিতে অনুলিপি করব বলে আপনি এটি দরকারী বলে মনে করবেন। |
|
3. নতুন ট্যাব শুরু করুন: আপনার যদি একাধিক টার্মিনাল প্রম্পটের প্রয়োজন হয়। |
|
4. টেক্সট বড় করুন: ক্লাউড শেলের ডিফল্ট ফন্ট সাইজ পড়ার জন্য খুব ছোট হতে পারে। | MacOS-এ Linux/Windows⌘-+-এ Ctrl-+। |
বিকল্প 2: আপনার ল্যাপটপ সেট আপ করুন (প্রস্তাবিত নয়)
আপনি যদি ক্লাউড শেল থেকে আপনার নিজস্ব ওয়ার্কস্টেশন পরিবেশ ব্যবহার করে বেশি স্বাচ্ছন্দ্য বোধ করেন তবে নিম্নলিখিত সরঞ্জামগুলি সেট আপ করুন:
- জিক্লাউড ইনস্টল করুন
gcloud:(ক্লাউড শেলে প্রি-ইনস্টল।) আপনার প্ল্যাটফর্মেgcloudইনস্টল করতে নির্দেশাবলী অনুসরণ করুন । আমরা এটি একটি কুবারনেটস ক্লাস্টার তৈরি করতে ব্যবহার করব। -
kubectl:ইন্সটল করুন : (ক্লাউড শেলে প্রি-ইন্সটল।) ইন্সটল করতে নিম্নলিখিত কমান্ডটি চালান:
gcloud components install kubectl
gcloud প্রমাণীকরণ করতে নিম্নলিখিত কমান্ডটি চালান। এটি আপনাকে আপনার Google অ্যাকাউন্ট দিয়ে লগ ইন করতে বলবে। তারপরে, ডিফল্ট প্রকল্প হিসাবে পূর্ব-তৈরি প্রকল্প (উপরে দেখা গেছে) নির্বাচন করুন। (আপনি একটি কম্পিউট জোন কনফিগার করা এড়িয়ে যেতে পারেন):
gcloud init
-
curl:ইনস্টল করুন : বেশিরভাগ Linux/macOS সিস্টেমে আগে থেকে ইনস্টল করা আছে। আপনি সম্ভবত এটি ইতিমধ্যে আছে. অন্যথায়, কীভাবে এটি ইনস্টল করতে হয় সে সম্পর্কে ইন্টারনেটে অনুসন্ধান করুন। -
kubectxইন্সটল করুন ****: এখান থেকে ব্যাশ স্ক্রিপ্ট ডাউনলোড করে $PATH-এ একটি অবস্থানে -
helmইনস্টল করুন ****: এই নির্দেশাবলী অনুসরণ করুন।
3. GCP প্রকল্প সেটআপ করুন
আপনার প্রোজেক্টে GKE (Google Kubernetes Engine), GCR (Google কন্টেইনার রেজিস্ট্রি), এবং GCB (Google ক্লাউড বিল্ড) এপিআই সক্ষম করুন:
gcloud services enable \ cloudapis.googleapis.com \ container.googleapis.com \ containerregistry.googleapis.com \ cloudbuild.googleapis.com
এনভায়রনমেন্ট ভেরিয়েবল সেট আপ করুন
সেটআপের সময় আমরা আমাদের Google ক্লাউড প্রকল্পের সাথে ব্যাপকভাবে কাজ করব, আসুন দ্রুত রেফারেন্সের জন্য একটি পরিবেশ পরিবর্তনশীল সেট করি
export GCLOUD_PROJECT=$(gcloud config get-value project)
আমরা এই ওয়ার্কশপের সময় কিছু কোড এবং কনফিগারেশন ফাইল তৈরি করব তাই আসুন একটি প্রজেক্ট ডিরেক্টরি তৈরি করি এবং এতে পরিবর্তন করি
mkdir -p src/istio-burst && \ cd src/istio-burst && \ export proj=$(pwd)
4. "প্রাথমিক" Kubernetes ক্লাস্টার তৈরি করুন
আপনি Google Kubernetes Engine (GKE) দিয়ে সহজেই পরিচালিত Kubernetes ক্লাস্টার তৈরি করতে পারেন।
নিম্নলিখিত কমান্ড একটি Kubernetes ক্লাস্টার তৈরি করবে:
- নাম "প্রাথমিক",
- us-west1-a জোনে,
- Kubernetes এর সর্বশেষ সংস্করণ উপলব্ধ,
- 4টি প্রাথমিক নোড সহ
export cluster=primary
export zone=us-west1-a
gcloud container clusters create $cluster --zone $zone --username "admin" \
--cluster-version latest --machine-type "n1-standard-2" \
--image-type "COS" --disk-size "100" \
--scopes "https://www.googleapis.com/auth/compute",\
"https://www.googleapis.com/auth/devstorage.read_only",\
"https://www.googleapis.com/auth/logging.write",\
"https://www.googleapis.com/auth/monitoring",\
"https://www.googleapis.com/auth/servicecontrol",\
"https://www.googleapis.com/auth/service.management.readonly",\
"https://www.googleapis.com/auth/trace.append" \
--num-nodes "4" --network "default" \
--enable-cloud-logging --enable-cloud-monitoring --enable-ip-alias
(এতে প্রায় 5 মিনিট সময় লাগতে পারে। আপনি ক্লাউড কনসোলে তৈরি হওয়া ক্লাস্টারটি দেখতে পারেন।)
Kubernetes ক্লাস্টার তৈরি হওয়ার পরে, gcloud ক্লাস্টারের দিকে নির্দেশ করে শংসাপত্রের সাথে kubectl কনফিগার করে।
gcloud container clusters get-credentials $cluster --zone=$zone
আপনি এখন আপনার নতুন ক্লাস্টারের সাথে kubectl ব্যবহার করতে সক্ষম হবেন।
আপনার ক্লাস্টারের কুবারনেটস নোডগুলি তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালান (তাদের "প্রস্তুত" অবস্থা দেখাতে হবে):
kubectl get nodes
ব্যবহারের সুবিধার জন্য Kubeconfig নাম পরিবর্তন করুন
আমরা ঘন ঘন প্রসঙ্গগুলির মধ্যে স্যুইচ করব তাই আমাদের ক্লাস্টারগুলির জন্য একটি ছোট উপনাম থাকা সহজ।
এই কমান্ডটি আপনার তৈরি করা kubeconfig এন্ট্রির নাম পরিবর্তন করবে primary
kubectx ${cluster}=gke_${GCLOUD_PROJECT}_${zone}_${cluster}
অনুমতি সেট করুন:
Istio স্থাপনের জন্য আপনাকে ক্লাস্টার অ্যাডমিন হতে হবে। এই কমান্ডটি ক্লাস্টার অ্যাডমিন হিসাবে আপনার Google ক্লাউড অ্যাকাউন্টের সাথে যুক্ত ইমেল সেট করবে
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)
5. "বার্স্ট" ক্লাস্টার তৈরি করুন
নিম্নলিখিত কমান্ড একটি Kubernetes ক্লাস্টার তৈরি করবে:
- নাম "বিস্ফোরণ",
- us-west1-a জোনে,
- Kubernetes এর সর্বশেষ সংস্করণ উপলব্ধ,
- 1টি প্রাথমিক নোড সহ
- স্বয়ংক্রিয়ভাবে 5 নোড পর্যন্ত সক্ষম
export cluster=burst
export zone=us-west1-a
gcloud container clusters create $cluster --zone $zone --username "admin" \
--cluster-version latest --machine-type "n1-standard-2" \
--image-type "COS" --disk-size "100" \
--scopes "https://www.googleapis.com/auth/compute",\
"https://www.googleapis.com/auth/devstorage.read_only",\
"https://www.googleapis.com/auth/logging.write",\
"https://www.googleapis.com/auth/monitoring",\
"https://www.googleapis.com/auth/servicecontrol",\
"https://www.googleapis.com/auth/service.management.readonly",\
"https://www.googleapis.com/auth/trace.append" \
--num-nodes "1" --enable-autoscaling --min-nodes=1 --max-nodes=5 \
--network "default" \
--enable-cloud-logging --enable-cloud-monitoring --enable-ip-alias
(এতে প্রায় 5 মিনিট সময় লাগতে পারে। আপনি ক্লাউড কনসোলে তৈরি হওয়া ক্লাস্টারটি দেখতে পারেন।)
Kubernetes ক্লাস্টার তৈরি হওয়ার পরে, gcloud ক্লাস্টারের দিকে নির্দেশ করে শংসাপত্রের সাথে kubectl কনফিগার করে।
gcloud container clusters get-credentials $cluster --zone=$zone
আপনি এখন আপনার নতুন ক্লাস্টারের সাথে kubectl ব্যবহার করতে সক্ষম হবেন।
আপনার ক্লাস্টারের কুবারনেটস নোডগুলি তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালান (তাদের "প্রস্তুত" অবস্থা দেখাতে হবে):
kubectl get nodes
ব্যবহারের সুবিধার জন্য Kubeconfig নাম পরিবর্তন করুন
এই কমান্ডটি kubeconfig এন্ট্রিটি পরিবর্তন করবে যা আপনি সবেমাত্র burst জন্য তৈরি করেছেন
kubectx ${cluster}=gke_${GCLOUD_PROJECT}_${zone}_${cluster}
অনুমতি সেট করুন:
Istio রিমোট স্থাপনের জন্য আপনাকে ক্লাস্টার অ্যাডমিন হতে হবে। এই কমান্ডটি ক্লাস্টার অ্যাডমিন হিসাবে আপনার Google ক্লাউড অ্যাকাউন্টের সাথে যুক্ত ইমেল সেট করবে
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)
6. ফায়ারওয়াল নিয়ম প্রয়োগ করুন
আমাদের দুটি ক্লাস্টার একে অপরের সাথে যোগাযোগ করার জন্য, আমাদের একটি ফায়ারওয়াল নিয়ম তৈরি করতে হবে।
Google ক্লাউড প্ল্যাটফর্মে একটি ফায়ারওয়াল নিয়ম তৈরি করতে নিম্নলিখিত কমান্ডগুলি চালান যা আমাদের ক্লাস্টারগুলিকে যোগাযোগ করার অনুমতি দেবে
function join_by { local IFS="$1"; shift; echo "$*"; }
ALL_CLUSTER_CIDRS=$(gcloud container clusters list \
--filter="(name=burst OR name=primary) AND zone=$zone" \
--format='value(clusterIpv4Cidr)' | sort | uniq)
ALL_CLUSTER_CIDRS=$(join_by , $(echo "${ALL_CLUSTER_CIDRS}"))
ALL_CLUSTER_NETTAGS=$(gcloud compute instances list \
--filter="(metadata.cluster-name=burst OR metadata.cluster-name=primary) AND metadata.cluster-location=us-west1-a" \
--format='value(tags.items.[0])' | sort | uniq)
ALL_CLUSTER_NETTAGS=$(join_by , $(echo "${ALL_CLUSTER_NETTAGS}"))
gcloud compute firewall-rules create istio-multicluster-test-pods \
--allow=tcp,udp,icmp,esp,ah,sctp \
--direction=INGRESS \
--priority=900 \
--source-ranges="${ALL_CLUSTER_CIDRS}" \
--target-tags="${ALL_CLUSTER_NETTAGS}" --quiet
আমাদের উভয় ক্লাস্টার সেটআপ আছে এবং সেগুলিতে আমাদের অ্যাপ্লিকেশন এবং ইস্টিও স্থাপন করার জন্য প্রস্তুত!
7. Istio ভূমিকা
Istio কি?
Istio হল একটি সার্ভিস মেশ কন্ট্রোল প্লেন যার লক্ষ্য "সংযুক্ত, সুরক্ষিত, নিয়ন্ত্রণ এবং পরিষেবাগুলি পর্যবেক্ষণ করা"। এটি বিভিন্ন উপায়ে তা করে, তবে প্রাথমিকভাবে আপনার প্রতিটি স্থাপন করা কুবারনেটস পডগুলিতে একটি প্রক্সি কন্টেইনার ( দূত ) সাইডকার করে। প্রক্সি কন্টেইনার একটি সাধারণ-উদ্দেশ্য নীতি এবং টেলিমেট্রি হাব ( মিক্সার ) এর সাহায্যে মাইক্রোসার্ভিসের মধ্যে সমস্ত নেটওয়ার্ক যোগাযোগ নিয়ন্ত্রণ করে।

এই নীতিগুলি আপনার Kubernetes স্থাপনা এবং পরিষেবাগুলির স্বাধীনভাবে প্রয়োগ করা যেতে পারে, যার অর্থ নেটওয়ার্ক অপারেটর নেটওয়ার্ক কার্যকলাপ পর্যবেক্ষণ করতে পারে, সীমাবদ্ধ করতে পারে, পুনঃনির্দেশিত করতে পারে বা সংশ্লিষ্ট অ্যাপ্লিকেশনগুলিকে পুনঃনিয়োগ না করেই নেটওয়ার্ক নীতিগুলি পুনরায় লিখতে পারে৷
ট্রাফিক ম্যানেজমেন্টের কিছু বৈশিষ্ট্য Istio সমর্থনগুলি হল:
- সার্কিট ব্রেকার
- শতাংশ ভিত্তিক ট্রাফিক বিভাজন
- URL পুনর্লিখন
- TLS সমাপ্তি
- স্বাস্থ্য পরীক্ষা
- লোড ব্যালেন্সিং
এই কর্মশালার উদ্দেশ্যে, আমরা শতাংশ ভিত্তিক ট্রাফিক বিভাজনের উপর ফোকাস করব।
Istio শর্তাবলী আমরা সঙ্গে কাজ করা হবে
ভার্চুয়াল সার্ভিস
একটি ভার্চুয়াল সার্ভিস ট্রাফিক রাউটিং নিয়মগুলির একটি সেট সংজ্ঞায়িত করে যখন একটি হোস্টকে সম্বোধন করা হয়।
গেটওয়ে
একটি গেটওয়ে হল একটি লোড ব্যালেন্সার যা জালের প্রান্তে কাজ করে ইনকামিং বা আউটগোয়িং HTTP/TCP সংযোগ গ্রহণ করে। গেটওয়ে পোর্ট, SNI কনফিগারেশন ইত্যাদি নির্দিষ্ট করতে পারে।
গন্তব্য নিয়ম
একটি গন্তব্য নিয়ম নীতিগুলিকে সংজ্ঞায়িত করে যা রাউটিং হওয়ার পরে পরিষেবার উদ্দেশ্যে ট্রাফিকের ক্ষেত্রে প্রযোজ্য। তারা লোড ব্যালেন্সিংয়ের জন্য কনফিগারেশন, সাইডকার থেকে সংযোগ পুলের আকার এবং বাইরের সনাক্তকরণ সেটিংস নির্দিষ্ট করে।
ইস্টিও মাল্টিক্লাস্টার
আপনি হয়তো লক্ষ্য করেছেন যখন আমরা আমাদের দুটি ক্লাস্টার তৈরি করেছি, আমাদের primary ক্লাস্টারটি ছিল অটোস্কেলিং ছাড়াই 4টি নোড এবং আমাদের burst ক্লাস্টারটি ছিল 1টি নোড যার অটোস্কেলিং 5টি নোড পর্যন্ত।
এই কনফিগারেশনের জন্য দুটি কারণ আছে।
প্রথমত, আমরা ক্লাউডের দৃশ্যে একটি "অন-প্রিম" অনুকরণ করতে চাই। একটি অন-প্রিম পরিবেশে আপনি অটোস্কেলিং ক্লাস্টারগুলিতে অ্যাক্সেস পাবেন না কারণ আপনার অবকাঠামো ঠিক আছে।
দ্বিতীয়ত, একটি 4 নোড সেটআপ (উপরে সংজ্ঞায়িত করা হয়েছে) ইস্টিও চালানোর জন্য সর্বনিম্ন প্রয়োজনীয়তা। এটি প্রশ্ন জাগিয়েছে: যদি Istio-এর জন্য ন্যূনতম 4টি নোডের প্রয়োজন হয়, তাহলে কীভাবে আমাদের burst ক্লাস্টার 1টি নোড দিয়ে Istio চালাতে পারে? উত্তর হল যে Istio মাল্টিক্লাস্টার Istio পরিষেবাগুলির একটি অনেক ছোট সেট ইনস্টল করে এবং নীতির নিয়মগুলি পুনরুদ্ধার করতে এবং টেলিমেট্রি তথ্য প্রকাশ করতে প্রাথমিক ক্লাস্টারে Istio ইনস্টলেশনের সাথে যোগাযোগ করে।
8. অ্যাপ্লিকেশন আর্কিটেকচার ওভারভিউ
উপাদান ওভারভিউ
আমরা NodeJS এবং Redis ব্যবহার করে একটি তিন স্তর বিশিষ্ট অ্যাপ্লিকেশন স্থাপন করব।
কর্মী
ওয়ার্কার অ্যাপ্লিকেশনটি NodeJS-এ লেখা হয় এবং ইনকামিং POST HTTP অনুরোধগুলি শুনবে, তাদের উপর একটি হ্যাশিং অপারেশন করবে এবং, যদি PREFIX নামে একটি এনভায়রনমেন্ট ভেরিয়েবল সংজ্ঞায়িত করা হয়, তাহলে এটি সেই মান সহ হ্যাশকে প্রিপেন্ড করবে। একবার হ্যাশ গণনা করা হয়ে গেলে, অ্যাপ্লিকেশনটি নির্দিষ্ট রেডিস সার্ভারে " calculation " চ্যানেলে ফলাফল পাঠায়।
আমরা পরবর্তীতে মাল্টিক্লাস্টার কার্যকারিতা প্রদর্শনের জন্য PREFIX এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করব।
রেফারেন্সের জন্য: এই প্যাকেজগুলি অ্যাপ্লিকেশন ব্যবহার করে।
-
body-parser:আমাদের http অনুরোধ পার্স করার অনুমতি দেয় -
cors:ক্রস অরিজিন রিসোর্স শেয়ারিং ব্যবহারের অনুমতি দেয় -
dotenv:পরিবেশ ভেরিয়েবলের সহজ পার্সিং -
express:সহজ ওয়েব সাইট হোস্টিং -
ioredis:Redis ডাটাবেসের সাথে যোগাযোগের জন্য ক্লায়েন্ট লাইব্রেরি -
morgan:চমৎকার কাঠামোগত লগ প্রদান করে
ফ্রন্টেন্ড
আমাদের ফ্রন্টএন্ড একটি NodeJS অ্যাপ্লিকেশন যা এক্সপ্রেস ব্যবহার করে একটি ওয়েব পৃষ্ঠা হোস্ট করে। এটি একটি ব্যবহারকারীর ইনপুটেড ফ্রিকোয়েন্সি নেয় এবং সেই হারে আমাদের worker অ্যাপ্লিকেশনে অনুরোধ পাঠায়। এই অ্যাপ্লিকেশনটি " calculation " নামে একটি রেডিস চ্যানেলের বার্তাগুলিতেও সাবস্ক্রাইব করে এবং একটি ওয়েব পৃষ্ঠায় ফলাফল প্রদর্শন করে৷
অ্যাপ্লিকেশন নিম্নলিখিত নির্ভরতা ব্যবহার করে.
-
body-parser:আমাদের http অনুরোধ পার্স করার অনুমতি দেয় -
dotenv:পরিবেশ ভেরিয়েবলের সহজ পার্সিং -
express:সহজ ওয়েব সাইট হোস্টিং -
ioredis:Redis ডাটাবেসের সাথে যোগাযোগের জন্য ক্লায়েন্ট লাইব্রেরি -
morgan:চমৎকার কাঠামোগত লগ প্রদান করে -
request:HTTP অনুরোধ করার জন্য অনুমতি দেয় -
socket.io:ওয়েব পৃষ্ঠা থেকে সার্ভারে দ্বিমুখী যোগাযোগের অনুমতি দেয়
এই ওয়েবপৃষ্ঠাটি স্টাইল করার জন্য বুটস্ট্র্যাপ ব্যবহার করে এবং যখন চালানো হয়, তখন নিচের মত দেখায়

স্থাপত্য চিত্র

স্থাপনার চিত্র
আমরা আমাদের তৈরি করা দুটি ক্লাস্টার জুড়ে আমাদের চূড়ান্ত অ্যাপ্লিকেশন স্থাপন করব। primary ক্লাস্টারে সমস্ত উপাদান ( frontend , worker এবং রেডিস) স্থাপন করা হবে, তবে burst ক্লাস্টারে শুধুমাত্র worker অ্যাপ্লিকেশন স্থাপন করা হবে।
এখানে দুটি ক্লাস্টার বর্ণনা করার একটি চিত্র রয়েছে। লাল রঙে বর্ণিত বাক্সগুলি হল Kubernetes পরিষেবাগুলি, নীল রঙেরগুলি হল Kubernetes Deployments৷ হলুদ বাক্সগুলি আমাদের ইস্টিও-এর ইনস্টলেশন নির্দেশ করে৷
লক্ষ্য করুন কিভাবে burst ক্লাস্টারে এখনও Redis-এর জন্য একটি পরিষেবা রয়েছে যদিও ক্লাস্টারে Redis-এর জন্য কোনও স্থাপনা নেই। আমাদের ক্লাস্টারে এই পরিষেবাটি থাকা দরকার যাতে Kubernetes DNS অনুরোধটি সমাধান করতে পারে, কিন্তু যখন প্রকৃতপক্ষে অনুরোধ করা হয়, তখন Istio প্রক্সি primary ক্লাস্টারে Redis স্থাপনার অনুরোধটিকে পুনরায় রুট করবে৷
চূড়ান্ত অ্যাপ্লিকেশানটিতে istiowatcher. নামে primary ক্লাস্টারে একটি অতিরিক্ত স্থাপনা চলমান থাকবে। এটি আমাদের ট্র্যাফিককে একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করার সময় স্বয়ংক্রিয়ভাবে burst ট্র্যাফিককে গতিশীলভাবে পুনরায় রুট করার অনুমতি দেবে।

9. অ্যাপ্লিকেশন স্থাপনার ফাইল তৈরি করুন
আমাদের অ্যাপ্লিকেশন স্থাপন করার জন্য আমাদের Kubernetes ম্যানিফেস্টের একটি সেট তৈরি করতে হবে
প্রকল্পের রুট ডিরেক্টরিতে পরিবর্তন করুন এবং kubernetes নামে একটি নতুন ফোল্ডার তৈরি করুন
mkdir ${proj}/kubernetes && cd ${proj}/kubernetes
Frontend.yaml লিখুন
এটি আমাদের ফ্রন্টএন্ড ইমেজ অ্যাক্সেস করার জন্য একটি Kubernetes স্থাপনা এবং পরিষেবা উভয়ই তৈরি করবে।
frontend.yaml এ নিম্নলিখিতটি সন্নিবেশ করুন।
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend-deployment
labels:
app: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: gcr.io/istio-burst-workshop/frontend
ports:
- containerPort: 8080
readinessProbe:
initialDelaySeconds: 10
httpGet:
path: "/_healthz"
port: 8080
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-readiness-probe"
livenessProbe:
initialDelaySeconds: 10
httpGet:
path: "/"
port: 8080
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-liveness-probe"
env:
- name: PORT
value: "8080"
- name: PROCESSOR_URL
value: "http://worker-service"
- name: REDIS_URL
value: "redis-cache-service:6379"
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: ClusterIP
selector:
app: frontend
ports:
- name: http
port: 80
targetPort: 8080
Deployment লক্ষ্য করার মূল বিষয়গুলি
- আমরা পোর্টটি নির্দিষ্ট করেছি যে অ্যাপ্লিকেশনটি
8080হবে - আমরা কর্মীর ঠিকানাটি "
http://worker-service" হিসাবে সেট করেছি এবং ফলাফলের পরিষেবাটি সমাধান করতে DNS বৈশিষ্ট্যে নির্মিত কুবারনেটস ব্যবহার করব - আমরা আমাদের
REDIS_URLএর ঠিকানাটিকে "redis-cache-service:6379" হিসাবে সেট করেছি এবং ফলাফলের IP ঠিকানাগুলি সমাধান করতে DNS বৈশিষ্ট্যে নির্মিত Kubernetes ব্যবহার করব৷ - আমরা কন্টেইনারে
livenessএবংreadinessপ্রোবগুলিও সেট করেছি যাতে কন্টেইনারটি কখন চালু হয় এবং কুবারনেটসকে জানাতে সাহায্য করে৷
worker-service.yaml লিখ
আমরা স্থাপনার সংজ্ঞার চেয়ে একটি পৃথক ফাইলে Kubernetes পরিষেবা সংজ্ঞা লিখছি কারণ আমরা একাধিক ক্লাস্টার জুড়ে এই পরিষেবাটি পুনরায় ব্যবহার করব, তবে প্রতিটি ক্লাস্টারের জন্য একটি আলাদা স্থাপনা লিখব।
worker-service.yaml এ নিম্নলিখিতটি সন্নিবেশ করান
apiVersion: v1
kind: Service
metadata:
name: worker-service
spec:
type: ClusterIP
selector:
app: worker
ports:
- name: http
port: 80
targetPort: 8081
worker-primary.yaml লিখ
আমরা প্রাথমিক ক্লাস্টারে ধাক্কা দেবো এই worker মোতায়েন।
worker-primary.yaml এ নিম্নলিখিতটি ঢোকান।
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: worker-deployment
labels:
app: worker
spec:
replicas: 1
selector:
matchLabels:
app: worker
template:
metadata:
labels:
app: worker
cluster-type: primary-cluster
spec:
containers:
- name: worker
image: gcr.io/istio-burst-workshop/worker
imagePullPolicy: Always
ports:
- containerPort: 8081
readinessProbe:
initialDelaySeconds: 10
httpGet:
path: "/_healthz"
port: 8081
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-readiness-probe"
livenessProbe:
initialDelaySeconds: 10
httpGet:
path: "/"
port: 8081
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-liveness-probe"
env:
- name: PORT
value: "8081"
- name: REDIS_URL
value: "redis-cache-service:6379"
এটিতে লক্ষ্য করুন, আমরা আমাদের অ্যাপ্লিকেশন ব্যবহারের জন্য PORT এবং REDIS_URL এনভায়রনমেন্ট ভেরিয়েবল নির্দিষ্ট করার পাশাপাশি liveness এবং readiness প্রোব প্রদানের একই প্যাটার্ন অনুসরণ করছি।
এই স্থাপনায় আরেকটি বিষয় লক্ষ্য করা যায় তা হল PREFIX এনভায়রনমেন্ট ভেরিয়েবলের অভাব। এর মানে হল যে আমাদের গণনার ফলাফলগুলি কাঁচা হ্যাশ হবে (এগুলির উপসর্গের কিছুই নেই)।
এই স্থাপনার চূড়ান্ত মূল বিষয় হল cluster-type: primary-cluster লেবেল। ইস্টিও মাল্টিক্লাস্টারে ট্র্যাফিক রাউটিং করার সময় আমরা পরে এটি ব্যবহার করব
redis.yaml লিখুন
আমাদের কর্মী থেকে ফ্রন্টএন্ডে যোগাযোগ একটি রেডিস চ্যানেলের মাধ্যমে হয়, এবং তাই আমাদের ক্লাস্টারে একটি রেডিস অ্যাপ্লিকেশন স্থাপন করতে হবে।
redis.yaml এ নিম্নলিখিতটি ঢোকান
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis-cache
spec:
template:
metadata:
labels:
app: redis-cache
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
readinessProbe:
periodSeconds: 5
tcpSocket:
port: 6379
livenessProbe:
periodSeconds: 5
tcpSocket:
port: 6379
volumeMounts:
- mountPath: /data
name: redis-data
resources:
limits:
memory: 256Mi
cpu: 125m
requests:
cpu: 70m
memory: 200Mi
volumes:
- name: redis-data
emptyDir: {}
এটি একটি Redis অ্যাপ্লিকেশনের একটি সেমি স্ট্যান্ডার্ড স্থাপনা। এটি redis:alpine চিত্রের উপর ভিত্তি করে একটি ধারক তৈরি করে, উপযুক্ত পোর্টগুলিকে উন্মুক্ত করে এবং সংবেদনশীল সম্পদ সীমা সেট করে।
redis-service.yaml লিখুন
আমাদের Redis অ্যাপ্লিকেশনের সাথে যোগাযোগ করার জন্য আমাদের একটি Kubernetes পরিষেবা প্রয়োজন
redis-service.yaml এ নিম্নলিখিতটি ঢোকান
apiVersion: v1
kind: Service
metadata:
name: redis-cache-service
spec:
type: ClusterIP
selector:
app: redis-cache
ports:
- port: 6379
targetPort: 6379
এটি আমাদের রেডিস ডিপ্লয়মেন্ট অ্যাক্সেস করার জন্য redis-cache-service নামের পরিষেবা প্রদান করে।
10. অ্যাপ্লিকেশন স্থাপন করুন
আমাদের ছবিগুলিকে GCR-এ ঠেলে দেওয়া হয়েছে এবং আমাদের Kubernetes ম্যানিফেস্টগুলি লেখা হয়েছে, এটি আমাদের অ্যাপ্লিকেশন স্থাপন করার এবং এটি কীভাবে কাজ করে তা দেখার জন্য এটি একটি ভাল পয়েন্ট!
অ্যাপ্লিকেশনটি স্থাপন করতে নিম্নলিখিত কমান্ডগুলি চালান
- আমরা সঠিক ক্লাস্টারে আছি তা নিশ্চিত করুন
kubectx primary
- রেডিস ক্যাশে স্থাপন করুন
kubectl apply -f redis.yaml
- রেডিস পরিষেবা স্থাপন করুন
kubectl apply -f redis-service.yaml
- ফ্রন্টএন্ড স্থাপন করুন
kubectl apply -f frontend.yaml
- কর্মী মোতায়েন করুন
kubectl apply -f worker-primary.yaml
- কর্মী পরিষেবা স্থাপন করুন
kubectl apply -f worker-service.yaml
আমরা আমাদের আবেদন GKE-তে স্থাপন করেছি। অভিনন্দন!
পরীক্ষা
শুঁটি অনলাইনে আসার জন্য অপেক্ষা করুন
kubectl get pods -w
একবার সমস্ত পড সব "চলমান" হলে Ctrl + C চাপুন
NAME READY STATUS RESTARTS AGE frontend-deployment-695d95fbf7-76sd8 1/1 Running 0 2m redis-cache-7475999bf5-nxj8x 1/1 Running 0 2m worker-deployment-5b9cf9956d-g975p 1/1 Running 0 2m
আপনি লক্ষ্য করবেন যে আমরা লোডব্যালেন্সারের মাধ্যমে আমাদের ফ্রন্টএন্ডটি প্রকাশ করিনি। কারণ পরে আমরা Istio এর মাধ্যমে অ্যাপ্লিকেশনটি অ্যাক্সেস করব। সবকিছু ঠিকঠাক আছে কিনা তা পরীক্ষা করতে, আমরা kubectl port-forward. আপনার স্থানীয় (বা ক্লাউড শেল) মেশিনে পোর্ট 8080 ফরওয়ার্ড করতে নিম্নলিখিত কমান্ডটি চালান পোর্ট 8080-এ frontend স্থাপনা চালান।
kubectl port-forward \
$(kubectl get pods -l app=frontend -o jsonpath='{.items[0].metadata.name}') \
8080:8080
আপনি যদি স্থানীয়ভাবে চালান : একটি ওয়েব ব্রাউজার খুলুন এবং http://localhost:8080- এ নেভিগেট করুন
আপনি যদি ক্লাউড শেল চালাচ্ছেন: "ওয়েব প্রিভিউ" বোতামে ক্লিক করুন এবং "পোর্ট 8080 এর পূর্বরূপ" নির্বাচন করুন

আপনি ফ্রন্টএন্ড দেখতে হবে! এবং আপনি যদি "ফ্রিকোয়েন্সি" বাক্সে একটি সংখ্যা লিখুন তবে আপনি দেখতে পাবেন হ্যাশগুলি উপস্থিত হতে শুরু করবে৷

অভিনন্দন; এটা সব আপ এবং চলমান!
পোর্ট ফরওয়ার্ড করা বন্ধ করতে Ctrl+C টিপুন।
11. ক্লিনআপ ডিপ্লোয়েড অ্যাপ্লিকেশন
আমরা আমাদের ক্লাস্টারে Istio প্রয়োগ করতে যাচ্ছি এবং তারপরে আমাদের অ্যাপ্লিকেশন পুনরায় স্থাপন করতে যাচ্ছি, তাই আসুন প্রথমে আমাদের বর্তমান অ্যাপ্লিকেশনটি পরিষ্কার করি।
আপনার তৈরি করা সমস্ত স্থাপনা এবং পরিষেবাগুলি মুছতে নিম্নলিখিত কমান্ডগুলি চালান৷
-
redis-cache-serviceমুছুন
kubectl delete -f redis-service.yaml
-
redisমুছুন
kubectl delete -f redis.yaml
-
frontendমুছুন
kubectl delete -f frontend.yaml
-
workerমুছুন
kubectl delete -f worker-primary.yaml
-
worker-serviceমুছুন
kubectl delete -f worker-service.yaml
12. প্রাথমিক ক্লাস্টারে Istio ইনস্টল করুন
Istio পান
Istio এর রিলিজ GitHub এ হোস্ট করা হয়। নিম্নলিখিত কমান্ডগুলি istio এর 1.0.0 সংস্করণ ডাউনলোড করবে এবং এটি আনপ্যাক করবে।
- আপনার প্রকল্পের রুট পরিবর্তন করুন
cd ${proj}
- সংরক্ষণাগার ডাউনলোড করুন
curl -LO https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-linux.tar.gz
- আর্কাইভ বের করুন এবং সরান
tar xzf istio-1.0.0-linux.tar.gz && rm istio-1.0.0-linux.tar.gz
Istio টেমপ্লেট তৈরি করুন
নিম্নলিখিত Helm কমান্ডটি চালানোর ফলে আপনার ক্লাস্টারে Istio ইনস্টল করার জন্য টেমপ্লেট তৈরি হবে।
helm template istio-1.0.0/install/kubernetes/helm/istio \ --name istio --namespace istio-system \ --set prometheus.enabled=true \ --set servicegraph.enabled=true > istio-primary.yaml
এটি আপনার বর্তমান ডিরেক্টরিতে istio-primary.yaml নামে একটি ফাইল তৈরি করে যাতে Istio স্থাপন এবং চালানোর জন্য প্রয়োজনীয় সমস্ত সংজ্ঞা এবং স্পেসিফিকেশন রয়েছে।
দুটি --set পরামিতি লক্ষ্য করুন। এগুলি ইস্টিও সিস্টেমে প্রমিথিউস এবং সার্ভিসগ্রাফ সমর্থন যোগ করে। আমরা পরবর্তীতে ল্যাবে প্রমিথিউস পরিষেবা ব্যবহার করব।
ইস্টিও স্থাপন করুন
Istio স্থাপন করার জন্য আমাদের প্রথমে istio-system নামে একটি নামস্থান তৈরি করতে হবে যেখানে Istio স্থাপনা এবং পরিষেবাগুলি চলতে পারে।
kubectl create namespace istio-system
এবং অবশেষে আমরা হেলম দিয়ে তৈরি istio-primary.yaml ফাইলটি প্রয়োগ করি
kubectl apply -f istio-primary.yaml
ডিফল্ট নেমস্পেস লেবেল করুন
Istio আপনার প্রতিটি স্থাপনার মধ্যে একটি সাইডকার প্রক্সি পরিষেবা ইনজেক্ট করে কাজ করে। এটি একটি অপ্ট-ইন ভিত্তিতে করা হয় তাই আমাদের default নেমস্পেসকে istio-injection=enabled দিয়ে লেবেল করতে হবে যাতে Istio আমাদের জন্য স্বয়ংক্রিয়ভাবে সাইডকার ইনজেক্ট করতে পারে।
kubectl label namespace default istio-injection=enabled
অভিনন্দন! আমাদের অ্যাপ্লিকেশন মোতায়েন করার জন্য ইস্টিওর সাথে আমাদের একটি ক্লাস্টার আপ এবং চলমান রয়েছে!
13. ইস্টিও ট্র্যাফিক ম্যানেজমেন্টের সাথে আমাদের অ্যাপ্লিকেশন স্থাপন করুন
Istio ট্র্যাফিক ম্যানেজমেন্ট কনফিগার ফাইল তৈরি করুন
Istio কুবারনেটসের মতো একইভাবে কাজ করে কারণ এটি কনফিগারেশনের জন্য yaml ফাইল ব্যবহার করে। সেই শিরায়, আমাদের ফাইলের একটি সেট তৈরি করতে হবে ইস্টিওকে জানাতে হবে কীভাবে আমাদের ট্র্যাফিককে প্রকাশ করা যায় এবং রুট করা যায়।
istio-manifests নামে একটি ডিরেক্টরি তৈরি করুন এবং এটিতে পরিবর্তন করুন
mkdir ${proj}/istio-manifests && cd ${proj}/istio-manifests
Frontend-gateway.yaml লিখুন
এই ফাইলটি আমাদের Kubernetes ক্লাস্টারকে GKE LoadBalancer-এর মতোই প্রকাশ করবে এবং আমাদের ফ্রন্টএন্ড পরিষেবাতে সমস্ত আগত ট্রাফিককে রুট করবে।
frontend-gateway.yaml নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিতটি সন্নিবেশ করুন।
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: frontend-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: frontend-ingress-virtual-service
spec:
hosts:
- "*"
gateways:
- frontend-gateway
http:
- route:
- destination:
host: frontend-service
port:
number: 80
redis-virtualservice.yaml লিখুন
redis-virtualservice.yaml নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিতটি সন্নিবেশ করুন
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: redis-virtual-service
spec:
hosts:
- redis-cache-service
gateways:
- mesh
tcp:
- route:
- destination:
host: redis-cache-service.default.svc.cluster.local
worker-virtualservice.yaml লিখুন
worker-virtualservice.yaml নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিতটি সন্নিবেশ করুন
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: worker-virtual-service
spec:
hosts:
- worker-service
gateways:
- mesh
http:
- route:
- destination:
host: worker-service.default.svc.cluster.local
port:
number: 80
Istio ট্রাফিক ম্যানেজমেন্ট নীতি স্থাপন করুন
Istio নীতিগুলি স্থাপন করা অন্যান্য Kubernetes সম্পদের মতো একই পদ্ধতিতে করা হয়, kubectl apply সাথে
- আমাদের গেটওয়ে প্রয়োগ করুন
kubectl apply -f frontend-gateway.yaml
- আমাদের Redis VirtualService প্রয়োগ করুন
kubectl apply -f redis-virtualservice.yaml
- আমাদের কর্মী ভার্চুয়াল সার্ভিস প্রয়োগ করুন
kubectl apply -f worker-virtualservice.yaml
অ্যাপ্লিকেশন স্থাপন
- আমাদের
kubernetesডিরেক্টরিতে ফিরে যান
cd ${proj}/kubernetes
- রেডিস ক্যাশে স্থাপন করুন
kubectl apply -f redis.yaml
- রেডিস পরিষেবা স্থাপন করুন
kubectl apply -f redis-service.yaml
- ফ্রন্টএন্ড স্থাপন করুন
kubectl apply -f frontend.yaml
- কর্মী মোতায়েন করুন
kubectl apply -f worker-primary.yaml
- কর্মী পরিষেবা স্থাপন করুন
kubectl apply -f worker-service.yaml
যাচাই করুন
এই মুহুর্তে আমরা ইস্টিও এবং ট্রাফিক ব্যবস্থাপনা নীতি সহ একটি ক্লাস্টারে আমাদের অ্যাপ্লিকেশন পুনরায় স্থাপন করেছি।
আসুন আমাদের সমস্ত কাজের চাপ অনলাইনে আসার জন্য অপেক্ষা করি
একবার তারা সব অনলাইন হলে, আমরা frontend-ingressgateway.yaml এ কনফিগার করেছি IngressGateway পান
$ kubectl -n istio-system get svc istio-ingressgateway NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.36.3.112 35.199.158.10 80:31380/TCP,
হয় <EXTERNAL-IP> ঠিকানায় ব্রাউজ করুন, অথবা এটি কার্ল করুন এবং আপনি ফ্রন্টএন্ড দেখতে পাবেন!
$ curl 35.199.158.10
<!doctype html>
<html>
<head>
<title>String Hashr</title>
<!-- Bootstrap -->
...
14. "বার্স্ট" ক্লাস্টারে ইস্টিও ইনস্টল করুন
আমরা আমাদের primary ক্লাস্টারে সেট আপ এবং স্থাপনে অনেক সময় ব্যয় করছি, কিন্তু আমাদের আরও একটি সম্পূর্ণ ক্লাস্টার স্থাপন করতে হবে!
এই বিভাগে আমাদের উভয় ক্লাস্টার জুড়ে কনফিগারেশন ভেরিয়েবলগুলি ধরতে হবে তাই প্রতিটি কমান্ডের জন্য আমরা কোন ক্লাস্টারের দিকে নির্দেশ করছি তার প্রতি গভীর মনোযোগ দিন।
Istio রিমোট ম্যানিফেস্ট তৈরি করুন
অনেকটা যেমন আমরা primary ক্লাস্টারে Istio স্থাপন করেছিলাম, আমরা হেলম ব্যবহার করতে যাচ্ছি আমাদের burst ক্লাস্টারে istio রিমোটের স্থাপনার টেমপ্লেট করতে। যদিও আমরা তা করার আগে, আমাদের primary ক্লাস্টার সম্পর্কে কিছু তথ্য পেতে হবে
প্রাথমিক ক্লাস্টার তথ্য সংগ্রহ করুন
primary ক্লাস্টারে পরিবর্তন করুন
kubectx primary
নিম্নলিখিত কমান্ডগুলি প্রাথমিক ক্লাস্টারে বিভিন্ন পডের আইপি ঠিকানাগুলি পুনরুদ্ধার করে। প্রাথমিক ক্লাস্টারের সাথে যোগাযোগ করতে ইস্টিও রিমোট ব্যবহার করে।
export PILOT_POD_IP=$(kubectl -n istio-system get pod -l istio=pilot -o jsonpath='{.items[0].status.podIP}')
export POLICY_POD_IP=$(kubectl -n istio-system get pod -l istio-mixer-type=policy -o jsonpath='{.items[0].status.podIP}')
export STATSD_POD_IP=$(kubectl -n istio-system get pod -l istio=statsd-prom-bridge -o jsonpath='{.items[0].status.podIP}')
export TELEMETRY_POD_IP=$(kubectl -n istio-system get pod -l istio-mixer-type=telemetry -o jsonpath='{.items[0].status.podIP}')
export ZIPKIN_POD_IP=$(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{range .items[*]}{.status.podIP}{end}')
রিমোট টেমপ্লেট তৈরি করুন
এখন আমরা istio-remote-burst.yaml নামে একটি ফাইল তৈরি করতে helm ব্যবহার করব যা আমরা তারপর burst ক্লাস্টারে স্থাপন করতে পারি।
প্রজেক্ট রুটে পরিবর্তন করুন
cd $proj
helm template istio-1.0.0/install/kubernetes/helm/istio-remote --namespace istio-system \
--name istio-remote \
--set global.remotePilotAddress=${PILOT_POD_IP} \
--set global.remotePolicyAddress=${POLICY_POD_IP} \
--set global.remoteTelemetryAddress=${TELEMETRY_POD_IP} \
--set global.proxy.envoyStatsd.enabled=true \
--set global.proxy.envoyStatsd.host=${STATSD_POD_IP} \
--set global.remoteZipkinAddress=${ZIPKIN_POD_IP} > istio-remote-burst.yaml
বিস্ফোরিত ক্লাস্টারে ইস্টিও রিমোট ইনস্টল করুন
আমাদের burst ক্লাস্টারে Istio ইনস্টল করার জন্য, primary ক্লাস্টারে ইনস্টল করার সময় আমাদের একই পদক্ষেপগুলি অনুসরণ করতে হবে, তবে আমাদের পরিবর্তে istio-remote-burst.yaml ফাইলটি ব্যবহার করতে হবে।
কুবের প্রসঙ্গ পরিবর্তন করে ফেটে নিন
kubectx burst
ইস্টিও-সিস্টেম নামস্থান তৈরি করুন
kubectl create ns istio-system
istio-burst.yaml প্রয়োগ করুন
kubectl apply -f istio-remote-burst.yaml
ডিফল্ট নামস্থান লেবেল করুন
আবার, আমাদের default নেমস্পেস লেবেল করতে হবে যাতে প্রক্সি স্বয়ংক্রিয়ভাবে ইনজেকশন করা যায়।
kubectl label namespace default istio-injection=enabled
অভিনন্দন! এই মুহুর্তে আমরা burst ক্লাস্টারে ইস্টিও রিমোট সেট আপ করেছি। এই মুহুর্তে, তবে, ক্লাস্টারগুলি এখনও যোগাযোগ করতে অক্ষম। আমাদের burst ক্লাস্টারের জন্য একটি kubeconfig ফাইল তৈরি করতে হবে যা আমরা primary ক্লাস্টারে তাদের একসাথে লিঙ্ক করতে স্থাপন করতে পারি।
"বার্স্ট" ক্লাস্টারের জন্য kubeconfig তৈরি করুন
বিস্ফোরিত ক্লাস্টারে পরিবর্তন করুন
kubectx burst
পরিবেশ স্থাপন করুন
এটির জন্য একটি kubeconfig ফাইল তৈরি করার জন্য আমাদের ক্লাস্টার সম্পর্কে কিছু তথ্য সংগ্রহ করতে হবে।
- ক্লাস্টারের নাম পান
CLUSTER_NAME=$(kubectl config view --minify=true -o "jsonpath={.clusters[].name}")
- ক্লাস্টার সার্ভারের নাম পান
SERVER=$(kubectl config view --minify=true -o "jsonpath={.clusters[].cluster.server}")
-
istio-multiসার্ভিস অ্যাকাউন্ট সার্টিফিকেট অথরিটির জন্য গোপনের নাম পান
SECRET_NAME=$(kubectl get sa istio-multi -n istio-system -o jsonpath='{.secrets[].name}')
- সার্টিফিকেট অথরিটি ডেটা আগের গোপনে সংরক্ষণ করুন
CA_DATA=$(kubectl get secret ${SECRET_NAME} -n istio-system -o "jsonpath={.data['ca\.crt']}")
- আগের গোপনে সংরক্ষিত টোকেন পান
TOKEN=$(kubectl get secret ${SECRET_NAME} -n istio-system -o "jsonpath={.data['token']}" | base64 --decode)
kubeconfig ফাইল তৈরি করুন
এই সমস্ত এনভায়রনমেন্ট ভেরিয়েবল সেট করে, আমাদের kubeconfig ফাইল তৈরি করতে হবে
cat <<EOF > burst-kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ${CA_DATA}
server: ${SERVER}
name: ${CLUSTER_NAME}
contexts:
- context:
cluster: ${CLUSTER_NAME}
user: ${CLUSTER_NAME}
name: ${CLUSTER_NAME}
current-context: ${CLUSTER_NAME}
kind: Config
preferences: {}
users:
- name: ${CLUSTER_NAME}
user:
token: ${TOKEN}
EOF
এটি আপনার বর্তমান ডিরেক্টরিতে burst-kubeconfig নামে একটি নতুন ফাইল তৈরি করবে যা primary ক্লাস্টার দ্বারা burst ক্লাস্টারকে প্রমাণীকরণ এবং পরিচালনা করতে ব্যবহার করা যেতে পারে।
প্রাথমিক ক্লাস্টারে ফিরে যান
kubectx primary
একটি গোপন তৈরি করে এবং লেবেল করে "বার্স্ট" এর জন্য kubeconfig প্রয়োগ করুন
kubectl create secret generic burst-kubeconfig --from-file burst-kubeconfig -n istio-system
গোপন লেবেল করুন যাতে ইস্টিও মাল্টিক্লাস্টার প্রমাণীকরণের জন্য এটি ব্যবহার করতে জানে
kubectl label secret burst-kubeconfig istio/multiCluster=true -n istio-system
অভিনন্দন! ইস্টিও মাল্টিক্লাস্টারের মাধ্যমে আমরা উভয় ক্লাস্টারই প্রমাণীকৃত এবং একে অপরের সাথে যোগাযোগ করি। আসুন আমাদের অ্যাপ্লিকেশন ক্রস-ক্লাস্টার স্থাপন করি
15. একটি ক্রস-ক্লাস্টার অ্যাপ্লিকেশন স্থাপন করুন
স্থাপনা তৈরি করুন
kubernetes ডিরেক্টরিতে পরিবর্তন করুন
cd ${proj}/kubernetes
"বার্স্ট" ক্লাস্টারের জন্য কর্মী স্থাপনা তৈরি করুন: worker-burst.yaml
worker-burst.yaml নামে একটি ফাইল তৈরি করুন এবং এতে নিম্নলিখিতগুলি সন্নিবেশ করুন:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: worker-deployment
labels:
app: worker
spec:
replicas: 1
selector:
matchLabels:
app: worker
template:
metadata:
labels:
app: worker
cluster-type: burst-cluster
spec:
containers:
- name: worker
image: gcr.io/istio-burst-workshop/worker
imagePullPolicy: Always
ports:
- containerPort: 8081
readinessProbe:
initialDelaySeconds: 10
httpGet:
path: "/_healthz"
port: 8081
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-readiness-probe"
livenessProbe:
initialDelaySeconds: 10
httpGet:
path: "/"
port: 8081
httpHeaders:
- name: "Cookie"
value: "istio_session-id=x-liveness-probe"
env:
- name: PORT
value: "8081"
- name: REDIS_URL
value: "redis-cache-service:6379"
- name: PREFIX
value: "bursty-"
লক্ষ্য করুন যে এটি আমরা আগে তৈরি করা worker-primary.yaml-এর সাথে প্রায় একই রকম। দুটি মূল পার্থক্য আছে।
প্রথম মূল পার্থক্য হল আমরা " bursty- " মান সহ PREFIX এনভায়রনমেন্ট ভেরিয়েবল যোগ করেছি
env:
- name: PORT
value: "8081"
- name: REDIS_URL
value: "redis-cache-service:6379"
- name: PREFIX
value: "bursty-"
এর মানে হল যে burst ক্লাস্টারে আমাদের কর্মী " bursty- " দিয়ে পাঠানো সমস্ত হ্যাশের প্রিফিক্স করবে আমরা এটি ব্যবহার করে জানতে পারি যে আমাদের অ্যাপ্লিকেশনটি সত্যিই ক্রস-ক্লাস্টার।
দ্বিতীয় মূল পার্থক্য হল যে আমরা এই স্থাপনার উপর cluster-type লেবেলটিকে primary-cluster থেকে burst-cluster পরিবর্তন করেছি।
labels:
app: worker
cluster-type: burst-cluster
যখন আমরা আমাদের ভার্চুয়াল সার্ভিস আপডেট করব তখন আমরা এই লেবেলটি ব্যবহার করব।
Istio পরিষেবাগুলি সংশোধন করুন
এই মুহূর্তে আমাদের Istio পরিষেবাগুলি আমাদের উভয় স্থাপনার সুবিধা নিচ্ছে না। আমাদের ট্রাফিকের 100% "প্রাথমিক" ক্লাস্টারে রুট করা হচ্ছে। এর পরিবর্তন করা যাক.
আমাদের istio-manifests ডিরেক্টরিতে পরিবর্তন করুন
cd ${proj}/istio-manifests
DestinationRules অন্তর্ভুক্ত করতে worker-virtualservice.yaml এডিট করুন
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: worker-virtual-service
spec:
hosts:
- worker-service
gateways:
- mesh
http:
- route:
- destination:
host: worker-service.default.svc.cluster.local
subset: primary
port:
number: 80
weight: 50
- destination:
host: worker-service.default.svc.cluster.local
subset: burst
port:
number: 80
weight: 50
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: worker-destination-rule
spec:
host: worker-service
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: primary
labels:
cluster-type: primary-cluster
- name: burst
labels:
cluster-type: burst-cluster
আপনি দেখতে পাচ্ছেন যে আমরা আমাদের ভার্চুয়াল সার্ভিসে একটি দ্বিতীয় গন্তব্য যোগ করেছি। এটি এখনও একই হোস্ট ( worker-service.default.svc.cluster.local) উল্লেখ করে, কিন্তু 50% ট্র্যাফিক primary উপসেটে রুট করা হচ্ছে এবং বাকি 50% burst উপসেটে রুট করা হচ্ছে।
আমরা primary সাবসেটকে ডিপ্লোয়মেন্ট হিসেবে সংজ্ঞায়িত করেছি যাদের লেবেল cluster-type: primary-cluster এবং burst সাবসেট সেই ডিপ্লোয়মেন্টগুলি যাদের লেবেল cluster-type: burst-cluster আছে।
এটি কার্যকরভাবে আমাদের ট্রাফিককে দুটি ক্লাস্টারের মধ্যে 50/50 ভাগ করে।
ক্লাস্টারে স্থাপন করুন
ক্লাস্টার ফাটাতে redis-service.yaml স্থাপন করুন
burst kubeconfig এ পরিবর্তন করুন
kubectx burst
আমাদের প্রকল্প রুট পরিবর্তন করুন
cd ${proj}
তারপর স্থাপন করুন
বার্স্ট ক্লাস্টারে redis-service.yaml স্থাপন করুন
kubectl apply -f kubernetes/redis-service.yaml
burst ক্লাস্টারে worker-burst.yaml স্থাপন করুন
kubectl apply -f kubernetes/worker-burst.yaml
burst ক্লাস্টারে worker-service.yaml স্থাপন করুন
kubectl apply -f kubernetes/worker-service.yaml
Istio VirtualServices প্রয়োগ করুন
primary kubeconfig এ পরিবর্তন করুন
kubectx primary
তারপর Deploy করুন
kubectl apply -f istio-manifests/worker-virtualservice.yaml
এটি কাজ করে যাচাই করুন
এটি কাজ করে তা যাচাই করতে, আপনার ইস্টিও ইনগ্রেস পয়েন্টে ব্রাউজ করুন এবং লক্ষ্য করুন কিভাবে প্রায় 50% হ্যাশ "burst-" এর সাথে প্রিফিক্স করা হয়েছে।

এর মানে আমরা সফলভাবে ক্রস ক্লাস্টার কথা বলছি! বিভিন্ন পরিষেবার ওজন পরিবর্তন করার চেষ্টা করুন এবং worker-virtualservice.yaml ফাইলটি প্রয়োগ করুন৷ ক্লাস্টারগুলির মধ্যে ট্র্যাফিকের ভারসাম্য বজায় রাখার এটি একটি দুর্দান্ত উপায়, তবে আমরা যদি এটি স্বয়ংক্রিয়ভাবে করতে পারি তবে কী হবে?
16. প্রমিথিউস মেট্রিক্সের ব্যবহার
প্রমিথিউসের একটি ভূমিকা
প্রমিথিউস হল একটি ওপেন সোর্স সিস্টেম মনিটরিং এবং অ্যালার্টিং টুলকিট যা মূলত সাউন্ডক্লাউডে নির্মিত। এটি মেট্রিক নাম এবং কী/মান জোড়া দ্বারা চিহ্নিত টাইম সিরিজ ডেটা সহ একটি বহুমাত্রিক ডেটা মডেল বজায় রাখে।
রেফারেন্সের জন্য, এখানে প্রমিথিউস আর্কিটেকচার ডায়াগ্রাম রয়েছে:

Istio, যখন প্রমিথিউসের সাথে মোতায়েন করা হয়, স্বয়ংক্রিয়ভাবে প্রমিথিউস সার্ভারে বিভিন্ন মেট্রিক্স রিপোর্ট করে। আমরা ফ্লাইতে আমাদের ক্লাস্টারগুলি পরিচালনা করতে এই মেট্রিকগুলি ব্যবহার করতে পারি।
আমাদের প্রমিথিউস মেট্রিক্স অন্বেষণ
শুরু করার জন্য, আমাদের প্রমিথিউস স্থাপনার প্রকাশ করতে হবে।
GKE-তে Workloads ট্যাবে নেভিগেট করুন, "prometheus" কাজের চাপে ড্রিল ডাউন করুন।

আপনি একবার স্থাপনার বিশদটি দেখার পরে, অ্যাকশন -> এক্সপোজে যান।

পোর্ট 9090 এ ফরোয়ার্ড করতে বেছে নিন এবং "লোড ব্যালেন্সার" টাইপ করুন

এবং "এক্সপোজ" নির্বাচন করুন
এটি একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য IP ঠিকানায় একটি পরিষেবা তৈরি করবে যা আমরা আমাদের প্রমিথিউস মেট্রিক্স অন্বেষণ করতে ব্যবহার করতে পারি
শেষবিন্দু কার্যকর হওয়ার জন্য অপেক্ষা করুন, এবং একবার ক্লিক করুন, "বহিরাগত শেষ পয়েন্ট" এর পাশের আইপি ঠিকানায় 
আপনার এখন প্রমিথিউস UI এর দিকে নজর দেওয়া উচিত।

প্রমিথিউস তার নিজস্ব কর্মশালা হতে যথেষ্ট মেট্রিক্স প্রদান করে। যদিও আপাতত, আমরা istio_requests_total মেট্রিক অন্বেষণ করে শুরু করব।
সেই ক্যোয়ারীটি কার্যকর করা একগুচ্ছ ডেটা ফেরত দেয়। Istio পরিষেবা জালের মধ্য দিয়ে যাওয়া সমস্ত অনুরোধের মেট্রিক্স, এবং এটি অনেক কিছু! আমরা আসলেই যে বিষয়ে আগ্রহী তা ফিল্টার করতে আমরা আমাদের অভিব্যক্তি পরিবর্তন করব:
অনুরোধ যেখানে গন্তব্য পরিষেবা worker-service.default.svc.cluster.local , এবং যার উৎস frontend-deployment শেষ 15 সেকেন্ডের জন্য সীমাবদ্ধ
এই ক্যোয়ারী এর মত দেখাচ্ছে:
istio_requests_total{reporter="destination",
destination_service="worker-service.default.svc.cluster.local",
source_workload="frontend-deployment"}[15s]
এবং কাজ করার জন্য আমাদের আরও অনেক বেশি পরিচালনাযোগ্য ডেটা দেয়

কিন্তু এখনও একটু ঘন. আমরা প্রতি সেকেন্ডে অনুরোধ জানতে চাই, সব অনুরোধ নয়।
এটি পেতে, আমরা বিল্টইন rate ফাংশন ব্যবহার করতে পারি
rate(istio_requests_total{reporter="destination",
destination_service="worker-service.default.svc.cluster.local",
source_workload="frontend-deployment"}[15s])

এটি আমাদের আরও কাছে নিয়ে যাচ্ছে, তবে আমাদের সেই মেট্রিকগুলিকে একটি লজিক্যাল গ্রুপে আরও কিছুটা কমাতে হবে।
এটি করার জন্য আমরা sum এবং কীওয়ার্ড ব্যবহার by আমাদের ফলাফলগুলিকে গ্রুপ করতে এবং যোগ করতে পারি
sum(rate(istio_requests_total{reporter="destination",
destination_service="worker-service.default.svc.cluster.local",
source_workload="frontend-deployment"}[15s])) by (source_workload,
source_app, destination_service)

নিখুঁত! আমরা প্রমিথিউস থেকে আমাদের প্রয়োজনীয় সঠিক মেট্রিক্স পেতে পারি।
আমাদের চূড়ান্ত প্রমিথিউস কোয়েরি
আমরা যা শিখেছি তার সাথে, আমাদের প্রমিথিউসকে জিজ্ঞাসা করতে হবে চূড়ান্ত প্রশ্ন
sum(rate(istio_requests_total{reporter="destination",
destination_service="worker-service.default.svc.cluster.local",
source_workload="frontend-deployment"}[15s])) by (source_workload,
source_app, destination_service)
এখন আমরা মেট্রিক পেতে তাদের HTTP API ব্যবহার করতে পারি।
আমরা http GET অনুরোধ করে আমাদের প্রশ্নের সাথে তাদের এপিআই জিজ্ঞাসা করতে পারি। <prometheus-ip-here> প্রতিস্থাপন করুন
curl http://<prometheus-ip-here>/api/v1/query?query=sum\(rate\(istio_requests_total%7Breporter%3D%22destination%22%2C%0Adestination_service%3D%22worker-service.default.svc.cluster.local%22%2C%0Asource_workload%3D%22frontend-deployment%22%7D%5B15s%5D\)\)%20by%20\(source_workload%2C%0Asource_app%2C%20destination_service\)
এখানে একটি উদাহরণ প্রতিক্রিয়া:
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"destination_service": "worker-service.default.svc.cluster.local",
"source_app": "frontend",
"source_workload": "frontend-deployment"
},
"value": [
1544404907.503,
"18.892886390062788"
]
}
]
}
}
এখন, আমরা JSON থেকে আমাদের মেট্রিক মান বের করতে পারি
ক্লিনআপ
প্রমিথিউসকে প্রকাশ করার জন্য আমরা যে পরিষেবাটি ব্যবহার করেছি তা আমাদের মুছে ফেলতে হবে। Google ক্লাউড কনসোলে, আমরা এইমাত্র তৈরি করা পরিষেবাটির শীর্ষে যান এবং "মুছুন" এ ক্লিক করুন

পরবর্তী পদক্ষেপ:
ক্লাস্টারের মধ্য দিয়ে কীভাবে ট্র্যাফিক চলছে এবং কী হারে তা আবিষ্কার করার একটি উপায় নিয়ে আসার পরে, আমাদের পরবর্তী পদক্ষেপ হল একটি ছোট বাইনারি লিখতে যা পর্যায়ক্রমে প্রমিথিউসকে জিজ্ঞাসা করে এবং যদি প্রতি সেকেন্ডে worker অনুরোধগুলি একটি নির্দিষ্ট থ্রেশহোল্ডের উপরে চলে যায় তবে আবেদন করুন burst ক্লাস্টারে সমস্ত ট্র্যাফিক পাঠাতে আমাদের কর্মী ভার্চুয়াল পরিষেবাতে বিভিন্ন গন্তব্য ওজন। একবার প্রতি সেকেন্ডে অনুরোধগুলি একটি নিম্ন প্রান্তিকের নীচে চলে গেলে, সমস্ত ট্রাফিককে primary ফেরত পাঠান৷
17. একটি ক্রস ক্লাস্টার বার্স্ট তৈরি করুন
সেটআপ
প্রাথমিক ক্লাস্টারে কর্মী-পরিষেবার জন্য সমস্ত ট্রাফিক সেট করুন
আমরা primary ক্লাস্টারে worker-service জন্য নির্ধারিত সমস্ত ট্রাফিককে আমাদের আবেদনের "ডিফল্ট" অবস্থা হিসাবে বিবেচনা করব
নিচের মত দেখতে $proj/istio-manifests/worker-virtualservice.yaml সম্পাদনা করুন
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: worker-virtual-service
spec:
hosts:
- worker-service
gateways:
- mesh
http:
- route:
- destination:
host: worker-service.default.svc.cluster.local
subset: primary
port:
number: 80
weight: 100
- destination:
host: worker-service.default.svc.cluster.local
subset: burst
port:
number: 80
weight: 0
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: worker-destination-rule
spec:
host: worker-service
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: primary
labels:
cluster-type: primary-cluster
- name: burst
labels:
cluster-type: burst-cluster
নিশ্চিত করুন যে আপনি primary ক্লাস্টারের সাথে সংযুক্ত আছেন
kubectx primary
istio-manifests/worker-virtualservice.yaml প্রয়োগ করুন
kubectl apply -f istio-manifests/worker-virtualservice.yaml
ইস্টিওওয়াচার ডেমন লিখুন
আমরা এই পরিষেবাটির গতি এবং বহনযোগ্যতার জন্য লিখতে Go ব্যবহার করব। অ্যাপ্লিকেশনটির সামগ্রিক প্রবাহ শুরু হবে এবং প্রতি সেকেন্ডে, প্রশ্ন প্রমিথিউস,
src-এ istiowatcher নামে একটি নতুন ডিরেক্টরি তৈরি করুন
mkdir -p ${proj}/src/istiowatcher && cd ${proj}/src/istiowatcher
ক্লাস্টারের মধ্যে থেকে Istio কন্ট্রোল প্লেনকে ম্যানিপুলেট করার জন্য আমরা আমাদের পাত্রের মধ্যে থেকে istioctl কল করব।
istiowatcher.go লিখুন
istiowatcher.go নামে সেই ডিরেক্টরিতে একটি ফাইল তৈরি করুন এবং এতে নিম্নলিখিতটি সন্নিবেশ করুন
package main
import (
"github.com/tidwall/gjson"
"io/ioutil"
"log"
"net/http"
"os/exec"
"time"
)
func main() {
//These are in requests per second
var targetLow float64 = 10
var targetHigh float64 = 15
// This is for the ticker in milliseconds
ticker := time.NewTicker(1000 * time.Millisecond)
isBurst := false
// Our prometheus query
reqQuery := `/api/v1/query?query=sum(rate(istio_requests_total{reporter="destination",destination_service="worker-service.default.svc.cluster.local",source_workload="frontend-deployment"}[15s]))by(source_workload,source_app,destination_service)`
for t := range ticker.C {
log.Printf("Checking Prometheus at %v", t)
// Check prometheus
// Note that b/c we are querying over the past 5 minutes, we are getting a very SLOW ramp of our reqs/second
// If we wanted this to be a little "snappier" we can scale it down to say 30s
resp, err := http.Get("http://prometheus.istio-system.svc.cluster.local:9090" + reqQuery)
if err != nil {
log.Printf("Error: %v", err)
continue
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
val := gjson.Get(string(body), "data.result.0.value.1")
log.Printf("Value: %v", val)
currentReqPerSecond := val.Float()
log.Printf("Reqs per second %f", currentReqPerSecond)
if currentReqPerSecond > targetHigh && !isBurst {
applyIstio("burst.yaml")
log.Println("Entering burst mode")
isBurst = true
} else if currentReqPerSecond < targetLow && isBurst {
applyIstio("natural.yaml")
log.Println("Returning to natural state.")
isBurst = false
}
}
}
func applyIstio(filename string) {
cmd := exec.Command("istioctl", "replace", "-f", filename)
if err := cmd.Run(); err != nil {
log.Printf("Error hit applying istio manifests: %v", err)
}
}
ডকারফাইল লিখুন
Dockerfile নামে একটি নতুন ফাইল তৈরি করুন এবং এতে নিম্নলিখিতটি সন্নিবেশ করুন।
FROM golang:1.11.2-stretch as base
FROM base as builder
WORKDIR /workdir
RUN curl -LO https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-linux.tar.gz
RUN tar xzf istio-1.0.0-linux.tar.gz
RUN cp istio-1.0.0/bin/istioctl ./istioctl
FROM base
WORKDIR /go/src/istiowatcher
COPY . .
COPY --from=builder /workdir/istioctl /usr/local/bin/istioctl
RUN go get -d -v ./...
RUN go install -v ./...
CMD ["istiowatcher"]
এই মাল্টি-স্টেজ ডকারফাইলটি প্রথম পর্যায়ে ইস্টিও-এর 1.0.0 রিলিজ ডাউনলোড এবং এক্সট্রাক্ট করে। দ্বিতীয় পর্যায়টি আমাদের ডিরেক্টরি থেকে ইমেজে সবকিছু কপি করে, তারপর বিল্ড স্টেজ থেকে istioctl কপি করে /usr/local/bin (যা আমাদের অ্যাপ্লিকেশন দ্বারা বলা যেতে পারে), নির্ভরতা পায়, কোড কম্পাইল করে এবং CMD সেট করে " istiowatcher "
burst.yaml লিখুন
frontend থেকে worker অনুরোধ/সেকেন্ড 15 ছাড়িয়ে গেলে এই ফাইলটি istiowatcher প্রযোজ্য হবে।
burst.yaml নামে একটি নতুন ফাইল তৈরি করুন এবং এতে নিম্নলিখিতটি সন্নিবেশ করুন।
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: worker-virtual-service
spec:
hosts:
- worker-service
gateways:
- mesh
http:
- route:
- destination:
host: worker-service.default.svc.cluster.local
subset: primary
port:
number: 80
weight: 0
- destination:
host: worker-service.default.svc.cluster.local
subset: burst
port:
number: 80
weight: 100
Natural.yaml লিখুন
আমরা এই "প্রাকৃতিক" অবস্থায় ফিরে যাই যখন frontend থেকে worker পর্যন্ত অনুরোধ/সেকেন্ড 10-এর নিচে নেমে আসে। এই অবস্থায়, 100% ট্রাফিক primary ক্লাস্টারে পাঠানো হচ্ছে।
natural.yaml নামে একটি নতুন ফাইল তৈরি করুন এবং এতে নিম্নলিখিতটি সন্নিবেশ করুন
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: worker-virtual-service
spec:
hosts:
- worker-service
gateways:
- mesh
http:
- route:
- destination:
host: worker-service.default.svc.cluster.local
subset: primary
port:
number: 80
weight: 100
- destination:
host: worker-service.default.svc.cluster.local
subset: burst
port:
number: 80
weight: 0
ইস্টিওওয়াচার তৈরি করুন এবং পুশ করুন
Google Could Build (GCB)-এ বর্তমান ডিরেক্টরি পাঠাতে নিম্নলিখিতটি চালান, যা GCR-তে ছবিটি তৈরি এবং ট্যাগ করবে।
gcloud builds submit -t gcr.io/${GCLOUD_PROJECT}/istiowatcher
ইস্টিওওয়াচার স্থাপন করুন
আমাদের kubernetes ডিরেক্টরিতে পরিবর্তন করুন
cd ${proj}/kubernetes/
একটি স্থাপনার ফাইল লিখুন: istiowatcher.yaml
istiowatcher.yaml নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিতটি সন্নিবেশ করুন (প্রতিস্থাপন করুন <your-project-id>)।
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: istiowatcher-deployment
labels:
app: istiowatcher
spec:
replicas: 1
selector:
matchLabels:
app: istiowatcher
template:
metadata:
labels:
app: istiowatcher
spec:
serviceAccountName: istio-pilot-service-account
automountServiceAccountToken: true
containers:
- name: istiowatcher
image: gcr.io/<your-project-id>/istiowatcher
imagePullPolicy: Always
স্থাপন করুন
নিশ্চিত করুন যে আমরা প্রাথমিক ক্লাস্টারে চলছি
kubectx primary
istio-system নামস্থানে istiowatcher.yaml স্থাপন করুন
kubectl apply -n istio-system -f istiowatcher.yaml
yaml-এ serviceAccountName এবং automountServiceAccountToken নির্দেশাবলী নোট করা গুরুত্বপূর্ণ। এটি আমাদের ক্লাস্টারের মধ্যে থেকে istioctl চালানোর জন্য প্রয়োজনীয় শংসাপত্র দেয়।
istio-pilot-service-account জন্য আমাদের কাছে শংসাপত্র আছে তা নিশ্চিত করার জন্য আমাদের istio-system নামস্থানের মধ্যে এটি স্থাপন করতে হবে। (এটি default নামস্থানে বিদ্যমান নেই)।
ট্রাফিক স্বয়ংক্রিয়ভাবে সুইচ ওভার দেখুন!
এখন যাদু মুহূর্তের জন্য! আসুন আমাদের ফ্রন্টএন্ডে যাই এবং req/সেকেন্ডকে 20 এ পাম্প করি
লক্ষ্য করুন এটি কয়েক সেকেন্ড সময় নেয়, কিন্তু আমরা এটিকে র্যাম্প পর্যন্ত করি এবং আমাদের সমস্ত হ্যাশের "বার্স্টি-" উপসর্গ থাকে!
এর কারণ হল আমরা 15s পরিসরে প্রমিথিউসের নমুনা নিচ্ছি যা আমাদের প্রতিক্রিয়ার সময়কে কিছুটা পিছিয়ে দেয়। আমরা যদি আরও শক্ত ব্যান্ড চাই তাহলে আমরা আমাদের ক্যোয়ারীটিকে প্রমিথিউসে 5s.
18. পরবর্তী কি?
ক্লিনআপ
আপনি যদি এই ওয়ার্কশপের জন্য দেওয়া একটি অস্থায়ী অ্যাকাউন্ট ব্যবহার করেন তবে আপনাকে পরিষ্কার করার দরকার নেই৷
আপনি আপনার Kubernetes ক্লাস্টার, ফায়ারওয়াল নিয়ম এবং GCR-এর ছবি মুছে ফেলতে পারেন
gcloud container clusters delete primary --zone=us-west1-a
gcloud container clusters delete burst --zone=us-west1-a
gcloud compute firewall-rules delete istio-multicluster-test-pods
gcloud container images delete gcr.io/$GCLOUD_PROJECT/istiowatcher
এগিয়ে যাচ্ছে
- কিছু ইসটিও আলোচনায় যোগ দিন!
- শংসাপত্র পান: Kubernetes + Istio দিয়ে আপনার পরবর্তী অ্যাপ তৈরি করুন
- মূল বক্তব্য: Kubernetes, Istio, Knative: The New Open Cloud Stack - অপর্ণা সিনহা, Kubernetes এর গ্রুপ প্রোডাক্ট ম্যানেজার, Google
- টিউটোরিয়াল: ইস্টিও ব্যবহার করা - লি ক্যালকোট এবং গিরিশ রঙ্গনাথন, সোলারউইন্ডস
- ইসটিও - দ্য প্যাকেটস-আই ভিউ - ম্যাট টার্নার, টেট্রেট
- ইস্টিও কি এখন পর্যন্ত তৈরি করা সবচেয়ে পরবর্তী জেন নেক্সট জেনারেল ফায়ারওয়াল? - জন মোরেলো, টুইস্টলক
- Istio ডকুমেন্টেশন পড়ুন
- ইস্টিও ওয়ার্কিং গ্রুপে যোগ দিন
- টুইটারে @IstioMesh অনুসরণ করুন




