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

1. স্বাগতম

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

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

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

যা শিখবেন

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

2. সেট আপ করা হচ্ছে

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

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

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

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

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

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

68a17b036ce24ccb.png

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

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

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

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

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

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

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

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

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

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

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

gcloud init
  1. curl: ইনস্টল করুন : বেশিরভাগ Linux/macOS সিস্টেমে আগে থেকে ইনস্টল করা আছে। আপনি সম্ভবত এটি ইতিমধ্যে আছে. অন্যথায়, কীভাবে এটি ইনস্টল করতে হয় সে সম্পর্কে ইন্টারনেটে অনুসন্ধান করুন।
  2. kubectx ইন্সটল করুন ****: এখান থেকে ব্যাশ স্ক্রিপ্ট ডাউনলোড করে $PATH-এ একটি অবস্থানে
  3. 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 হল একটি সার্ভিস মেশ কন্ট্রোল প্লেন যার লক্ষ্য "সংযুক্ত, সুরক্ষিত, নিয়ন্ত্রণ এবং পরিষেবাগুলি পর্যবেক্ষণ করা"। এটি বিভিন্ন উপায়ে তা করে, তবে প্রাথমিকভাবে আপনার প্রতিটি স্থাপন করা কুবারনেটস পডগুলিতে একটি প্রক্সি কন্টেইনার ( দূত ) সাইডকার করে। প্রক্সি কন্টেইনার একটি সাধারণ-উদ্দেশ্য নীতি এবং টেলিমেট্রি হাব ( মিক্সার ) এর সাহায্যে মাইক্রোসার্ভিসের মধ্যে সমস্ত নেটওয়ার্ক যোগাযোগ নিয়ন্ত্রণ করে।

a25613cd581825da.png

এই নীতিগুলি আপনার 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: ওয়েব পৃষ্ঠা থেকে সার্ভারে দ্বিমুখী যোগাযোগের অনুমতি দেয়

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

e5e3b9cbede4cac4.png

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

7ae4bc22a58f80a6.png

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

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

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

561db37c510944bd.png

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

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

8f6183bdfc3f813c.png

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 ম্যানিফেস্টগুলি লেখা হয়েছে, এটি আমাদের অ্যাপ্লিকেশন স্থাপন করার এবং এটি কীভাবে কাজ করে তা দেখার জন্য এটি একটি ভাল পয়েন্ট!

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

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

আপনি লক্ষ্য করবেন যে আমরা লোডব্যালেন্সারের মাধ্যমে আমাদের ফ্রন্টএন্ডটি প্রকাশ করিনি। কারণ পরে আমরা 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 এর পূর্বরূপ" নির্বাচন করুন

bdb5dc75f415be11.png

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

1caafaffab26897a.png

অভিনন্দন; এটা সব আপ এবং চলমান!

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

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

আমরা আমাদের ক্লাস্টারে 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

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

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

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 সাথে

  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. রেডিস ক্যাশে স্থাপন করুন
kubectl apply -f redis.yaml
  1. রেডিস পরিষেবা স্থাপন করুন
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

যাচাই করুন

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

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

একবার তারা সব অনলাইন হলে, আমরা 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 ফাইল তৈরি করার জন্য আমাদের ক্লাস্টার সম্পর্কে কিছু তথ্য সংগ্রহ করতে হবে।

  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

একটি গোপন তৈরি করে এবং লেবেল করে "বার্স্ট" এর জন্য 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-" এর সাথে প্রিফিক্স করা হয়েছে।

78fb6e235e9f4a07.png

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

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

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

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

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

601e1155a825e0c2.png

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

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

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

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

b4a7a3cd67db05b3.png

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

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 অনুরোধ করে আমাদের প্রশ্নের সাথে তাদের এপিআই জিজ্ঞাসা করতে পারি। <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 ক্লাউড কনসোলে, আমরা এইমাত্র তৈরি করা পরিষেবাটির শীর্ষে যান এবং "মুছুন" এ ক্লিক করুন

d58cb51b4c922751.png

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

ক্লাস্টারের মধ্য দিয়ে কীভাবে ট্র্যাফিক চলছে এবং কী হারে তা আবিষ্কার করার একটি উপায় নিয়ে আসার পরে, আমাদের পরবর্তী পদক্ষেপ হল একটি ছোট বাইনারি লিখতে যা পর্যায়ক্রমে প্রমিথিউসকে জিজ্ঞাসা করে এবং যদি প্রতি সেকেন্ডে 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

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