स्कैफ़ोल्ड को समझना

1. मकसद

Skaffold एक ऐसा टूल है जो आपके ऐप्लिकेशन को बनाने, उसे पुश करने, और डिप्लॉय करने के लिए वर्कफ़्लो को मैनेज करता है. Skaffold का इस्तेमाल करके, स्थानीय डेवलपमेंट वर्कस्पेस को आसानी से कॉन्फ़िगर किया जा सकता है. साथ ही, अपने डेवलपमेंट लूप को बेहतर बनाया जा सकता है. इसके अलावा, Kustomize और Helm जैसे अन्य टूल के साथ इंटिग्रेट करके, Kubernetes मेनिफ़ेस्ट को मैनेज किया जा सकता है.

इस ट्यूटोरियल में, Skaffold के कुछ बुनियादी कॉन्सेप्ट के बारे में बताया गया है. साथ ही, अपने डेवलपमेंट लूप को ऑटोमेट करने के लिए इसका इस्तेमाल करने का तरीका बताया गया है. इसके बाद, एक ऐप्लिकेशन को डिप्लॉय करने का तरीका भी बताया गया है.

आपको:

  • लोकल डेवलपमेंट के लिए Skaffold को कॉन्फ़िगर और चालू करना
  • एक आसान golang ऐप्लिकेशन बनाएं और चलाएं
  • Skaffold की मदद से, स्थानीय ऐप्लिकेशन को डिप्लॉय करना
  • मेनिफ़ेस्ट रेंडर करें और अपने ऐप्लिकेशन को डिप्लॉय करें

2. शुरू करने से पहले

आपका फ़ाइल फ़ोल्डर तैयार करना

  1. Cloud Shell एडिटर खोलने के लिए, इस यूआरएल पर जाएं:
https://shell.cloud.google.com

तीसरे पक्ष की कुकी को अनुमति दें. "साइट काम नहीं कर रही है" पर क्लिक करने के बाद, "कुकी को अनुमति दें" पर क्लिक करें.

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. अगर आपने अब तक ऐसा नहीं किया है, तो टर्मिनल विंडो में इस कमांड का इस्तेमाल करके, ऐप्लिकेशन के सोर्स को क्लोन करें:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. क्लोन की गई रिपॉज़िटरी डायरेक्ट्री में बदलें:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. यह कमांड चलाकर, अपने Cloud Shell वर्कस्पेस को मौजूदा डायरेक्ट्री पर सेट करें:
cloudshell workspace .

प्रोजेक्ट तैयार करना

  1. यह पक्का करने के लिए कि आपका Google Cloud प्रोजेक्ट सही तरीके से सेट है, यह कमांड चलाएं:
gcloud config set project {{project-id}}

3. Skaffold का इस्तेमाल शुरू करना

  1. Skaffold की टॉप-लेवल कॉन्फ़िगरेशन फ़ाइल skaffold.yaml बनाने के लिए, यह कमांड चलाएं:
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. IDE पैनल में फ़ाइल skaffold.yaml खोलें. यह टॉप-लेवल कॉन्फ़िगरेशन फ़ाइल है, जो Skaffold पाइपलाइन के बारे में बताती है.

Kubernetes जैसे YAML फ़ॉर्मैट और YAML में इन सेक्शन पर ध्यान दें:

  • build
  • deploy
  • profiles

इन सेक्शन में यह बताया गया है कि ऐप्लिकेशन को कैसे बनाया और डिप्लॉय किया जाना चाहिए. साथ ही, हर डिप्लॉयमेंट टारगेट के लिए प्रोफ़ाइलें भी दी गई हैं.

Skaffold के स्टेज की पूरी सूची के बारे में ज़्यादा जानने के लिए, Skaffold पाइपलाइन के स्टेज दस्तावेज़ पढ़ें.

4. बनाएं

build सेक्शन में कॉन्फ़िगरेशन होता है, जिससे यह तय होता है कि ऐप्लिकेशन को कैसे बनाया जाना चाहिए. इस मामले में, आपको git टैग को मैनेज करने के तरीके का कॉन्फ़िगरेशन दिख सकता है. साथ ही, एक artifacts सेक्शन भी दिख सकता है, जिसमें ऐप्लिकेशन में शामिल कंटेनर इमेज के बारे में बताया गया है.

साथ ही, इस सेक्शन में आपको इमेज बनाने के लिए इस्तेमाल किए जाने वाले Dockerfile का रेफ़रंस दिख सकता है. स्केलोल्ड में, Jib, Maven, Gradle, क्लाउड-नेटिव Buildpacks, Bazel, और कस्टम स्क्रिप्ट जैसे अन्य बिल्ड टूल भी काम करते हैं. इस कॉन्फ़िगरेशन के बारे में ज़्यादा जानने के लिए, Skaffold Build दस्तावेज़ पढ़ें.

5. डिप्लॉय करें

deploy सेक्शन में कॉन्फ़िगरेशन होता है, जिससे यह तय होता है कि ऐप्लिकेशन को कैसे डिप्लॉय किया जाना चाहिए. इस मामले में, आपको डिफ़ॉल्ट डिप्लॉयमेंट का एक उदाहरण दिख सकता है. इसमें, Kustomize टूल का इस्तेमाल करने के लिए Skaffold को कॉन्फ़िगर किया गया है.

Kustomize टूल, Kubernetes मेनिफ़ेस्ट जनरेट करने की सुविधा देता है. इसके लिए, base डायरेक्ट्री में मौजूद सामान्य कॉम्पोनेंट की YAML फ़ाइलों के सेट को एक या एक से ज़्यादा "ओवरले" के साथ जोड़ा जाता है. आम तौर पर, ये ओवरले एक या एक से ज़्यादा डिप्लॉयमेंट टारगेट से जुड़े होते हैं. जैसे, dev, test, staging, और production या मिलते-जुलते टारगेट.

इस उदाहरण में आप तीन लक्ष्यों के लिए दो ओवरले देख सकते हैं, डेव, स्टेजिंग और प्रोड. डेव ओवरले का उपयोग लोकल डेवलपमेंट के दौरान किया जाएगा और स्कैफ़ोल्ड का उपयोग करके डिप्लॉय करते समय स्टेजिंग और प्रोड ओवरले का उपयोग किया जाएगा.

6. प्रोफ़ाइल

profiles सेक्शन में कॉन्फ़िगरेशन होता है, जो अलग-अलग कॉन्टेक्स्ट के लिए बिल्ड, टेस्ट, और डिप्लॉयमेंट कॉन्फ़िगरेशन तय करता है. आम तौर पर, अलग-अलग संदर्भ आपके ऐप्लिकेशन डिप्लॉयमेंट पाइपलाइन में अलग-अलग एनवायरमेंट होते हैं. जैसे, इस उदाहरण में staging या prod. इसका मतलब है कि ऐसे मेनिफ़ेस्ट को आसानी से मैनेज किया जा सकता है जिनका कॉन्टेंट, अलग-अलग टारगेट एनवायरमेंट के लिए अलग-अलग होना चाहिए. इसके लिए, आपको बॉयलरप्लेट कॉन्फ़िगरेशन को दोहराने की ज़रूरत नहीं है.

profiles सेक्शन में मौजूद कॉन्फ़िगरेशन, मुख्य कॉन्फ़िगरेशन (जैसे, build, test या deploy सेक्शन) के किसी भी आइटम को बदल सकता है या उसमें बदलाव कर सकता है.

उदाहरण के लिए, फ़ाइल overlays > prod > deployment.yaml खोलें. ध्यान दें कि यहां ऐप्लिकेशन के लिए, रिप्लिक की संख्या तीन के तौर पर कॉन्फ़िगर की गई है. इससे, बुनियादी कॉन्फ़िगरेशन बदल जाता है.

  1. IDE पैनल में यह फ़ाइल app > main.go खोलें. यह एक साधारण golang ऐप्लिकेशन है, जो हर सेकंड stdout पर एक स्ट्रिंग लिखता है.
  2. ध्यान दें कि ऐप्लिकेशन उस Kubernetes पॉड का नाम भी दिखाता है जिसमें वह चल रहा है.

Dockerfile देखना

  1. IDE पैनल में फ़ाइल app > Dockerfile खोलें. इस फ़ाइल में main.go फ़ाइल के लिए ऐप्लिकेशन कंटेनर इमेज बनाने के निर्देशों का क्रम शामिल है और इसका संदर्भ टॉप लेवल की skaffold.yaml फ़ाइल में दिया गया है.

7. Skaffold की मदद से डेवलप करना

अपना Kubernetes एनवायरमेंट कॉन्फ़िगर करना

  1. यह पक्का करने के लिए कि आपका स्थानीय Kubernetes क्लस्टर चल रहा है और कॉन्फ़िगर किया गया है, यह कमांड चलाएं:
minikube start

इसमें कुछ मिनट लग सकते हैं. क्लस्टर के शुरू होने पर, आपको यह आउटपुट दिखेगा:

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. dev, staging, और prod के लिए Kubernetes नेमस्पेस बनाने के लिए, यह कमांड चलाएं:
kubectl apply -f namespaces.yaml

आपको यह आउटपुट दिखेगा:

namespace/dev created
namespace/staging created
namespace/prod created

लोकल डेवलपमेंट के लिए Skaffold का इस्तेमाल करना

  1. ऐप्लिकेशन बनाने और उसे Cloud Shell में चल रहे किसी स्थानीय Kubernetes क्लस्टर पर डिप्लॉय करने के लिए, यह कमांड चलाएं:
skaffold dev

आपको ऐप्लिकेशन कंटेनर बनाने की प्रोसेस चलती हुई दिखेगी. इसमें एक मिनट लग सकता है. इसके बाद, ऐप्लिकेशन का आउटपुट हर सेकंड दोहराया जाएगा:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

ध्यान दें कि पॉड का सटीक नाम, ऊपर दिए गए सामान्य आउटपुट से अलग होगा.

ऐप्लिकेशन में बदलाव करना

अब आपके स्थानीय Kubernetes क्लस्टर में ऐप्लिकेशन चल रहा है. इसलिए, कोड में बदलाव किए जा सकते हैं. इसके बाद, Skaffold ऐप्लिकेशन को क्लस्टर में अपने-आप फिर से बनाएगा और फिर से डिप्लॉय करेगा.

  1. IDE पैनल में फ़ाइल app > main.go खोलें और आउटपुट स्ट्रिंग बदलें:
"Hello world from pod %s!\n"

इससे बदलें:

"Hello Skaffold world from pod %s!\n"

बदलाव करने के बाद, आपको Skaffold को इमेज को फिर से बनाते हुए दिखेगा. इसके बाद, वह इमेज को क्लस्टर में फिर से डिप्लॉय कर देगा. साथ ही, टर्मिनल विंडो में आउटपुट में हुए बदलाव दिखेंगे.

  1. अब, IDE पैनल में "ऐप्लिकेशन > main.go" फ़ाइल में भी लाइन बदलें:
time.Sleep(time.Second * 1)

से

time.Sleep(time.Second * 10)

आपको फिर से ऐप्लिकेशन को फिर से बनाया गया और फिर से डिप्लॉय किया गया दिखेगा. साथ ही, हर 10 सेकंड में आउटपुट लाइन दिखेगी.

Kubernetes कॉन्फ़िगरेशन में बदलाव करना

इसके बाद, आपको Kubernetes कॉन्फ़िगरेशन में बदलाव करना होगा. इसके बाद, Skofold को फिर से डिप्लॉय किया जा सकेगा.

  1. IDE में फ़ाइल base > deployment.yaml खोलें और लाइन में बदलाव करें:
replicas: 1

से

replicas: 2

ऐप्लिकेशन को फिर से डिप्लॉय करने के बाद, आपको दो पोड दिखेंगे – हर पोड का नाम अलग होगा.

  1. अब, फ़ाइल base > deployment.yaml में उसी लाइन को वापस बदलें:
replicas: 1

आपको एक पॉड दिखेगा, जिसे सेवा से हटा दिया गया है, ताकि सिर्फ़ एक पॉड बचे.

  1. आखिर में, स्केलोल्ड के लोकल डेवलपमेंट को रोकने के लिए, टर्मिनल विंडो में Ctrl-C दबाएं.

रिलीज़ को काटना

इसके बाद, रिलीज़ इमेज बनाकर और उसे क्लस्टर में डिप्लॉय करके, रिलीज़ बनाई जाएगी.

  1. रिलीज़ बनाने के लिए, यहां दिया गया कमांड चलाएं:
skaffold build --file-output artifacts.json

यह कमांड, ज़रूरत पड़ने पर फ़ाइनल इमेज बनाएगा और रिलीज़ की जानकारी को artifacts.json फ़ाइल में दिखाएगा.

अगर आपको अपने क्लस्टर में डिप्लॉय करने के लिए, Cloud Deploy जैसे टूल का इस्तेमाल करना है, तो इस फ़ाइल में रिलीज़ की जानकारी होती है. इसका मतलब है कि लाइव होने के रास्ते पर आर्टफ़ैक्ट में बदलाव नहीं किया जा सकता.

  1. artifacts.json फ़ाइल का कॉन्टेंट देखने के लिए, यह कमांड चलाएं:
cat artifacts.json | jq

ध्यान दें कि फ़ाइल में उस इमेज का रेफ़रंस है जिसका इस्तेमाल आखिरी डिप्लॉयमेंट में किया जाएगा.

स्टेजिंग में डिप्लॉय करना

  1. staging प्रोफ़ाइल का इस्तेमाल करके रिलीज़ को डिप्लॉय करने के लिए, यह कमांड चलाएं:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

डिप्लॉयमेंट पूरा होने के बाद, आपको इन दो पॉड से मिलने वाले नतीजे दिखेंगे:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. Skaffold का आउटपुट बंद करने के लिए, टर्मिनल विंडो में Ctrl-C दबाएं.
  2. क्लस्टर में अपने ऐप्लिकेशन के काम करने और चालू होने का निरीक्षण करने के लिए निम्न आदेश चलाएं:
kubectl get all --namespace staging

आपको दो अलग-अलग पॉड के नाम दिखेंगे, क्योंकि ऐप्लिकेशन के लिए staging प्रोफ़ाइल में बताया गया है कि डिप्लॉयमेंट में दो रेप्लिकेशन होने चाहिए.

प्रोडक्शन में डिप्लॉय करना

  1. अब prod प्रोफ़ाइल का इस्तेमाल करके रिलीज़ को डिप्लॉय करने के लिए, यह कमांड चलाएं:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

डिप्लॉयमेंट पूरा होने के बाद, आपको तीन पॉड से मिलता-जुलता आउटपुट दिखेगा:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. स्कैफ़ोल्ड आउटपुट को बंद करने के लिए, टर्मिनल विंडो में Ctrl-C दबाएं.

आपको तीन अलग-अलग पॉड के नाम दिखेंगे, क्योंकि ऐप्लिकेशन के लिए prod प्रोफ़ाइल में बताया गया है कि डिप्लॉयमेंट में तीन प्रतिकृति होनी चाहिए.

  1. क्लस्टर में अपने ऐप्लिकेशन के काम करने और चालू होने का निरीक्षण करने के लिए निम्न आदेश चलाएं:
kubectl get all --namespace prod

आपको ऐसा आउटपुट दिखेगा जिसमें प्रॉडक्ट डिप्लॉयमेंट दिखाने वाली इन लाइनों जैसी लाइनें होंगी:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

आपको तीन ऐप्लिकेशन पॉड भी दिखेंगे.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. बधाई हो!

बधाई हो! आपने Understanding Skaffold लैब पूरा कर लिया है और आपको लोकल डेवलपमेंट और ऐप्लिकेशन डिप्लॉयमेंट के लिए, Skaffold को कॉन्फ़िगर और इस्तेमाल करने का तरीका पता है.

आगे क्या करना है:

Skaffold के बारे में ज़्यादा जानने के लिए:

साफ़-सफ़ाई सेवा

  1. लोकल क्लस्टर को बंद करने के लिए, यह कमांड चलाएं:
minikube delete