Google Kubernetes Engine (GKE) এর সাথে আপনার ওয়েবসাইট স্থাপন, স্কেল এবং আপডেট করুন

১. ভূমিকা

ওয়েবসাইট ও অ্যাপ্লিকেশন চালানো কঠিন।

যখন সমস্যা হওয়ার কথা নয়, তখনই সমস্যা দেখা দেয়; সার্ভার ক্র্যাশ করে, চাহিদা বাড়ার কারণে আরও বেশি রিসোর্স ব্যবহৃত হয়, এবং ডাউনটাইম ছাড়া পরিবর্তন আনা জটিল ও চাপযুক্ত হয়ে পড়ে।

এমন একটি টুলের কথা ভাবুন যা আপনাকে এই সবকিছু করতে সাহায্য করতে পারে এবং এমনকি এটিকে স্বয়ংক্রিয় করার সুযোগও দেয়! GKE-এর সাহায্যে এই সবকিছু শুধু সম্ভবই নয়, বরং সহজও! এই কোডল্যাবে, আপনি 'ফ্যান্সি স্টোর' নামক একটি কাল্পনিক কোম্পানির জন্য একটি ই-কমার্স ওয়েবসাইট পরিচালনাকারী একজন ডেভেলপারের ভূমিকা পালন করবেন। স্কেলিং এবং বিভ্রাটের সমস্যার কারণে, আপনাকে আপনার অ্যাপ্লিকেশনটি GKE-তে ডেপ্লয় করার দায়িত্ব দেওয়া হয়েছে!

অনুশীলনগুলো একজন সাধারণ ক্লাউড ডেভেলপারের অভিজ্ঞতা প্রতিফলিত করার জন্য সাজানো হয়েছে:

  1. একটি GKE ক্লাস্টার তৈরি করুন।
  2. একটি ডকার কন্টেইনার তৈরি করুন।
  3. কন্টেইনারটি GKE-তে ডেপ্লয় করুন।
  4. একটি সার্ভিসের মাধ্যমে কন্টেইনারটিকে উন্মুক্ত করুন।
  5. কন্টেইনারটিকে একাধিক রেপ্লিকায় স্কেল করুন।
  6. ওয়েবসাইটটি পরিবর্তন করুন।
  7. কোনো ডাউনটাইম ছাড়াই নতুন সংস্করণটি চালু করুন।

স্থাপত্য ডায়াগ্রাম

ddba666bd2b02d0d.png

আপনি যা শিখবেন

  • কিভাবে একটি GKE ক্লাস্টার তৈরি করবেন
  • কিভাবে একটি ডকার ইমেজ তৈরি করবেন
  • কিভাবে কুবারনেটিসে ডকার ইমেজ ডেপ্লয় করবেন
  • Kubernetes-এ কীভাবে একটি অ্যাপ্লিকেশন স্কেল করবেন
  • Kubernetes-এ কীভাবে রোলিং আপডেট করতে হয়

পূর্বশর্ত

  • প্রজেক্ট তৈরি করার জন্য অ্যাডমিনিস্ট্রেটিভ অ্যাক্সেসসহ একটি গুগল অ্যাকাউন্ট অথবা প্রজেক্ট-মালিকের ভূমিকাসহ একটি প্রজেক্ট।
  • ডকার এবং কুবারনেটিস সম্পর্কে প্রাথমিক ধারণা (যদি আপনার প্রাথমিক ধারণা না থাকে, তাহলে অনুগ্রহ করে এখনই ডকার এবং কুবারনেটিস পর্যালোচনা করুন।)

২. পরিবেশ সেটআপ

স্ব-গতিতে পরিবেশ সেটআপ

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

53dad2cefdae71da.png

2016-02-10 12:45:26.png থেকে স্ক্রিনশট

মনে রাখবেন, প্রজেক্ট আইডি হলো সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। পরবর্তীতে এটিকে PROJECT_ID হিসাবে উল্লেখ করা হবে।

এরপর, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য। আপনি যদি নতুন ব্যবহারকারী না হন, তবে চিন্তার কোনো কারণ নেই, কারণ কোডল্যাবের জন্য আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়। তবে, আপনি যদি বেশি রিসোর্স ব্যবহার করেন বা সেগুলোকে চালু রাখেন, তাহলে কোডল্যাবের জন্য আপনার আরও বেশি টাকা খরচ হতে পারে (শেষে থাকা 'ক্লিন আপ' অংশটি দেখুন)। আরও তথ্যের জন্য, প্রাইসিং (Pricing ) দেখুন।

ক্লাউড শেল

যদিও আপনি আপনার ল্যাপটপ দিয়ে দূর থেকে গুগল ক্লাউড এবং জিকেই (GKE) পরিচালনা করতে পারেন, কোডল্যাবের জন্য আপনি ক্লাউড শেল —ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ—ব্যবহার করবেন।

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

  1. ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন। fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার PROJECT_ID তে সেট করা আছে।

gcloud auth list

কমান্ড আউটপুট

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি কোনো কারণে প্রজেক্টটি সেট করা না থাকে, তাহলে নিম্নলিখিত কমান্ডটি দিন:

gcloud config set project <PROJECT_ID>

আপনার PROJECT_ID খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqA BYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।

echo $GOOGLE_CLOUD_PROJECT

কমান্ড আউটপুট

<PROJECT_ID>
  1. অবশেষে, ডিফল্ট জোন এবং প্রজেক্ট কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f

আপনি বিভিন্ন ধরনের জোন বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল ও জোন দেখুন।

৩. একটি GKE ক্লাস্টার তৈরি করুন

এখন যেহেতু আপনার কার্যকরী ডেভেলপার এনভায়রনমেন্ট তৈরি হয়ে গেছে, আপনার ওয়েবসাইটটি ডেপ্লয় করার জন্য একটি GKE ক্লাস্টার প্রয়োজন! ক্লাস্টার তৈরি করার আগে, আপনাকে নিশ্চিত করতে হবে যে সঠিক API-গুলো সক্রিয় করা আছে। কন্টেইনার API সক্রিয় করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable container.googleapis.com

এখন, আপনি আপনার ক্লাস্টার তৈরি করতে পারেন! ৩টি নোড সহ fancy-cluster নামের একটি ক্লাস্টার তৈরি করতে নিচের ধাপগুলো অনুসরণ করুন:

gcloud container clusters create fancy-cluster --num-nodes 3

ক্লাস্টারটি তৈরি হতে কয়েক মিনিট সময় লাগতে পারে। এরপর, নিম্নলিখিত কমান্ডটি চালান এবং ক্লাস্টারটির তিনটি ওয়ার্কার ভার্চুয়াল মেশিন (VM) ইনস্ট্যান্স দেখুন:

gcloud compute instances list

আউটপুট:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

আপনি ক্লাউড কনসোলেও আপনার ক্লাস্টার এবং সম্পর্কিত তথ্য দেখতে পারেন। উপরের-বাম কোণায় থাকা মেনু বোতামে ক্লিক করুন, নিচে স্ক্রল করে Kubernetes Engine পর্যন্ত যান এবং Clusters-এ ক্লিক করুন। সেখানে আপনি fancy-cluster নামের আপনার ক্লাস্টারটি দেখতে পাবেন।

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

অভিনন্দন! আপনি আপনার প্রথম ক্লাস্টারটি তৈরি করেছেন!

৪. সোর্স রিপোজিটরি ক্লোন করুন

যেহেতু এটি একটি বিদ্যমান ওয়েবসাইট, তাই আপনাকে শুধু রিপোজিটরি থেকে সোর্স ক্লোন করতে হবে, যাতে আপনি ডকার ইমেজ তৈরি এবং GKE-তে ডেপ্লয় করার দিকে মনোযোগ দিতে পারেন।

আপনার ক্লাউড শেল ইনস্ট্যান্সে সোর্স রিপোজিটরি ক্লোন করতে এবং এটিকে উপযুক্ত ডিরেক্টরিতে পরিবর্তন করতে নিম্নলিখিত কমান্ডগুলো চালান। এছাড়াও আপনি Node.js ডিপেন্ডেন্সিগুলো ইনস্টল করবেন, যাতে অ্যাপ্লিকেশনটি ডেপ্লয় করার আগে আপনি তা পরীক্ষা করতে পারেন।

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

এটি রিপোজিটরি ক্লোন করে, ডিরেক্টরি পরিবর্তন করে এবং আপনার অ্যাপ্লিকেশনটি স্থানীয়ভাবে চালানোর জন্য প্রয়োজনীয় ডিপেন্ডেন্সিগুলো ইনস্টল করে। এই স্ক্রিপ্টটি চলতে কয়েক মিনিট সময় লাগতে পারে।

যথাযথভাবে সতর্কতা অবলম্বন করুন এবং আপনার অ্যাপ্লিকেশনটি পরীক্ষা করুন। আপনার ওয়েব সার্ভার চালু করতে নিম্নলিখিত কমান্ডটি চালান:

cd ~/monolith-to-microservices/monolith
npm start

আউটপুট:

Monolith listening on port 8080!

আপনি ক্লাউড শেল মেনুতে থাকা ওয়েব প্রিভিউ আইকনে ক্লিক করে এবং পোর্ট ৮০৮০-তে প্রিভিউ নির্বাচন করে আপনার অ্যাপ্লিকেশনটির প্রিভিউ দেখতে পারেন।

5869738f0e9ec386.png

এতে একটি নতুন উইন্ডো খুলবে যেখানে আপনি আপনার ফ্যান্সি স্টোরটি সচল অবস্থায় দেখতে পারবেন!

9ed25c3f0cbe62fa.png

ওয়েবসাইটটি দেখার পর আপনি ওই উইন্ডোটি বন্ধ করতে পারেন। ওয়েব সার্ভার প্রসেসটি বন্ধ করতে টার্মিনাল উইন্ডোতে Control+C (উইন্ডোজ বা ম্যাক) চাপুন।

৫. ক্লাউড বিল্ড দিয়ে ডকার কন্টেইনার তৈরি করুন

এখন যেহেতু আপনার সোর্স ফাইলগুলো প্রস্তুত, আপনার অ্যাপ্লিকেশনটিকে ডকারাইজ করার সময় এসেছে!

সাধারণত, আপনাকে দুটি ধাপে কাজটি করতে হতো: একটি ডকার কন্টেইনার তৈরি করা এবং GKE যে ইমেজটি পুল করে, সেটি সংরক্ষণের জন্য রেজিস্ট্রি-তে পুশ করা। তবে, আপনি ক্লাউড বিল্ড ব্যবহার করে একটিমাত্র কমান্ডের মাধ্যমে ডকার কন্টেইনার তৈরি করে এবং ইমেজটি কন্টেইনার রেজিস্ট্রি-তে রেখে আপনার কাজকে আরও সহজ করে তুলতে পারেন! (ডকার ফাইল তৈরি এবং পুশ করার ম্যানুয়াল প্রক্রিয়াটি দেখতে, ‘কন্টেইনার রেজিস্ট্রি-র জন্য কুইকস্টার্ট’ দেখুন।)

ক্লাউড বিল্ড ডিরেক্টরি থেকে ফাইলগুলোকে কম্প্রেস করে একটি ক্লাউড স্টোরেজ বাকেটে স্থানান্তর করে। এরপর বিল্ড প্রসেসটি বাকেট থেকে ফাইলগুলো নিয়ে ডকারফাইল ব্যবহার করে ডকার বিল্ড প্রসেসটি চালায়। যেহেতু আপনি ডকার ইমেজের জন্য হোস্ট হিসেবে gcr.io সহ --tag ফ্ল্যাগটি নির্দিষ্ট করেছেন, তাই ফলস্বরূপ ডকার ইমেজটি কন্টেইনার রেজিস্ট্রি-তে পুশ করা হয়।

প্রথমে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড বিল্ড এপিআই (Cloud Build API) সক্রিয় করতে হবে:

gcloud services enable cloudbuild.googleapis.com

এপিআই সক্রিয় করার পর, বিল্ড প্রক্রিয়া শুরু করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

এই প্রক্রিয়াটিতে কয়েক মিনিট সময় লাগে, কিন্তু এটি সম্পন্ন হওয়ার পর আপনি টার্মিনালে নিম্নলিখিত আউটপুট দেখতে পাবেন:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

আপনার বিল্ড হিস্ট্রি দেখতে বা রিয়েল টাইমে প্রক্রিয়াটি পর্যবেক্ষণ করতে, আপনি ক্লাউড কনসোলে যেতে পারেন। উপরের-বাম কোণায় থাকা মেনু বোতামে ক্লিক করুন, নিচে স্ক্রল করে Ci/CD-তে যান, তারপর ক্লাউড বিল্ড-এ ক্লিক করুন এবং সবশেষে হিস্ট্রি-তে ক্লিক করুন। সেখানে আপনি আপনার পূর্ববর্তী বিল্ডগুলোর একটি তালিকা দেখতে পাবেন, কিন্তু সেখানে শুধুমাত্র আপনার তৈরি করা বিল্ডটিই থাকার কথা।

4c753ede203255f6.png

আপনি বিল্ড আইডিতে ক্লিক করলে লগ আউটপুট সহ সেই বিল্ডের সমস্ত বিবরণ দেখতে পাবেন।

বিল্ড ডিটেইলস পেজে, বিল্ড ইনফরমেশন সেকশনে থাকা ইমেজ নেমে ক্লিক করে আপনি তৈরি করা কন্টেইনার ইমেজটি দেখতে পারেন।

6e88ed1643dfe629.png

৬. GKE-তে কন্টেইনার স্থাপন করুন

এখন যেহেতু আপনি আপনার ওয়েবসাইটটিকে কন্টেইনারাইজ করে কন্টেইনার রেজিস্ট্রি-তে পুশ করেছেন, আপনি এটিকে কুবারনেটিসে ডেপ্লয় করতে পারেন!

একটি GKE ক্লাস্টারে অ্যাপ্লিকেশন ডেপ্লয় এবং ম্যানেজ করার জন্য, আপনাকে কুবারনেটিস ক্লাস্টার-ম্যানেজমেন্ট সিস্টেমের সাথে যোগাযোগ করতে হবে। সাধারণত kubectl কমান্ড-লাইন টুল ব্যবহার করে এটি করা হয়ে থাকে।

কুবারনেটিস অ্যাপ্লিকেশনগুলোকে পড (Pod) হিসেবে উপস্থাপন করে, যা একটি কন্টেইনার (বা ঘনিষ্ঠভাবে সংযুক্ত কন্টেইনারের একটি গ্রুপ)-এর প্রতিনিধিত্বকারী একক। পড হলো কুবারনেটিসে স্থাপনযোগ্য ক্ষুদ্রতম একক। এখানে, প্রতিটি পডে শুধুমাত্র আপনার মনোলিথ কন্টেইনারটি থাকে।

আপনার অ্যাপ্লিকেশন ডেপ্লয় করতে, আপনাকে একটি ডেপ্লয়মেন্ট তৈরি করতে হবে। একটি ডেপ্লয়মেন্ট আপনার অ্যাপ্লিকেশনের একাধিক কপি—যাদের রেপ্লিকা বলা হয়—পরিচালনা করে এবং আপনার ক্লাস্টারের প্রতিটি নোডে সেগুলো চালানোর জন্য সময়সূচী নির্ধারণ করে। এক্ষেত্রে, ডেপ্লয়মেন্টটি আপনার অ্যাপ্লিকেশনের শুধুমাত্র একটি পড চালাবে। ডেপ্লয়মেন্টগুলো একটি রেপ্লিকাসেট তৈরি করার মাধ্যমে এটি নিশ্চিত করে। রেপ্লিকাসেটের দায়িত্ব হলো নির্দিষ্ট সংখ্যক রেপ্লিকা যেন সবসময় চালু থাকে তা নিশ্চিত করা।

kubectl create deployment কমান্ডটি আপনার ক্লাস্টারে `monolith` নামের একটি Deployment তৈরি করে, যাতে ১টি রেপ্লিকা থাকে।

আপনার অ্যাপ্লিকেশনটি ডেপ্লয় করতে নিম্নলিখিত কমান্ডটি চালান:

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

স্থাপন যাচাই করুন

ডিপ্লয়মেন্টটি সফলভাবে তৈরি হয়েছে কিনা তা যাচাই করতে, নিম্নলিখিত কমান্ডটি চালান (পডের স্ট্যাটাস "Running" হতে কয়েক মুহূর্ত সময় লাগতে পারে):

kubectl get all

আউটপুট:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

এই আউটপুটটি আপনাকে বেশ কিছু জিনিস দেখায়। আপনি আপনার বর্তমান Deployment, আপনার ReplicaSet এবং চলমান Pod দেখতে পারেন। মনে হচ্ছে আপনি সফলভাবে সবকিছু তৈরি করেছেন!

আপনার রিসোর্সগুলো আলাদাভাবে দেখার জন্য, আপনি নিম্নলিখিত কমান্ডগুলো চালাতে পারেন:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

Kubernetes-এর সম্পূর্ণ সুবিধা দেখতে, আপনি একটি সার্ভার ক্র্যাশ সিমুলেট করে, পডটি ডিলিট করে দেখতে পারেন কী ঘটে!

পূর্ববর্তী কমান্ড থেকে আপনার পডের নামটি কপি করুন এবং এটি ডিলিট করতে নিম্নলিখিত কমান্ডটি চালান:

kubectl delete pod/<POD_NAME>

আপনি যদি যথেষ্ট দ্রুত হন, তাহলে সবকিছু আবার দেখার জন্য আগের কমান্ডটি চালাতে পারেন এবং আপনি দুটি পড দেখতে পাবেন, একটি বন্ধ হচ্ছে এবং অন্যটি তৈরি হচ্ছে বা চলছে:

kubectl get all

আউটপুট:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

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

৭. GKE স্থাপন প্রকাশ করুন

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

আপনার ওয়েবসাইটটি ইন্টারনেটে প্রকাশ করতে নিম্নলিখিত কমান্ডটি চালান:

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

আউটপুট:

service/monolith exposed

পরিষেবাটি অ্যাক্সেস করা

GKE এক্সটার্নাল আইপি অ্যাড্রেসটি সার্ভিস রিসোর্সকে বরাদ্দ করে—ডিপ্লয়মেন্টকে নয়। আপনার অ্যাপ্লিকেশনের জন্য GKE যে এক্সটার্নাল আইপি সরবরাহ করেছে, তা যদি আপনি খুঁজে পেতে চান, তাহলে আপনি kubectl get service কমান্ড দিয়ে সার্ভিসটি পরীক্ষা করতে পারেন:

kubectl get service

আউটপুট:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

আপনার অ্যাপের এক্সটার্নাল আইপি অ্যাড্রেস নির্ধারণ করার পর, সেটি কপি করুন। আপনার অ্যাপটি অ্যাক্সেসযোগ্য কিনা তা পরীক্ষা করতে আপনার ব্রাউজারে সেই ইউআরএল-টি (যেমন http://203.0.113.0) খুলুন।

9ed25c3f0cbe62fa.png

আপনি আগে পরীক্ষা করা ওয়েবসাইটটিই দেখতে পাবেন! অভিনন্দন! আপনার ওয়েবসাইটটি সম্পূর্ণরূপে কুবারনেটিসে চলছে!

৮. GKE স্থাপনার পরিধি বৃদ্ধি করা

এখন যেহেতু আপনার অ্যাপের একটি চলমান ইনস্ট্যান্স GKE-তে আছে এবং আপনি এটিকে ইন্টারনেটে উন্মুক্ত করেছেন, আপনার ওয়েবসাইটটি অত্যন্ত জনপ্রিয় হয়ে উঠেছে! ট্র্যাফিক সামলানোর জন্য আপনার অ্যাপটিকে একাধিক ইনস্ট্যান্সে স্কেল করার একটি উপায় প্রয়োজন। আপনার অ্যাপ্লিকেশনটিকে তিনটি পর্যন্ত রেপ্লিকায় স্কেল করতে শিখুন।

আপনার ডেপ্লয়মেন্টকে তিনটি রেপ্লিকা পর্যন্ত স্কেল আপ করতে নিম্নলিখিত কমান্ডটি চালান:

kubectl scale deployment monolith --replicas=3

আউটপুট:

deployment.apps/monolith scaled

স্কেলড ডেপ্লয়মেন্ট যাচাই করুন

ডিপ্লয়মেন্টটি সফলভাবে স্কেল করা হয়েছে কিনা তা যাচাই করতে, নিম্নলিখিত কমান্ডটি চালান:

kubectl get all

আউটপুট:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

আপনি আপনার পডের তিনটি ইনস্ট্যান্স চলতে দেখবেন। এছাড়াও, লক্ষ্য করুন যে আপনার ডিপ্লয়মেন্ট এবং রেপ্লিকাসেটের কাঙ্ক্ষিত সংখ্যা এখন তিনটিতে দাঁড়িয়েছে।

৯. ওয়েবসাইটে পরিবর্তন আনুন

আপনার মার্কেটিং টিম আপনাকে আপনার ওয়েবসাইটের হোমপেজ পরিবর্তন করতে বলেছে। তারা মনে করে যে, আপনার কোম্পানি কী এবং আপনারা আসলে কী বিক্রি করেন, তা ব্যাখ্যা করে হোমপেজটিকে আরও তথ্যবহুল করা উচিত। এই অংশে, মার্কেটিং টিমকে খুশি করার জন্য আপনি হোমপেজে কিছু টেক্সট যোগ করবেন! মনে হচ্ছে আমাদের একজন ডেভেলপার ইতিমধ্যেই index.js.new ফাইল নামে পরিবর্তনগুলো তৈরি করে ফেলেছেন। আপনি ফাইলটি index.js এ কপি করতে পারেন এবং আপনার পরিবর্তনগুলো সেখানে প্রতিফলিত হবে। যথাযথ পরিবর্তনগুলো করার জন্য নিচের নির্দেশাবলী অনুসরণ করুন।

নিম্নলিখিত কমান্ডগুলো চালান, আপডেট করা ফাইলটি সঠিক ফাইলের নামে কপি করুন এবং পরিবর্তনগুলো যাচাই করার জন্য এর বিষয়বস্তু প্রিন্ট করুন:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

ফলস্বরূপ কোডটি দেখতে এইরকম হবে:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

আপনি React কম্পোনেন্টগুলো আপডেট করেছেন, কিন্তু স্ট্যাটিক ফাইলগুলো তৈরি করার জন্য আপনাকে React অ্যাপটি বিল্ড করতে হবে। React অ্যাপটি বিল্ড করতে নিম্নলিখিত কমান্ডটি চালান এবং এটি monolith পাবলিক ডিরেক্টরিতে কপি করুন:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

আপনার কোড আপডেট করা হয়ে গেলে, আপনাকে আপনার ডকার কন্টেইনারটি রি-বিল্ড করতে হবে এবং কন্টেইনার রেজিস্ট্রি-তে পাবলিশ করতে হবে। আপনি আগের কমান্ডটিই ব্যবহার করতে পারেন, তবে এবার ভার্সন লেবেলটি আপডেট করতে হবে!

২.০.০-এর আপডেট করা ইমেজ সংস্করণ সহ একটি নতুন ক্লাউড বিল্ড চালু করতে নিম্নলিখিত কমান্ডটি চালান:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

ওয়েব সার্ভার প্রসেসটি বন্ধ করতে টার্মিনাল উইন্ডোতে Control+C (উইন্ডোজ বা ম্যাক) চাপুন।

পরবর্তী অংশে, আপনি সেই ছবিটি ব্যবহার করে কোনো ডাউনটাইম ছাড়াই আপনার অ্যাপ্লিকেশনটি আপডেট করবেন।

১০. কোনো ডাউনটাইম ছাড়াই ওয়েবসাইট আপডেট করুন

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

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

কমান্ড লাইন থেকে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে Kubernetes-কে জানাতে পারেন যে আপনি আপনার Deployment-এর ইমেজটি একটি নতুন সংস্করণে আপডেট করতে চান:

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

আউটপুট:

deployment.apps/monolith image updated

স্থাপন যাচাই করুন

নিম্নলিখিত কমান্ডটি চালিয়ে আপনি আপনার ডেপ্লয়মেন্ট আপডেট যাচাই করতে পারেন:

kubectl get pods

আউটপুট:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

আপনি দেখবেন তিনটি নতুন পড তৈরি হচ্ছে এবং আপনার পুরানো পডগুলো বন্ধ হয়ে যাচ্ছে। বয়স দেখে আপনি বুঝতে পারবেন কোনটি নতুন এবং কোনটি পুরানো। অবশেষে, আপনি আবার কেবল তিনটি পড দেখতে পাবেন, যেগুলো হবে আপনার তিনটি আপডেট করা পড।

আপনার পরিবর্তনগুলি যাচাই করতে, লোড ব্যালান্সারের এক্সটার্নাল আইপি-তে আবার যান এবং লক্ষ্য করুন যে আপনার অ্যাপটি আপডেট হয়ে গেছে।

সার্ভিসগুলোর তালিকা দেখতে এবং আইপি অ্যাড্রেস ভুলে গেলে তা দেখার জন্য নিম্নলিখিত কমান্ডটি চালান:

kubectl get svc

আপনার ওয়েবসাইটে হোমপেজ কম্পোনেন্টে যোগ করা লেখাটি প্রদর্শিত হওয়া উচিত!

8006c9938dbd5aa5.png

১১. পরিষ্কার করুন

গিট রিপোজিটরি মুছে ফেলুন

cd ~
rm -rf monolith-to-microservices

কন্টেইনার রেজিস্ট্রি ইমেজগুলি মুছে ফেলুন

দ্রষ্টব্য: আপনি যদি অন্য সংস্করণ তৈরি করে থাকেন, তাহলে সেই ছবিগুলো মুছে ফেলার জন্যও একই সিনট্যাক্স ব্যবহার করতে পারেন। এই কোডল্যাবটি ধরে নেয় যে আপনার কেবল দুটি ট্যাগ আছে।

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

ক্লাউড স্টোরেজ থেকে ক্লাউড বিল্ড আর্টিফ্যাক্টগুলি মুছে ফেলুন

দ্রষ্টব্য: আপনি যদি এই কোডল্যাবটি ছাড়া অন্য কোনো আর্টিফ্যাক্টের জন্য ক্লাউড বিল্ড ব্যবহার করে থাকেন, তাহলে আপনাকে gs://<PROJECT_ID>_cloudbuild/source ক্লাউড স্টোরেজ বাকেট থেকে আপনার সোর্সটি ম্যানুয়ালি মুছে ফেলতে হবে।

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

GKE পরিষেবা মুছে ফেলুন

kubectl delete service monolith
kubectl delete deployment monolith

GKE ক্লাস্টার মুছে ফেলুন

gcloud container clusters delete fancy-cluster

দ্রষ্টব্য: এই কমান্ডটি কার্যকর হতে কিছুটা সময় লাগতে পারে।

১২. অভিনন্দন!

আপনি GKE-তে আপনার ওয়েবসাইট ডেপ্লয়, স্কেল এবং আপডেট করেছেন। আপনি এখন ডকার এবং কুবারনেটিস-এ অভিজ্ঞ!

অতিরিক্ত সম্পদ