Google Kubernetes Engine (GKE) की मदद से, अपनी वेबसाइट को डिप्लॉय, स्केल, और अपडेट करें

1. परिचय

वेबसाइट और ऐप्लिकेशन चलाना कठिन है.

चीज़ें गलत हो जाती हैं, लेकिन अचानक बंद हो जाती हैं, सर्वर क्रैश हो जाते हैं, मांग बढ़ने से ज़्यादा संसाधन इस्तेमाल होने लगते हैं, और डाउनटाइम के बिना बदलाव करना मुश्किल और तनाव भरा होता है.

ज़रा सोचो कि एक ऐसा टूल है जो आपको यह काम करने में मदद कर सकता है और उसे ऑटोमेट भी कर सकता है! GKE (जीकेई) से ये सब करना न सिर्फ़ संभव है, बल्कि बेहद आसान है! इस कोडलैब में, आपको लगता है कि आपको एक डेवलपर की भूमिका निभानी है और वह एक काल्पनिक कंपनी-फ़ैंसी स्टोर के लिए ई-कॉमर्स वेबसाइट चलाता है. स्केलिंग और आउटेज से जुड़ी समस्याओं की वजह से, आपको अपने ऐप्लिकेशन को GKE (जीकेई) पर डिप्लॉय करने की ज़िम्मेदारी दी गई है!

इन अभ्यासों को क्लाउड डेवलपर के सामान्य अनुभव के हिसाब से व्यवस्थित किया जाता है:

  1. GKE (जीकेई) क्लस्टर बनाएं.
  2. Docker कंटेनर बनाएं.
  3. कंटेनर को GKE (जीकेई) में डिप्लॉय करें.
  4. कंटेनर को किसी सेवा के ज़रिए सार्वजनिक करें.
  5. कंटेनर को कई प्रतिकृतियों पर स्केल करें.
  6. वेबसाइट में बदलाव करें.
  7. बिना किसी डाउनटाइम के नया वर्शन रोल आउट करें.

आर्किटेक्चर का डायग्राम

ddba666bd2b02d0d.png

आप इन चीज़ों के बारे में जानेंगे

  • GKE (जीकेई) क्लस्टर बनाने का तरीका
  • Docker इमेज बनाने का तरीका
  • Kubernetes में Docker इमेज डिप्लॉय करने का तरीका
  • Kubernetes पर किसी ऐप्लिकेशन को स्केल करने का तरीका
  • Kubernetes पर रोलिंग अपडेट करने का तरीका

ज़रूरी शर्तें

  • प्रोजेक्ट बनाने के लिए, एडमिन के तौर पर ऐक्सेस वाला Google खाता या प्रोजेक्ट के मालिक की भूमिका वाला प्रोजेक्ट
  • Docker और Kubernetes की बुनियादी समझ (अगर आपको बुनियादी समझ नहीं है, तो कृपया Docker और Kubernetes की समीक्षा अभी करें.

2. एनवायरमेंट का सेटअप

अपने हिसाब से एनवायरमेंट सेटअप करें

अगर आपके पास पहले से कोई Google खाता नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Console में साइन इन करें और एक नया प्रोजेक्ट बनाएं.

53dad2cefdae71da.png

10-02-2016 12:45:26.png का स्क्रीनशॉट

याद रखें कि प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट का यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही किसी दूसरे प्रोजेक्ट के लिए इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा! बाद में, इसे PROJECT_ID के तौर पर दिखाया जाएगा.

इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. Google Cloud के नए उपयोगकर्ता, 300 डॉलर मुफ़्त में आज़माने की सुविधा पा सकते हैं. अगर आप नए उपयोगकर्ता नहीं हैं, तो चिंता न करें, क्योंकि कोडलैब के लिए आपको कुछ डॉलर से ज़्यादा खर्च नहीं करना चाहिए. हालांकि, अगर ज़्यादा संसाधनों का इस्तेमाल किया जाता है या उन्हें चलाना बंद कर दिया जाता है, तो कोडलैब का इस्तेमाल करने पर आपको ज़्यादा पैसे खर्च करने पड़ सकते हैं. इसके लिए, आखिर में मौजूद "साफ़ करें" सेक्शन देखें. ज़्यादा जानकारी के लिए, कीमत देखें.

Cloud Shell

लैपटॉप पर Google Cloud और GKE (जीकेई) को रिमोट तरीके से इस्तेमाल किया जा सकता है, लेकिन कोडलैब के लिए Cloud Shell का इस्तेमाल किया जा सकता है. यह क्लाउड में चलने वाला कमांड-लाइन एनवायरमेंट है.

Debian आधारित इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस को बेहतर बनाता है. इसका मतलब है कि इस कोडलैब के लिए आपको सिर्फ़ एक ब्राउज़र की ज़रूरत होगी. हां, यह Chromebook पर काम करता है.

  1. Cloud Console से Cloud Shell को चालू करने के लिए, Cloud Shell को चालू करें fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q पर क्लिक करें. प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा.

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

14-06-2017 को 10.13.43 PM.png पर स्क्रीन शॉट लिया गया

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है. साथ ही, यह प्रोजेक्ट पहले से ही आपके 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 चाहिए? देखें कि आपने सेटअप के चरणों में किस आईडी का इस्तेमाल किया है या इसे Cloud Console के डैशबोर्ड में देखें:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell, डिफ़ॉल्ट रूप से कुछ एनवायरमेंट वैरिएबल सेट करता है. ये वैरिएबल, आने वाले समय में कमांड चलाने के दौरान काम आ सकते हैं.

echo $GOOGLE_CLOUD_PROJECT

कमांड आउटपुट

<PROJECT_ID>
  1. आखिर में, डिफ़ॉल्ट ज़ोन और प्रोजेक्ट कॉन्फ़िगरेशन सेट करें.
gcloud config set compute/zone us-central1-f

आपके पास कई तरह के ज़ोन चुनने का विकल्प होता है. ज़्यादा जानकारी के लिए, क्षेत्र और ज़ोन.

3. GKE (जीकेई) क्लस्टर बनाएं

अब आपको डेवलपर एनवायरमेंट मिल गया है. इसलिए, अपनी वेबसाइट को डिप्लॉय करने के लिए, आपको GKE (जीकेई) क्लस्टर की ज़रूरत होगी! क्लस्टर बनाने से पहले, आपको यह पक्का करना होगा कि सही एपीआई चालू किए गए हैं. कंटेनर एपीआई को चालू करने के लिए, यह कमांड चलाएं:

gcloud services enable container.googleapis.com

अब, आप अपना क्लस्टर बना सकते हैं! 3 नोड वाला फ़ैंसी-क्लस्टर नाम का क्लस्टर बनाने के लिए, नीचे दिया गया तरीका अपनाएं:

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

क्लस्टर बनने में कुछ मिनट लग सकते हैं. इसके बाद, नीचे दिया गया कमांड चलाएं और क्लस्टर के तीन वर्कर वर्चुअल मशीन (वीएम) इंस्टेंस देखें:

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

Cloud Console में, अपने क्लस्टर और उससे जुड़ी जानकारी भी देखी जा सकती है. सबसे ऊपर बाएं कोने में, मेन्यू बटन पर क्लिक करें. इसके बाद, स्क्रोल करके Kubernetes Engine पर जाएं और Clusters पर क्लिक करें. आपको fancy-cluster नाम का अपना क्लस्टर दिखेगा.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

बधाई हो! आपने अपना पहला क्लस्टर बनाया है!

4. क्लोन सोर्स रिपॉज़िटरी

यह एक मौजूदा वेबसाइट है, इसलिए आपको सिर्फ़ रिपॉज़िटरी से सोर्स का क्लोन बनाना होगा. इससे आपको Docker इमेज बनाने और GKE (जीकेई) पर डिप्लॉय करने पर फ़ोकस करने में मदद मिलेगी.

अपने Cloud Shell इंस्टेंस में, सोर्स रिपॉज़िटरी का क्लोन बनाने और उसे सही डायरेक्ट्री में बदलने के लिए, नीचे दिए गए निर्देशों का पालन करें. आपको 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!

Cloud Shell मेन्यू में वेब प्रीव्यू आइकॉन पर क्लिक करके और पोर्ट 8080 पर 'झलक देखें' को चुनकर अपने ऐप्लिकेशन की झलक देखी जा सकती है.

5869738f0e9ec386.png

यह एक नई विंडो में खुलेगा जहां आप अपने Fancy Store को काम करते हुए देख सकते हैं!

9ed25c3f0cbe62fa.png

वेबसाइट देखने के बाद, उस विंडो को बंद किया जा सकता है. वेब सर्वर की प्रोसेस रोकने के लिए, टर्मिनल विंडो में Control+C (Windows या Mac) दबाएं.

5. Cloud Build की मदद से Docker कंटेनर बनाएं

अब आपकी सोर्स फ़ाइलें इस्तेमाल के लिए तैयार हैं, इसलिए ऐप्लिकेशन को डॉक करने का समय आ गया है!

आम तौर पर, आपको दो चरणों में काम करना होगा. इसमें, Docker कंटेनर बनाना और GKE (जीकेई) से ली गई इमेज को स्टोर करने के लिए उसे रजिस्ट्री में भेजना होगा. हालांकि, Cloud Build का इस्तेमाल करके Docker कंटेनर बनाकर, इमेज को एक ही निर्देश से कंटेनर रजिस्ट्री में डालकर ज़िंदगी को आसान बनाया जा सकता है! (डॉकर फ़ाइल बनाने और उसे पुश करने की मैन्युअल प्रोसेस देखने के लिए, कंटेनर रजिस्ट्री के लिए क्विकस्टार्ट देखें.)

Cloud Build, डायरेक्ट्री से फ़ाइलों को कंप्रेस करता है और उन्हें Cloud Storage बकेट में ले जाता है. इसके बाद, बिल्ड प्रोसेस बकेट से फ़ाइलें लेती है और Docker बिल्ड प्रोसेस को चलाने के लिए Dockerfile का इस्तेमाल करती है. आपने Docker इमेज के लिए, होस्ट वाले --tag फ़्लैग को gcr.io के तौर पर सेट किया है. इसलिए, इससे बनने वाली Docker इमेज, Container Registry में भेज दी जाती है.

सबसे पहले, आपको यह कमांड चलाकर Cloud Build API को चालू करना होगा:

gcloud services enable cloudbuild.googleapis.com

एपीआई चालू होने के बाद, बिल्ड प्रोसेस शुरू करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं:

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

अपने बिल्ड का इतिहास देखने या इस प्रोसेस को रीयल टाइम में देखने के लिए, Cloud Console पर जाएं. सबसे ऊपर बाएं कोने में मौजूद मेन्यू बटन पर क्लिक करें. इसके बाद, नीचे की ओर स्क्रोल करके Ci/CD पर जाएं. इसके बाद, Cloud Build पर क्लिक करें और आखिर में, 'इतिहास' पर क्लिक करें. यहां आपको अपने पिछले बिल्ड की सूची दिखेगी. हालांकि, आपको सिर्फ़ वही बिल्ड मिलना चाहिए जो आपने बनाया है.

4c753ede203255f6.png

बिल्ड आईडी पर क्लिक करने पर, आपको उस बिल्ड के लिए लॉग आउटपुट के साथ-साथ पूरी जानकारी दिखेगी.

बिल्ड की जानकारी वाले पेज पर, कंटेनर की वह इमेज देखी जा सकती है जिसे बिल्ड की जानकारी वाले सेक्शन में इमेज के नाम पर क्लिक करके बनाया गया था.

6e88ed1643dfe629.png

6. कंटेनर को GKE (जीकेई) में डिप्लॉय करें

अब आपने अपनी वेबसाइट को कंटेनर बना लिया है और कंटेनर को कंटेनर रजिस्ट्री में भेजा है, तो अब आप इसे Kubernetes पर डिप्लॉय कर सकते हैं!

GKE (जीकेई) क्लस्टर पर ऐप्लिकेशन डिप्लॉय और मैनेज करने के लिए, आपको Kubernetes क्लस्टर-मैनेजमेंट सिस्टम से संपर्क करना होगा. ऐसा करने के लिए, आम तौर पर kubectl कमांड-लाइन टूल इस्तेमाल किया जाता है.

Kubernetes, ऐप्लिकेशन को पॉड के रूप में दिखाती हैं. ये ऐसी इकाइयां होती हैं जो कंटेनर (या आपस में जुड़े कंटेनर के ग्रुप) को दिखाती हैं. Pod, Kubernetes में डिप्लॉय की जा सकने वाली सबसे छोटी यूनिट है. यहां, हर पॉड में सिर्फ़ आपका मोनोलिथ कंटेनर होता है.

अपने ऐप्लिकेशन को डिप्लॉय करने के लिए, आपको डिप्लॉयमेंट बनाना होगा. डिप्लॉयमेंट आपके ऐप्लिकेशन की कई कॉपी मैनेज करता है, जिन्हें कॉपी कहा जाता है. साथ ही, उन्हें आपके क्लस्टर में अलग-अलग नोड पर चलने के लिए शेड्यूल करता है. इस स्थिति में, डिप्लॉयमेंट आपके ऐप्लिकेशन का सिर्फ़ एक Pod चलाएगा. डिप्लॉयमेंट, ReplicaSet बनाकर यह पक्का करते हैं. ReplicaSet यह पक्का करने के लिए ज़िम्मेदार है कि बताई गई कॉपी की संख्या हमेशा चल रही है.

kubectl create deployment निर्देश की मदद से Kubernetes आपके क्लस्टर पर 1 रेप्लिका के साथ मोनोलिथ नाम का डिप्लॉयमेंट बना देती है.

अपने ऐप्लिकेशन को डिप्लॉय करने के लिए, यहां दिया गया कमांड चलाएं:

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

डिप्लॉयमेंट की पुष्टि करें

यह पुष्टि करने के लिए कि डिप्लॉयमेंट सही तरीके से बनाया गया है या नहीं, नीचे दिए गए कमांड को चलाएं (Pod के स्टेटस को "चल रहा है" में दिखने में कुछ समय लग सकता है):

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

यह आउटपुट आपको कई चीज़ें दिखाता है. आप अपना परिनियोजन देख सकते हैं, जो हाल का है; आपका ReplicaSet, जिसकी पसंद के पॉड की संख्या एक है; और आपका पॉड भी. ऐसा लगता है कि आपने सब कुछ बना लिया है!

अपने संसाधनों को अलग-अलग देखने के लिए, ये निर्देश दिए जा सकते हैं:

# 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

इसका कारण क्या है? ReplicaSet को पता चला कि पॉड बंद हो रहा है और उसने एक नया पॉड ट्रिगर किया, ताकि वह डुप्लीकेट पॉड की संख्या बनाए रख सके. इसके बाद, कैंपेन को स्केल करने का तरीका बताया जाएगा, ताकि यह पक्का किया जा सके कि आपके कई इंस्टेंस चल रहे हैं. इससे, अगर कोई इंस्टेंस कम हो जाता है, तो आपके उपयोगकर्ताओं को डाउनटाइम नहीं दिखेगा!

7. GKE (जीकेई) डिप्लॉयमेंट को सार्वजनिक करें

आपने अपने ऐप्लिकेशन को GKE (जीकेई) पर डिप्लॉय किया है, लेकिन आपके पास इसे ऐक्सेस करने का कोई तरीका नहीं है. डिफ़ॉल्ट रूप से, GKE (जीकेई) पर चलाए जाने वाले कंटेनर, इंटरनेट से ऐक्सेस नहीं किए जा सकते, क्योंकि उनमें बाहरी आईपी पते नहीं होते हैं. आपको किसी सेवा संसाधन के ज़रिए, अपने ऐप्लिकेशन को इंटरनेट से ट्रैफ़िक के लिए साफ़ तौर पर सार्वजनिक करना होगा. किसी सेवा से, आपके ऐप्लिकेशन के पॉड के लिए नेटवर्किंग और आईपी सपोर्ट मिलता है. GKE (जीकेई), आपके ऐप्लिकेशन के लिए एक एक्सटर्नल आईपी और लोड बैलेंसर (बिलिंग पर निर्भर करता है) बनाता है.

अपनी वेबसाइट को इंटरनेट पर सार्वजनिक करने के लिए, नीचे दिया गया कमांड चलाएं:

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

आउटपुट:

service/monolith exposed

सेवा को ऐक्सेस करना

GKE (जीकेई), सेवा से जुड़े संसाधन को बाहरी आईपी पता असाइन करता है, न कि डिप्लॉयमेंट को. अगर आपको अपने ऐप्लिकेशन में GKE (जीकेई) के लिए प्रावधान किया गया बाहरी आईपी पता करना है, तो kubectl पाएं सर्विस कमांड की मदद से सेवा की जांच करें:

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

आपको वही वेबसाइट दिखनी चाहिए जिसकी आपने पहले जांच की थी! बधाई हो! आपकी वेबसाइट पूरी तरह से Kubernetes पर चलती है!

8. 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

आपको पॉड के तीन इंस्टेंस दिखेंगे. साथ ही, ध्यान रखें कि अब आपके परिनियोजन और ReplicaSet की संख्या तीन हो सकती है.

9. वेबसाइट में बदलाव करना

आपकी मार्केटिंग टीम ने आपसे अपनी वेबसाइट का होम पेज बदलने के लिए कहा है. उनका मानना है कि आपकी कंपनी क्या है और आपके प्रॉडक्ट बेचे जाने वाले प्रॉडक्ट की जानकारी देकर ज़्यादा जानकारी दी जानी चाहिए. इस सेक्शन में, आपको मार्केटिंग टीम को खुश करने के लिए होम पेज में कुछ टेक्स्ट जोड़ना होगा! ऐसा लगता है कि हमारे किसी डेवलपर ने पहले ही 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 ऐप्लिकेशन बनाने और उसे मोनोलिथ वाली सार्वजनिक डायरेक्ट्री में कॉपी करने के लिए, नीचे दिया गया कमांड चलाएं:

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

कोड अपडेट होने के बाद, अब आपको अपना Docker कंटेनर फिर से बनाना होगा और उसे Container Registry में पब्लिश करना होगा. आप पहले वाले निर्देश का ही इस्तेमाल कर सकते हैं. हालांकि, इस बार आपको वर्शन लेबल अपडेट करने का विकल्प मिलेगा!

इमेज के अपडेट किए गए 2.0.0 वर्शन के साथ नया Cloud Build ट्रिगर करने के लिए, यह कमांड चलाएं:

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 (Windows या Mac) दबाएं.

अगले सेक्शन में, उस इमेज का इस्तेमाल, बिना किसी डाउनटाइम के अपने ऐप्लिकेशन को अपडेट करने के लिए किया जाएगा.

10. वेबसाइट को बिना किसी डाउनटाइम के अपडेट करें

बदलाव पूरे हो गए हैं और मार्केटिंग टीम आपके अपडेट से खुश है! अब उपयोगकर्ताओं को बिना रुकावट के वेबसाइट को अपडेट करें. अपनी वेबसाइट अपडेट करने के लिए, नीचे दिए गए निर्देशों का पालन करें.

GKE (जीकेई) के रोलिंग अपडेट यह पक्का करते हैं कि आपका ऐप्लिकेशन अप-टू-डेट रहे और उपलब्ध रहे. भले ही सिस्टम, चल रहे सभी कॉपी में आपकी पुरानी कंटेनर इमेज के इंस्टेंस को आपकी नई इमेज से बदल दे.

कमांड लाइन से, Kubernetes को बताया जा सकता है कि आपको अपने डिप्लॉयमेंट के लिए इमेज को इन कमांड का इस्तेमाल करके, नए वर्शन में अपडेट करना है:

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

11. व्यवस्थित करें

Git डेटा स्टोर करने की जगह मिटाएं

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

Cloud Storage से Cloud Build आर्टफ़ैक्ट मिटाएं

ध्यान दें: अगर आपने इस कोडलैब के अलावा, किसी दूसरे आर्टफ़ैक्ट के लिए Cloud Build का इस्तेमाल किया है, तो आपको Cloud Storage बकेट 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

ध्यान दें: यह निर्देश देने में थोड़ा समय लग सकता है.

12. बधाई हो!

आपने GKE (जीकेई) पर अपनी वेबसाइट को डिप्लॉय, स्केल, और अपडेट किया है. अब आपने Docker और Kubernetes का इस्तेमाल कर लिया है!

अन्य संसाधन