ইস্টিও মাল্টিক্লাস্টার ব্যবহার করে "Burst" ক্লাস্টারের মধ্যে কাজের চাপ

১. স্বাগতম

গুগলের ইস্তিও মাল্টি ক্লাউড বার্স্ট কোডল্যাবে আমাদের সাথে যোগ দেওয়ার জন্য ধন্যবাদ। এই কোডল্যাবের জন্য Kubernetes, Node এবং Go-এর সাথে নতুনদের মতো ব্যবহারিক অভিজ্ঞতা প্রয়োজন।

আপনার যা প্রয়োজন হবে

  • গুগল ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্ট (বিদ্যমান অ্যাকাউন্ট ব্যবহার করুন, নাহলে আমরা বিনামূল্যে অ্যাকাউন্ট দেব)
  • আপনার ল্যাপটপে ("kubectl", "gcloud" ইত্যাদি ইনস্টল করুন) অথবা আপনি Google Cloud Shell ব্যবহার করতে পারেন।

তুমি কি শিখবে

  • GKE তে কিভাবে একটি Kubernetes ক্লাস্টার তৈরি করবেন
  • হেলম ব্যবহার করে কুবারনেটস ক্লাস্টারে ইস্তিও কীভাবে ইনস্টল করবেন
  • হেলম দিয়ে ইস্টিও মাল্টিক্লাস্টার কিভাবে ইনস্টল করবেন
  • উৎস থেকে কুবারনেটসে একটি ওয়েব অ্যাপ্লিকেশন স্থাপন করা
  • ইস্তিওতে ট্রাফিক রাউটিং নিয়ম লেখা এবং প্রয়োগ করা
  • প্রমিথিউস মেট্রিক্স
  • একটি Kubernetes ক্লাস্টারের ভিতরে কন্টেইনার ছবি তৈরি এবং পুশ করুন

2. সেট আপ করা

আপনি এই কোডল্যাবটি যেকোনও একটিতে অনুসরণ করতে পারেন:

  • গুগল ক্লাউড শেল (প্রস্তাবিত) : ইন-ব্রাউজার শেল, সরঞ্জাম ইনস্টল সহ আসে
  • আপনার ল্যাপটপ (নীচের নির্দেশাবলী অনুসরণ করুন)

গুগল ক্লাউড প্ল্যাটফর্ম দিয়ে শুরু করুন

  1. যদি আপনার GCP অ্যাকাউন্ট না থাকে, তাহলে প্রশিক্ষকের কাছ থেকে আপনার বিনামূল্যের ব্যবহারকারী অ্যাকাউন্ট কার্ডটি সংগ্রহ করুন।
  2. গুগল ক্লাউড কনসোলে যান এবং "একটি প্রকল্প নির্বাচন করুন" এ ক্লিক করুন: 5c2d9bf74c78f7e4.png সম্পর্কে
  3. কোথাও প্রকল্পের "আইডি" লিখে রাখুন , তারপর প্রকল্পটি নির্বাচন করতে ক্লিক করুন: ecc5e8e97bfa6559.png সম্পর্কে

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

ক্লাউড কনসোলে যান এবং উপরের ডানদিকের টুলবারে "Activate Cloud Shell" এ ক্লিক করুন:

68a17b036ce24ccb.png সম্পর্কে

ক্লাউড শেলে টুল যোগ করুন

  1. এখান থেকে $PATH এর একটি লোকেশনে ব্যাশ স্ক্রিপ্ট ডাউনলোড করে kubectx ****: ইনস্টল করুন
  2. 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}

ক্লাউড শেল ব্যবহার সহজ করার জন্য কিছু দ্রুত টিপস :

১. শেলটি একটি নতুন উইন্ডোতে বিচ্ছিন্ন করুন:

২. ফাইল এডিটর ব্যবহার: উপরের ডানদিকে পেন্সিল আইকনে ক্লিক করে একটি ইন-ব্রাউজার ফাইল এডিটর চালু করুন। এটি আপনার কাজে লাগবে কারণ আমরা কোড স্নিপেটগুলি ফাইলগুলিতে কপি করব।

৩. নতুন ট্যাব শুরু করুন: যদি আপনার একাধিক টার্মিনাল প্রম্পটের প্রয়োজন হয়।

৪. লেখাটি আরও বড় করুন: ক্লাউড শেলের ডিফল্ট ফন্ট সাইজ পড়ার জন্য খুব ছোট হতে পারে।

Linux/Windows-এ Ctrl-+/ macOS-এ Windows⌘-+।

যদি আপনি ক্লাউড শেলের চেয়ে নিজস্ব ওয়ার্কস্টেশন পরিবেশ ব্যবহার করতে বেশি স্বাচ্ছন্দ্য বোধ করেন, তাহলে নিম্নলিখিত সরঞ্জামগুলি সেট আপ করুন:

  1. gcloud: ইনস্টল করুন : (ক্লাউড শেলে আগে থেকে ইনস্টল করা আছে।) আপনার প্ল্যাটফর্মে gcloud ইনস্টল করার জন্য নির্দেশাবলী অনুসরণ করুন । আমরা এটি ব্যবহার করে একটি Kubernetes ক্লাস্টার তৈরি করব।
  2. kubectl ইনস্টল করুন kubectl: (ক্লাউড শেলে আগে থেকে ইনস্টল করা আছে।) ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
gcloud components install kubectl

gcloud প্রমাণীকরণের জন্য নিম্নলিখিত কমান্ডটি চালান। এটি আপনাকে আপনার Google অ্যাকাউন্ট দিয়ে লগ ইন করতে বলবে। তারপর, পূর্বনির্ধারিত প্রকল্পটি (উপরে দেখানো হয়েছে) ডিফল্ট প্রকল্প হিসাবে বেছে নিন। (আপনি একটি কম্পিউট জোন কনফিগার করা এড়িয়ে যেতে পারেন):

gcloud init
  1. curl: ইনস্টল করুন : বেশিরভাগ লিনাক্স/ম্যাকওএস সিস্টেমে আগে থেকে ইনস্টল করা আছে। সম্ভবত আপনার কাছে এটি ইতিমধ্যেই আছে। অন্যথায়, এটি কীভাবে ইনস্টল করবেন তা জানতে ইন্টারনেটে অনুসন্ধান করুন।
  2. kubectx **** ইনস্টল করুন : এখান থেকে $PATH এর একটি অবস্থানে bash স্ক্রিপ্টগুলি ডাউনলোড করে।
  3. helm **** ইনস্টল করুন : এই নির্দেশাবলী অনুসরণ করে।

৩. GCP প্রকল্প সেটআপ করুন

আপনার প্রোজেক্টে GKE (Google Kubernetes Engine), GCR (Google Container Registry), এবং GCB (Google Cloud Build) API গুলি সক্ষম করুন:

gcloud services enable \
  cloudapis.googleapis.com \
  container.googleapis.com \
  containerregistry.googleapis.com \
  cloudbuild.googleapis.com

পরিবেশ ভেরিয়েবল সেট আপ করুন

সেটআপের সময় আমরা আমাদের গুগল ক্লাউড প্রজেক্টের সাথে ব্যাপকভাবে কাজ করব, দ্রুত রেফারেন্সের জন্য একটি পরিবেশ পরিবর্তনশীল সেট করা যাক।

export GCLOUD_PROJECT=$(gcloud config get-value project)

এই কর্মশালায় আমরা কিছু কোড এবং কনফিগারেশন ফাইল তৈরি করব, তাই আসুন একটি প্রজেক্ট ডিরেক্টরি তৈরি করি এবং এতে পরিবর্তন করি।

mkdir -p src/istio-burst && \
cd src/istio-burst && \
export proj=$(pwd)

৪. "প্রাথমিক" কুবারনেটস ক্লাস্টার তৈরি করুন

আপনি গুগল কুবারনেটস ইঞ্জিন (GKE) দিয়ে সহজেই পরিচালিত কুবারনেটস ক্লাস্টার তৈরি করতে পারেন।

নিম্নলিখিত কমান্ডটি একটি Kubernetes ক্লাস্টার তৈরি করবে:

  • "প্রাথমিক" নামকরণ করা হয়েছে,
  • মার্কিন-পশ্চিম১-ক অঞ্চলে,
  • Kubernetes এর সর্বশেষ সংস্করণ উপলব্ধ,
  • ৪টি প্রাথমিক নোড সহ
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

(এটি প্রায় ৫ মিনিট সময় নিতে পারে। আপনি ক্লাউড কনসোলে ক্লাস্টার তৈরি হতে দেখতে পারেন।)

Kubernetes ক্লাস্টার তৈরি হওয়ার পর, gcloud ক্লাস্টারের দিকে নির্দেশিত শংসাপত্রগুলি দিয়ে kubectl কনফিগার করে।

gcloud container clusters get-credentials $cluster --zone=$zone

তুমি এখন তোমার নতুন ক্লাস্টারের সাথে kubectl ব্যবহার করতে পারবে।

আপনার ক্লাস্টারের Kubernetes নোডগুলি তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালান (তাদের "প্রস্তুত" অবস্থা দেখাতে হবে):

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)

৫. "বার্স্ট" ক্লাস্টার তৈরি করুন

নিম্নলিখিত কমান্ডটি একটি Kubernetes ক্লাস্টার তৈরি করবে:

  • "বিস্ফোরণ" নামকরণ করা হয়েছে,
  • মার্কিন-পশ্চিম১-ক অঞ্চলে,
  • Kubernetes এর সর্বশেষ সংস্করণ উপলব্ধ,
  • ১টি প্রাথমিক নোড সহ
  • ৫টি নোড পর্যন্ত অটোস্কেলিং সক্ষম করা হয়েছে
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

(এটি প্রায় ৫ মিনিট সময় নিতে পারে। আপনি ক্লাউড কনসোলে ক্লাস্টার তৈরি হতে দেখতে পারেন।)

Kubernetes ক্লাস্টার তৈরি হওয়ার পর, gcloud ক্লাস্টারের দিকে নির্দেশিত শংসাপত্রগুলি দিয়ে kubectl কনফিগার করে।

gcloud container clusters get-credentials $cluster --zone=$zone

তুমি এখন তোমার নতুন ক্লাস্টারের সাথে kubectl ব্যবহার করতে পারবে।

আপনার ক্লাস্টারের Kubernetes নোডগুলি তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালান (তাদের "প্রস্তুত" অবস্থা দেখাতে হবে):

kubectl get nodes

ব্যবহারের সুবিধার জন্য Kubeconfig নাম পরিবর্তন করুন

এই কমান্ডটি আপনার তৈরি করা kubeconfig এন্ট্রিটি পরিবর্তন করবে burst

kubectx ${cluster}=gke_${GCLOUD_PROJECT}_${zone}_${cluster}

অনুমতি সেট করুন:

Istio Remote স্থাপনের জন্য আপনাকে একজন ক্লাস্টার অ্যাডমিন হতে হবে। এই কমান্ডটি আপনার Google Cloud অ্যাকাউন্টের সাথে সম্পর্কিত ইমেলটিকে ক্লাস্টার অ্যাডমিন হিসেবে সেট করবে।

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole=cluster-admin \
    --user=$(gcloud config get-value core/account)

৬. ফায়ারওয়াল নিয়ম প্রয়োগ করুন

আমাদের দুটি ক্লাস্টার একে অপরের সাথে যোগাযোগ করার জন্য, আমাদের একটি ফায়ারওয়াল নিয়ম তৈরি করতে হবে।

গুগল ক্লাউড প্ল্যাটফর্মে একটি ফায়ারওয়াল নিয়ম তৈরি করতে নিম্নলিখিত কমান্ডগুলি চালান যা আমাদের ক্লাস্টারগুলিকে যোগাযোগ করতে দেবে

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

আমাদের উভয় ক্লাস্টার সেটআপ আছে এবং আমরা আমাদের অ্যাপ্লিকেশন এবং Istio তাদের উপর স্থাপন করার জন্য প্রস্তুত!

৭. ইস্তিওর ভূমিকা

ইস্তিও কি?

Istio হল একটি সার্ভিস মেশ কন্ট্রোল প্লেন যার লক্ষ্য "পরিষেবাগুলিকে সংযুক্ত করা, সুরক্ষিত করা, নিয়ন্ত্রণ করা এবং পর্যবেক্ষণ করা"। এটি বিভিন্ন উপায়ে এটি করে, তবে মূলত আপনার প্রতিটি মোতায়েন করা Kubernetes Pods-এ একটি প্রক্সি কন্টেইনার ( Envoy ) সাইডকারিং করে। প্রক্সি কন্টেইনারটি একটি সাধারণ-উদ্দেশ্য নীতি এবং টেলিমেট্রি হাব ( মিক্সার ) এর সাথে একত্রে মাইক্রোসার্ভিসেসের মধ্যে সমস্ত নেটওয়ার্ক যোগাযোগ নিয়ন্ত্রণ করে।

a25613cd581825da.png সম্পর্কে

এই নীতিগুলি আপনার Kubernetes ডিপ্লয়মেন্ট এবং পরিষেবা থেকে স্বাধীনভাবে প্রয়োগ করা যেতে পারে, যার অর্থ হল নেটওয়ার্ক অপারেটর সংশ্লিষ্ট অ্যাপ্লিকেশনগুলিকে পুনরায় স্থাপন না করেই নেটওয়ার্ক কার্যকলাপ পর্যবেক্ষণ করতে, সীমাবদ্ধ করতে, পুনঃনির্দেশ করতে বা নেটওয়ার্ক নীতিগুলি পুনর্লিখন করতে পারে।

ইস্টিও সাপোর্টের কিছু ট্র্যাফিক ম্যানেজমেন্ট বৈশিষ্ট্য হল:

  • সার্কিট ব্রেকার
  • শতাংশ-ভিত্তিক ট্র্যাফিক বিভাজন
  • URL পুনর্লিখন
  • TLS সমাপ্তি
  • স্বাস্থ্য পরীক্ষা
  • লোড ব্যালেন্সিং

এই কর্মশালার উদ্দেশ্যে, আমরা শতাংশ-ভিত্তিক ট্র্যাফিক বিভাজনের উপর আলোকপাত করব।

আমরা যেসব শর্তাবলী নিয়ে কাজ করব

ভার্চুয়াল সার্ভিস

একটি ভার্চুয়াল সার্ভিস একটি হোস্টকে সম্বোধন করার সময় প্রযোজ্য ট্র্যাফিক রাউটিং নিয়মের একটি সেট সংজ্ঞায়িত করে।

প্রবেশপথ

গেটওয়ে হলো একটি লোড ব্যালেন্সার যা মেশের প্রান্তে কাজ করে এবং ইনকামিং বা আউটগোয়িং HTTP/TCP সংযোগ গ্রহণ করে। গেটওয়ে পোর্ট, SNI কনফিগারেশন ইত্যাদি নির্দিষ্ট করতে পারে।

গন্তব্যবিধি

একটি DestinationRule রাউটিং হওয়ার পরে কোনও পরিষেবার জন্য নির্ধারিত ট্র্যাফিকের ক্ষেত্রে প্রযোজ্য নীতিগুলি সংজ্ঞায়িত করে। তারা লোড ব্যালেন্সিংয়ের জন্য কনফিগারেশন, সাইডকার থেকে সংযোগ পুলের আকার এবং আউটলায়ার সনাক্তকরণ সেটিংস নির্দিষ্ট করে।

ইস্তিও মাল্টিক্লাস্টার

আপনি হয়তো লক্ষ্য করেছেন যখন আমরা আমাদের দুটি ক্লাস্টার তৈরি করেছিলাম, তখন আমাদের primary ক্লাস্টারটিতে অটোস্কেলিং ছাড়াই ৪টি নোড ছিল এবং আমাদের burst ক্লাস্টারটিতে ৫টি নোড পর্যন্ত অটোস্কেলিং সহ ১টি নোড ছিল।

এই কনফিগারেশনের দুটি কারণ রয়েছে।

প্রথমত, আমরা "অন-প্রেম" থেকে ক্লাউড পরিস্থিতি অনুকরণ করতে চাই। অন-প্রেম পরিবেশে আপনার অটোস্কেলিং ক্লাস্টারগুলিতে অ্যাক্সেস থাকবে না কারণ আপনার স্থির অবকাঠামো রয়েছে।

দ্বিতীয়ত, Istio চালানোর জন্য ন্যূনতম প্রয়োজনীয়তা হল 4 নোড সেটআপ (উপরে বর্ণিত হিসাবে)। এর ফলে প্রশ্ন ওঠে: যদি Istio-এর জন্য ন্যূনতম 4 নোডের প্রয়োজন হয়, তাহলে আমাদের burst ক্লাস্টার কীভাবে 1 নোড দিয়ে Istio চালাতে পারে? উত্তর হল Istio Multicluster Istio পরিষেবাগুলির একটি অনেক ছোট সেট ইনস্টল করে এবং নীতি নিয়মগুলি পুনরুদ্ধার করতে এবং টেলিমেট্রি তথ্য প্রকাশ করতে প্রাথমিক ক্লাস্টারে Istio ইনস্টলেশনের সাথে যোগাযোগ করে।

৮. অ্যাপ্লিকেশন আর্কিটেকচার ওভারভিউ

উপাদানগুলির ওভারভিউ

আমরা NodeJS এবং Redis ব্যবহার করে একটি তিন স্তরবিশিষ্ট অ্যাপ্লিকেশন স্থাপন করব।

কর্মী

ওয়ার্কার অ্যাপ্লিকেশনটি NodeJS-এ লেখা এবং আগত POST HTTP অনুরোধগুলি শুনবে, সেগুলিতে একটি হ্যাশিং অপারেশন করবে এবং যদি PREFIX নামক একটি পরিবেশ ভেরিয়েবল সংজ্ঞায়িত করা হয়, তবে এটি সেই মান সহ হ্যাশটি প্রিপেন্ড করবে। হ্যাশ গণনা করা হয়ে গেলে, অ্যাপ্লিকেশনটি নির্দিষ্ট Redis সার্ভারের চ্যানেল " calculation "-এ ফলাফল পাঠায়।

মাল্টিক্লাস্টার কার্যকারিতা প্রদর্শনের জন্য আমরা পরবর্তীতে PREFIX এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করব।

রেফারেন্সের জন্য: অ্যাপ্লিকেশনটি যে প্যাকেজগুলি ব্যবহার করে সেগুলি হল এইগুলি।

  • body-parser: আমাদের HTTP অনুরোধগুলি পার্স করার অনুমতি দেয়।
  • cors: ক্রস অরিজিন রিসোর্স শেয়ারিং ব্যবহারের অনুমতি দেয়
  • dotenv: পরিবেশের ভেরিয়েবলের সহজ বিশ্লেষণ
  • express: সহজ ওয়েব সাইট হোস্টিং
  • ioredis: রেডিস ডাটাবেসের সাথে যোগাযোগের জন্য ক্লায়েন্ট লাইব্রেরি
  • morgan: সুন্দর কাঠামোগত লগ প্রদান করে

ফ্রন্টএন্ড

আমাদের ফ্রন্টএন্ডটিও একটি NodeJS অ্যাপ্লিকেশন যা express ব্যবহার করে একটি ওয়েব পৃষ্ঠা হোস্ট করে। এটি ব্যবহারকারীর ইনপুট করা ফ্রিকোয়েন্সি নেয় এবং সেই হারে আমাদের worker অ্যাপ্লিকেশনে অনুরোধ পাঠায়। এই অ্যাপ্লিকেশনটি " calculation " নামক একটি Redis চ্যানেলে বার্তাগুলিতেও সাবস্ক্রাইব করে এবং ফলাফলগুলি একটি ওয়েব পৃষ্ঠায় প্রদর্শন করে।

অ্যাপ্লিকেশনটি নিম্নলিখিত নির্ভরতা ব্যবহার করে।

  • body-parser: আমাদের HTTP অনুরোধগুলি পার্স করার অনুমতি দেয়।
  • dotenv: পরিবেশের ভেরিয়েবলের সহজ বিশ্লেষণ
  • express: সহজ ওয়েব সাইট হোস্টিং
  • ioredis: রেডিস ডাটাবেসের সাথে যোগাযোগের জন্য ক্লায়েন্ট লাইব্রেরি
  • morgan: সুন্দর কাঠামোগত লগ প্রদান করে
  • request: HTTP অনুরোধ করার অনুমতি দেয়
  • socket.io: ওয়েব পৃষ্ঠা থেকে সার্ভারে দ্বিমুখী যোগাযোগের অনুমতি দেয়

এই ওয়েবপৃষ্ঠাটি স্টাইলিংয়ের জন্য বুটস্ট্র্যাপ ব্যবহার করে এবং চালানো হলে, এটি দেখতে নিচের মতো দেখাবে

e5e3b9cbede4cac4.png

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

7ae4bc22a58f80a6.png সম্পর্কে

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

আমরা আমাদের তৈরি দুটি ক্লাস্টার জুড়ে আমাদের চূড়ান্ত অ্যাপ্লিকেশনটি স্থাপন করব। primary ক্লাস্টারে সমস্ত উপাদান ( frontend , worker এবং রেডিস) স্থাপন করা হবে, তবে burst ক্লাস্টারে কেবল worker অ্যাপ্লিকেশনটি স্থাপন করা হবে।

এখানে দুটি ক্লাস্টারের বর্ণনা দেওয়া একটি চিত্র দেওয়া হল। লাল রঙে বর্ণিত বাক্সগুলি হল Kubernetes Services, নীল রঙে বর্ণিত বাক্সগুলি হল Kubernetes Deployments। হলুদ বাক্সগুলি আমাদের Istio ইনস্টলেশনকে নির্দেশ করে।

561db37c510944bd.png সম্পর্কে

লক্ষ্য করুন কিভাবে burst ক্লাস্টারে Redis-এর জন্য একটি পরিষেবা এখনও স্থাপন করা হয়েছে যদিও ক্লাস্টারে Redis-এর জন্য কোনও স্থাপনা নেই। আমাদের এই পরিষেবাটি ক্লাস্টারে থাকা দরকার যাতে Kubernetes DNS অনুরোধটি সমাধান করতে পারে, কিন্তু যখন অনুরোধটি আসলে করা হয়, তখন Istio Proxy অনুরোধটিকে primary ক্লাস্টারে Redis স্থাপনার দিকে পুনঃরায় পাঠাবে।

চূড়ান্ত অ্যাপ্লিকেশনটিতে istiowatcher. নামে primary ক্লাস্টারে একটি অতিরিক্ত ডিপ্লয়মেন্ট চালু থাকবে। এটিই আমাদের ট্র্যাফিক একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করলে স্বয়ংক্রিয়ভাবে ট্র্যাফিককে গতিশীলভাবে burst পুনঃরুট করার অনুমতি দেবে।

8f6183bdfc3f813c.png সম্পর্কে

৯. অ্যাপ্লিকেশন ডিপ্লয়মেন্ট ফাইল তৈরি করুন

আমাদের অ্যাপ্লিকেশন স্থাপনের জন্য আমাদের Kubernetes manifest এর একটি সেট তৈরি করতে হবে।

প্রকল্পের রুট ডিরেক্টরিতে পরিবর্তন করুন এবং 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 " হিসেবে নির্ধারণ করেছি এবং ফলাফলস্বরূপ পরিষেবাটি সমাধানের জন্য Kubernetes বিল্ট-ইন DNS বৈশিষ্ট্য ব্যবহার করব।
  • আমরা আমাদের REDIS_URL এর ঠিকানা " redis-cache-service:6379 " হিসেবে সেট করেছি এবং ফলাফলস্বরূপ IP ঠিকানাগুলি সমাধান করার জন্য Kubernetes বিল্ট-ইন DNS বৈশিষ্ট্য ব্যবহার করব।
  • কন্টেইনারটি কখন চালু হচ্ছে তা কুবারনেটসকে জানানোর জন্য আমরা কন্টেইনারে liveness এবং readiness প্রোবও সেট করেছি।

worker-service.yaml লিখুন

আমরা Kubernetes পরিষেবার সংজ্ঞাটি Deployment সংজ্ঞার পরিবর্তে একটি পৃথক ফাইলে লিখছি কারণ আমরা এই পরিষেবাটি একাধিক ক্লাস্টার জুড়ে পুনরায় ব্যবহার করব, তবে প্রতিটি ক্লাস্টারের জন্য একটি ভিন্ন Deployment লিখব।

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"

লক্ষ্য করুন, আমরা আমাদের অ্যাপ্লিকেশনের ব্যবহারের জন্য liveness এবং readiness প্রোব প্রদানের পাশাপাশি PORT এবং REDIS_URL পরিবেশ ভেরিয়েবল নির্দিষ্ট করার একই ধরণ অনুসরণ করছি।

এই স্থাপনার ক্ষেত্রে আরেকটি বিষয় লক্ষণীয়, তা হলো PREFIX এনভায়রনমেন্ট ভেরিয়েবলের অভাব। এর মানে হল আমাদের গণনার ফলাফল হবে raw হ্যাশ (এগুলো প্রিফিক্স করে কিছু লেখা হবে না)।

এই স্থাপনার শেষ মূল বিষয় হল cluster-type: primary-cluster লেবেল। আমরা পরবর্তীতে যখন ইস্টিও মাল্টিক্লাস্টারে ট্র্যাফিক রাউটিং করব তখন এটি ব্যবহার করব।

redis.yaml লিখুন

আমাদের কর্মী থেকে ফ্রন্টএন্ডে যোগাযোগ একটি Redis চ্যানেলের মাধ্যমে হয়, এবং তাই আমাদের ক্লাস্টারে একটি Redis অ্যাপ্লিকেশন স্থাপন করতে হবে।

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 ডিপ্লয়মেন্ট অ্যাক্সেস করার জন্য redis-cache-service নামের পরিষেবা প্রদান করে।

১০. অ্যাপ্লিকেশনটি স্থাপন করুন

আমাদের ছবিগুলি GCR-তে পুশ করা হয়েছে এবং আমাদের Kubernetes manifests লেখা হয়েছে, এটি আমাদের অ্যাপ্লিকেশনটি স্থাপন করার এবং এটি কীভাবে কাজ করে তা দেখার জন্য একটি ভাল পয়েন্ট!

অ্যাপ্লিকেশনটি স্থাপন করতে নিম্নলিখিত কমান্ডগুলি চালান

  1. নিশ্চিত করুন যে আমরা সঠিক ক্লাস্টারে আছি।
kubectx primary
  1. Redis ক্যাশে স্থাপন করুন
kubectl apply -f redis.yaml
  1. Redis পরিষেবা স্থাপন করুন
kubectl apply -f redis-service.yaml
  1. ফ্রন্টএন্ড স্থাপন করুন
kubectl apply -f frontend.yaml
  1. কর্মী মোতায়েন করুন
kubectl apply -f worker-primary.yaml
  1. কর্মী পরিষেবা স্থাপন করুন
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

আপনি লক্ষ্য করবেন যে আমরা LoadBalancer এর মাধ্যমে আমাদের ফ্রন্টএন্ডটি প্রকাশ করিনি। কারণ পরবর্তীতে আমরা Istio এর মাধ্যমে অ্যাপ্লিকেশনটি অ্যাক্সেস করব। সবকিছু ঠিকঠাক চলছে কিনা তা পরীক্ষা করার জন্য, আমরা kubectl port-forward. আপনার স্থানীয় (অথবা Cloud Shell) মেশিনের পোর্ট 8080 কে frontend ডিপ্লয়মেন্ট চালানোর সময় পোর্ট 8080 এ ফরোয়ার্ড করতে নিম্নলিখিত কমান্ডটি চালান।

kubectl port-forward \
$(kubectl get pods -l app=frontend -o jsonpath='{.items[0].metadata.name}') \
8080:8080

যদি আপনি স্থানীয়ভাবে চালাচ্ছেন : একটি ওয়েব ব্রাউজার খুলুন এবং http://localhost:8080 এ নেভিগেট করুন

যদি আপনি ক্লাউড শেল ব্যবহার করেন: "ওয়েব প্রিভিউ" বোতামে ক্লিক করুন এবং "পোর্ট 8080-এ প্রিভিউ" নির্বাচন করুন।

bdb5dc75f415be11.png সম্পর্কে

তুমি ফ্রন্টএন্ড দেখতে পাবে! আর যদি তুমি "ফ্রিকোয়েন্সি" বাক্সে একটি সংখ্যা প্রবেশ করাও, তাহলে তুমি দেখতে পাবে হ্যাশগুলি দেখা দিতে শুরু করেছে।

1cafaffab26897a.png সম্পর্কে

অভিনন্দন; সব ঠিক হয়ে গেছে!

পোর্ট ফরওয়ার্ড করা বন্ধ করতে Ctrl+C টিপুন।

১১. ক্লিনআপ ডিপ্লয়েড অ্যাপ্লিকেশন

আমরা আমাদের ক্লাস্টারে Istio প্রয়োগ করব এবং তারপর আমাদের অ্যাপ্লিকেশনটি পুনরায় স্থাপন করব, তাই প্রথমে আমাদের বর্তমান অ্যাপ্লিকেশনটি পরিষ্কার করা যাক।

আপনার তৈরি করা সমস্ত ডিপ্লয়মেন্ট এবং পরিষেবা মুছে ফেলার জন্য নিম্নলিখিত কমান্ডগুলি চালান।

  1. redis-cache-service মুছে ফেলুন
kubectl delete -f redis-service.yaml
  1. redis মুছে ফেলুন
kubectl delete -f redis.yaml
  1. frontend মুছুন
kubectl delete -f frontend.yaml
  1. worker মুছুন
kubectl delete -f worker-primary.yaml
  1. worker-service মুছুন
kubectl delete -f worker-service.yaml

১২. প্রাথমিক ক্লাস্টারে Istio ইনস্টল করুন

ইস্তিও পান

Istio এর রিলিজগুলি GitHub এ হোস্ট করা হয়েছে। নিম্নলিখিত কমান্ডগুলি Istio এর 1.0.0 সংস্করণটি ডাউনলোড করবে এবং এটি আনপ্যাক করবে।

  1. আপনার প্রকল্পের মূলে পরিবর্তন করুন
cd ${proj}
  1. সংরক্ষণাগারটি ডাউনলোড করুন
curl -LO https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-linux.tar.gz
  1. আর্কাইভটি বের করুন এবং সরান
tar xzf istio-1.0.0-linux.tar.gz && rm istio-1.0.0-linux.tar.gz

ইস্তিও টেমপ্লেট তৈরি করুন

নিম্নলিখিত 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 সিস্টেমে Prometheus এবং ServiceGraph সাপোর্ট যোগ করে। আমরা পরবর্তীতে ল্যাবে Prometheus পরিষেবা ব্যবহার করব।

ইস্তিও স্থাপন করুন

istio স্থাপনের জন্য আমাদের প্রথমে istio-system নামে একটি নেমস্পেস তৈরি করতে হবে যেখানে istio Deployments এবং Services চালানো যাবে।

kubectl create namespace istio-system

এবং অবশেষে Helm দিয়ে তৈরি istio-primary.yaml ফাইলটি প্রয়োগ করুন।

kubectl apply -f istio-primary.yaml

লেবেল ডিফল্ট নেমস্পেস

Istio আপনার প্রতিটি ডিপ্লয়মেন্টে একটি সাইডকার প্রক্সি পরিষেবা ইনজেক্ট করে কাজ করে। এটি একটি অপ্ট-ইন ভিত্তিতে করা হয় তাই আমাদের default নেমস্পেসকে istio-injection=enabled দিয়ে লেবেল করতে হবে যাতে Istio স্বয়ংক্রিয়ভাবে আমাদের জন্য সাইডকার ইনজেক্ট করতে পারে।

kubectl label namespace default istio-injection=enabled

অভিনন্দন! আমাদের অ্যাপ্লিকেশনটি স্থাপনের জন্য Istio সহ একটি ক্লাস্টার প্রস্তুত এবং চালু আছে!

১৩. ইস্তিও ট্র্যাফিক ম্যানেজমেন্টের সাথে আমাদের অ্যাপ্লিকেশনটি স্থাপন করুন

ইস্টিও ট্র্যাফিক ম্যানেজমেন্ট কনফিগারেশন ফাইল তৈরি করুন

Istio Kubernetes এর মতোই কাজ করে কারণ এটি কনফিগারেশনের জন্য yaml ফাইল ব্যবহার করে। এই ধারায়, আমাদের ফাইলের একটি সেট তৈরি করতে হবে যা Istio কে আমাদের ট্র্যাফিক কীভাবে প্রকাশ এবং রুট করতে হয় তা জানাবে।

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 নীতিগুলি স্থাপন করা অন্যান্য Kubernetes সম্পদের মতোই করা হয়, kubectl apply মাধ্যমে

  1. আমাদের গেটওয়ে প্রয়োগ করুন
kubectl apply -f frontend-gateway.yaml
  1. আমাদের Redis VirtualService প্রয়োগ করুন
kubectl apply -f redis-virtualservice.yaml
  1. আমাদের ওয়ার্কার ভার্চুয়াল সার্ভিস প্রয়োগ করুন
kubectl apply -f worker-virtualservice.yaml

অ্যাপ্লিকেশন স্থাপন করুন

  1. আমাদের kubernetes ডিরেক্টরিতে ফিরে যান।
cd ${proj}/kubernetes
  1. Redis ক্যাশে স্থাপন করুন
kubectl apply -f redis.yaml
  1. Redis পরিষেবা স্থাপন করুন
kubectl apply -f redis-service.yaml
  1. ফ্রন্টএন্ড স্থাপন করুন
kubectl apply -f frontend.yaml
  1. কর্মী মোতায়েন করুন
kubectl apply -f worker-primary.yaml
  1. কর্মী পরিষেবা স্থাপন করুন
kubectl apply -f worker-service.yaml

যাচাই করুন

এই মুহুর্তে আমরা Istio এবং ট্র্যাফিক ব্যবস্থাপনা নীতি সহ একটি ক্লাস্টারে আমাদের অ্যাপ্লিকেশনটি পুনরায় স্থাপন করেছি।

আমাদের সমস্ত কাজের চাপ অনলাইনে আসার জন্য অপেক্ষা করা যাক।

একবার তারা সবাই অনলাইনে চলে গেলে, 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 -->
...

১৪. "বার্স্ট" ক্লাস্টারে Istio ইনস্টল করুন

আমরা আমাদের primary ক্লাস্টার স্থাপন এবং স্থাপনের জন্য অনেক সময় ব্যয় করছি, কিন্তু আমাদের আরও একটি সম্পূর্ণ ক্লাস্টার স্থাপন করতে হবে!

এই বিভাগে আমাদের উভয় ক্লাস্টারের কনফিগারেশন ভেরিয়েবলগুলি ধরতে হবে, তাই প্রতিটি কমান্ডের জন্য আমাদের কোন ক্লাস্টারের দিকে নির্দেশ করা হয়েছে সেদিকে মনোযোগ দিন।

ইস্তিও রিমোট ম্যানিফেস্ট তৈরি করুন

অনেকটা যখন আমরা primary ক্লাস্টারে Istio স্থাপন করেছিলাম, ঠিক তখনই আমরা burst ক্লাস্টারে Istio রিমোটের স্থাপনার টেমপ্লেট তৈরি করতে Helm ব্যবহার করব। তবে এটি করার আগে, আমাদের 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}')

রিমোট টেমপ্লেট তৈরি করুন

এখন আমরা helm ব্যবহার করে istio-remote-burst.yaml নামে একটি ফাইল তৈরি করব যা আমরা 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 ফাইলটি ব্যবহার করতে হবে।

kubecontext কে burst এ পরিবর্তন করুন

kubectx burst

istio-system নেমস্পেস তৈরি করুন

kubectl create ns istio-system

istio-burst.yaml প্রয়োগ করুন

kubectl apply -f istio-remote-burst.yaml

লেবেল ডিফল্ট নেমস্পেস

আবারও, আমাদের default নেমস্পেস লেবেল করতে হবে যাতে প্রক্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করা যায়।

kubectl label namespace default istio-injection=enabled

অভিনন্দন! এই মুহুর্তে আমরা burst ক্লাস্টারে Istio রিমোট সেট আপ করেছি। তবে, এই মুহুর্তে, ক্লাস্টারগুলি এখনও যোগাযোগ করতে অক্ষম। আমাদের burst ক্লাস্টারের জন্য একটি kubeconfig ফাইল তৈরি করতে হবে যা আমরা primary ক্লাস্টারে স্থাপন করতে পারি যাতে তাদের একসাথে লিঙ্ক করা যায়।

"burst" ক্লাস্টারের জন্য kubeconfig তৈরি করুন

বার্স্ট ক্লাস্টারে পরিবর্তন করুন

kubectx burst

পরিবেশ সেট আপ করুন

ক্লাস্টারের জন্য একটি kubeconfig ফাইল তৈরি করার জন্য আমাদের কিছু তথ্য সংগ্রহ করতে হবে।

  1. ক্লাস্টারের নাম জানুন
CLUSTER_NAME=$(kubectl config view --minify=true -o "jsonpath={.clusters[].name}")
  1. ক্লাস্টার সার্ভারের নাম পান
SERVER=$(kubectl config view --minify=true -o "jsonpath={.clusters[].cluster.server}")
  1. istio-multi সার্ভিস অ্যাকাউন্ট সার্টিফিকেট অথরিটির গোপন নামটি পান
SECRET_NAME=$(kubectl get sa istio-multi -n istio-system -o jsonpath='{.secrets[].name}')
  1. পূর্ববর্তী গোপনে সংরক্ষিত সার্টিফিকেট কর্তৃপক্ষের ডেটা পান
CA_DATA=$(kubectl get secret ${SECRET_NAME} -n istio-system -o "jsonpath={.data['ca\.crt']}")
  1. পূর্ববর্তী গোপনীয়তায় টোকেনটি সংরক্ষণ করুন
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

"burst" এর জন্য 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

অভিনন্দন! আমরা উভয় ক্লাস্টারকে প্রমাণীকরণ করেছি এবং Istio Multicluster এর মাধ্যমে একে অপরের সাথে যোগাযোগ করছি। আসুন আমাদের অ্যাপ্লিকেশন Cross-Cluster ব্যবহার করি।

১৫. একটি ক্রস-ক্লাস্টার অ্যাপ্লিকেশন স্থাপন করুন

স্থাপনা তৈরি করুন

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-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) উল্লেখ করে, কিন্তু ৫০% ট্র্যাফিক primary সাবসেটে এবং বাকি ৫০% burst সাবসেটে পাঠানো হচ্ছে।

আমরা primary উপসেটকে এমন ডিপ্লয়মেন্ট হিসেবে সংজ্ঞায়িত করেছি যাদের লেবেল cluster-type: primary-cluster আছে এবং burst সাবসেট হল সেই ডিপ্লয়মেন্ট যাদের লেবেল cluster-type: burst-cluster আছে।

এটি কার্যকরভাবে আমাদের ট্র্যাফিককে দুটি ক্লাস্টারের মধ্যে ৫০/৫০ ভাগে ভাগ করে দেয়।

ক্লাস্টারে স্থাপন করুন

বার্স্ট ক্লাস্টারে redis-service.yaml স্থাপন করুন

burst kubeconfig-এ পরিবর্তন করুন

kubectx burst

আমাদের প্রোজেক্ট রুটে পরিবর্তন করুন

cd ${proj}

তারপর স্থাপন করুন

বার্স্ট ক্লাস্টারে redis-service.yaml স্থাপন করুন

kubectl apply -f kubernetes/redis-service.yaml

বার্স্ট ক্লাস্টারে worker-burst.yaml স্থাপন করুন

kubectl apply -f kubernetes/worker-burst.yaml

বার্স্ট ক্লাস্টারে worker-service.yaml স্থাপন করুন

kubectl apply -f kubernetes/worker-service.yaml

ইস্তিও ভার্চুয়াল সার্ভিসেস প্রয়োগ করুন

primary kubeconfig-এ পরিবর্তন করুন

kubectx primary

তারপর স্থাপন করুন

kubectl apply -f istio-manifests/worker-virtualservice.yaml

এটি কাজ করে যাচাই করুন

এটি কাজ করে কিনা তা যাচাই করতে, আপনার Istio Ingress পয়েন্টে ব্রাউজ করুন এবং লক্ষ্য করুন যে প্রায় ৫০% হ্যাশের আগে "burst-" লেখা আছে।

78fb6e235e9f4a07.png সম্পর্কে

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

১৬. প্রমিথিউস মেট্রিক্সের ব্যবহার

প্রমিথিউসের একটি ভূমিকা

প্রমিথিউস , একটি ওপেন-সোর্স সিস্টেম মনিটরিং এবং অ্যালার্টিং টুলকিট যা মূলত সাউন্ডক্লাউডে তৈরি করা হয়েছিল। এটি মেট্রিক নাম এবং কী/মান জোড়া দ্বারা চিহ্নিত টাইম সিরিজ ডেটা সহ একটি বহুমাত্রিক ডেটা মডেল বজায় রাখে।

রেফারেন্সের জন্য, এখানে প্রমিথিউস আর্কিটেকচার ডায়াগ্রামটি দেওয়া হল:

601e1155a825e0c2.png সম্পর্কে

প্রমিথিউসের সাথে স্থাপন করা হলে, ইস্তিও স্বয়ংক্রিয়ভাবে প্রমিথিউস সার্ভারে বিভিন্ন মেট্রিক্স রিপোর্ট করে। আমরা এই মেট্রিক্সগুলি ব্যবহার করে আমাদের ক্লাস্টারগুলি তাৎক্ষণিকভাবে পরিচালনা করতে পারি।

আমাদের প্রমিথিউস মেট্রিক্স অন্বেষণ করা

শুরু করার জন্য, আমাদের প্রমিথিউস ডিপ্লয়মেন্টটি প্রকাশ করতে হবে।

GKE-তে Workloads ট্যাবে নেভিগেট করুন, "prometheus" ওয়ার্কলোডটি ড্রিল ডাউন করুন।

b4a7a3cd67db05b3.png সম্পর্কে

স্থাপনার বিশদ বিবরণ দেখার পর, Actions -> Expose-এ যান।

c04a482e55bdfd41.png সম্পর্কে

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

d5af3ba22a7a6ebb.png সম্পর্কে

এবং "এক্সপোজ" নির্বাচন করুন

এটি একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য IP ঠিকানার উপর একটি পরিষেবা তৈরি করবে যা আমরা আমাদের প্রমিথিউস মেট্রিক্স অন্বেষণ করতে ব্যবহার করতে পারি।

এন্ডপয়েন্টটি কার্যকর হওয়ার জন্য অপেক্ষা করুন, এবং একবার "বহিরাগত এন্ডপয়েন্ট" এর পাশে থাকা আইপি ঠিকানায় ক্লিক করুন। b1e40ad90851da29.png সম্পর্কে

তোমার এখন প্রমিথিউস UI দেখা উচিত।

ed273552270337ec.png সম্পর্কে

প্রমিথিউস তার নিজস্ব কর্মশালা হিসেবে যথেষ্ট মেট্রিক্স সরবরাহ করে। তবে আপাতত, আমরা 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]

এবং আমাদের কাজ করার জন্য অনেক বেশি পরিচালনাযোগ্য ডেটা সেট দেয়

19d551fd5eac3785.png সম্পর্কে

কিন্তু এখনও একটু ঘন। আমরা প্রতি সেকেন্ডে অনুরোধগুলি জানতে চাই, সমস্ত অনুরোধ নয়।

এটি পেতে, আমরা বিল্টইন rate ফাংশন ব্যবহার করতে পারি

rate(istio_requests_total{reporter="destination",
destination_service="worker-service.default.svc.cluster.local",
source_workload="frontend-deployment"}[15s])

dbb9dc063a18da9b.png সম্পর্কে

এটি আমাদের আরও কাছে নিয়ে আসছে, কিন্তু আমাদের সেই মেট্রিক্সগুলিকে আরও কিছুটা কমিয়ে একটি যৌক্তিক গোষ্ঠীতে পরিণত করতে হবে।

এটি করার জন্য আমরা 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)

898519966930ec56.png সম্পর্কে

নিখুঁত! আমরা প্রমিথিউসের কাছ থেকে আমাদের প্রয়োজনীয় সঠিক মেট্রিক্স পেতে পারি।

আমাদের শেষ প্রমিথিউস প্রশ্ন

আমরা যা শিখেছি তার সবশেষে, প্রমিথিউসকে আমাদের জিজ্ঞাসা করতে হবে যে শেষ প্রশ্নটি হল

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 অনুরোধ করে আমাদের প্রশ্নের সাথে তাদের API অনুসন্ধান করতে পারি। <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 থেকে আমাদের মেট্রিক মান বের করতে পারি

পরিষ্কার করা

প্রমিথিউসকে প্রকাশ করার জন্য আমরা যে পরিষেবাটি ব্যবহার করেছি তা আমাদের মুছে ফেলতে হবে। গুগল ক্লাউড কনসোলে, আমরা যে পরিষেবাটি তৈরি করেছি তার উপরে যান এবং "মুছুন" এ ক্লিক করুন।

d58cb51b4c922751.png সম্পর্কে

পরবর্তী পদক্ষেপ:

ক্লাস্টারের মধ্য দিয়ে ট্র্যাফিক কীভাবে চলছে এবং কোন হারে চলছে তা আবিষ্কার করার একটি উপায় বের করার পর, আমাদের পরবর্তী পদক্ষেপ হল একটি ছোট বাইনারি লেখা যা পর্যায়ক্রমে প্রোমিথিউসকে জিজ্ঞাসা করে, এবং যদি worker প্রতি সেকেন্ডে অনুরোধগুলি একটি নির্দিষ্ট থ্রেশহোল্ডের উপরে যায়, তাহলে আমাদের কর্মী ভার্চুয়াল পরিষেবাতে বিভিন্ন গন্তব্য ওজন প্রয়োগ করুন যাতে সমস্ত ট্র্যাফিক burst ক্লাস্টারে পাঠানো যায়। প্রতি সেকেন্ডে অনুরোধগুলি নিম্ন থ্রেশহোল্ডের নীচে চলে গেলে, সমস্ত ট্র্যাফিককে primary এ ফেরত পাঠান।

১৭. একটি ক্রস ক্লাস্টার বার্স্ট তৈরি করুন

সেটআপ

কর্মী-সেবার জন্য সমস্ত ট্র্যাফিক প্রাথমিক ক্লাস্টারে সেট করুন

আমরা worker-service জন্য নির্ধারিত সমস্ত ট্র্যাফিককে primary ক্লাস্টারে পাঠানোর জন্য আমাদের অ্যাপ্লিকেশনের "ডিফল্ট" অবস্থা হিসাবে বিবেচনা করব।

$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

istiowatcher ডেমন লিখুন

এই পরিষেবাটির গতি এবং বহনযোগ্যতার জন্য আমরা 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"]

এই মাল্টি-স্টেজ ডকারফাইলটি প্রথম পর্যায়ে Istio-এর 1.0.0 রিলিজ ডাউনলোড করে এবং এক্সট্র্যাক্ট করে। দ্বিতীয় পর্যায়ে আমাদের ডিরেক্টরি থেকে সবকিছু ছবিতে কপি করে, তারপর বিল্ড স্টেজ থেকে /usr/local/binistioctl কপি করে (যাতে এটি আমাদের অ্যাপ্লিকেশন দ্বারা কল করা যেতে পারে), নির্ভরতা পায়, কোড কম্পাইল করে এবং CMD " istiowatcher " হিসেবে সেট করে।

burst.yaml লিখুন

frontend থেকে worker কাছে অনুরোধ/সেকেন্ড ১৫ এর বেশি হলে 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 রিকোয়েস্ট/সেকেন্ড ১০ এর নিচে নেমে গেলে আমরা এটিকে "প্রাকৃতিক" অবস্থায় ফিরে যেতে বিবেচনা করব। এই অবস্থায়, ১০০% ট্র্যাফিক 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 Coud 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 namespace এর মধ্যে স্থাপন করতে হবে (এটি default namespace এ বিদ্যমান নেই)।

দেখুন ট্র্যাফিক স্বয়ংক্রিয়ভাবে বদলে যাচ্ছে!

এবার ম্যাজিক মুহূর্ত! চলুন আমাদের ফ্রন্টএন্ডে যাই এবং চাহিদা/সেকেন্ড ২০ এ উন্নীত করি।

লক্ষ্য করুন এটি কয়েক সেকেন্ড সময় নেয়, কিন্তু আমরা এটি র‍্যাম্প করে দেখি এবং আমাদের সমস্ত হ্যাশে "bursty-" প্রিফিক্স থাকে!

এর কারণ হল আমরা 15s বেশি প্রমিথিউসের নমুনা নিচ্ছি যার ফলে আমাদের রেসপন্স টাইম কিছুটা পিছিয়ে যাচ্ছে। যদি আমরা আরও টাইট ব্যান্ড চাইতাম, তাহলে আমাদের কোয়েরিটি প্রমিথিউসে পরিবর্তন করে 5s.

১৮. এরপর কী?

পরিষ্কার করা

এই কর্মশালার জন্য প্রদত্ত একটি অস্থায়ী অ্যাকাউন্ট ব্যবহার করলে আপনাকে পরিষ্কার করার দরকার নেই।

আপনি আপনার 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

এগিয়ে যাচ্ছি