Cloud Build की मदद से, Google Kubernetes Engine (GKE) में लगातार डिप्लॉय करना

1. खास जानकारी

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

आपको यह तरीका अपनाना होगा:

  • GKE ऐप्लिकेशन बनाना
  • Git ब्रांच के लिए डिप्लॉयमेंट को ऑटोमेट करना
  • git की मुख्य शाखा के लिए डिप्लॉयमेंट को ऑटोमेट करना
  • git टैग के लिए डिप्लॉयमेंट को ऑटोमेट करना

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

इस रेफ़रंस गाइड के लिए, आपके पास Google Cloud प्रोजेक्ट होना चाहिए. आपके पास नया प्रोजेक्ट बनाने या पहले से बनाए गए किसी प्रोजेक्ट को चुनने का विकल्प होता है:

  1. कोई Google Cloud प्रोजेक्ट चुनें या बनाएं.

प्रोजेक्ट चुनने वाले पेज पर जाएं

  1. अपने प्रोजेक्ट के लिए बिलिंग चालू करें.

बिलिंग चालू करें

3. आपका एनवायरमेंट तैयार किया जा रहा है

  1. इस पूरे ट्यूटोरियल में इस्तेमाल करने के लिए, एनवायरमेंट वैरिएबल बनाएं:
    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
    export ZONE=us-central1-b
    export CLUSTER=gke-progression-cluster
    export APP_NAME=myapp
    
  2. इन एपीआई को चालू करें:
    • रिसोर्स मैनेजर
    • GKE (जीकेई)
    • Cloud Source Repositories
    • Cloud Build
    • कंटेनर रजिस्ट्री
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        sourcerepo.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        --async
    
  3. सैंपल सोर्स को क्लोन करें और लैब डायरेक्ट्री पर स्विच करें:
    git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression
    
    cd gke-progression/labs/gke-progression
    rm -rf ../../.git
    
  4. सैंपल रिपॉज़िटरी में मौजूद प्लेसहोल्डर वैल्यू को अपनी PROJECT_ID से बदलें:इस चरण में, अपने मौजूदा एनवायरमेंट के लिए यूनीक कॉन्फ़िगरेशन फ़ाइलों के इंस्टेंस बनाए जाते हैं.अपडेट किए जा रहे टेंप्लेट का उदाहरण देखने के लिए, यह कमांड चलाएं.
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    नीचे दिए गए निर्देश को चलाकर, वैरिएबल को बदलें.
    for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
    
    बदलाव के बाद फ़ाइल का उदाहरण देखने के लिए, यह कमांड चलाएं.
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. अगर आपने Cloud Shell में पहले कभी Git का इस्तेमाल नहीं किया है, तो user.name और user.email के लिए अपनी पसंद की वैल्यू सेट करें:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. सैंपल रिपॉज़िटरी से कोड को Cloud Source Repositories में सेव करें:
    gcloud source repos create gke-progression
    git init
    git config credential.helper gcloud.sh
    git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression
    git branch -m main
    git add . && git commit -m "initial commit"
    git push gcp main
    
  7. अपना GKE क्लस्टर बनाएं.
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. अपने क्लस्टर को Cloud Build के अधिकार दें. Cloud Build, ऐप्लिकेशन को आपके GKE क्लस्टर पर डिप्लॉय करेगा. इसके लिए, उसे अधिकारों की ज़रूरत होगी.
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

आपका एनवायरमेंट तैयार है!

4. GKE ऐप्लिकेशन बनाना

इस सेक्शन में, शुरुआती प्रोडक्शन ऐप्लिकेशन बनाया और डिप्लॉय किया जाता है. इसका इस्तेमाल इस पूरे ट्यूटोरियल में किया जाता है.

  1. Cloud Build की मदद से ऐप्लिकेशन बनाएं:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. कैनरी और प्रोडक्शन एनवायरमेंट में मैन्युअल तरीके से डिप्लॉय करें:kubectl apply कमांड का इस्तेमाल करके, प्रोडक्शन और कैनरी डिप्लॉयमेंट और सेवाएं बनाएं.
    kubectl create ns production
    kubectl apply -f k8s/deployments/prod -n production
    kubectl apply -f k8s/deployments/canary -n production
    kubectl apply -f k8s/services -n production
    
    यहां डिप्लॉय की गई सेवा, ट्रैफ़िक को कैनरी और प्रॉडक्ट, दोनों डिप्लॉयमेंट पर रूट करेगी.
  3. चल रहे पॉड की संख्या की समीक्षा करें. पुष्टि करें कि फ़्रंटएंड के लिए चार पॉड चल रहे हैं. इनमें से तीन पॉड, प्रोडक्शन ट्रैफ़िक के लिए और एक पॉड, कैनरी रिलीज़ के लिए चल रहा है. इसका मतलब है कि कैनरी रिलीज़ में किए गए बदलावों का असर, सिर्फ़ चार में से एक (25%) उपयोगकर्ता पर पड़ेगा.
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. प्रोडक्शन सेवाओं के लिए एक्सटर्नल आईपी पता पाएं.
    kubectl get service $APP_NAME -n production
    
    लोड बैलेंसर के आईपी पते की जानकारी देने के बाद, अगले चरण पर जाएं
  5. यह कुकी, बाहरी आईपी को बाद में इस्तेमाल करने के लिए सेव करती है.
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. आवेदन की समीक्षा करें. सेवा के वर्शन का आउटपुट देखें. यह Hello World v1.0 होना चाहिए
    curl http://$PRODUCTION_IP
    

बधाई हो! आपने सैंपल ऐप्लिकेशन डिप्लॉय कर दिया है! इसके बाद, बदलावों को लगातार डिप्लॉय करने के लिए ट्रिगर सेट अप करें.

5. Git ब्रांच के लिए डिप्लॉयमेंट को अपने-आप होने के लिए सेट करना

इस सेक्शन में, आपको एक ट्रिगर सेट अप करना होगा. इससे main के अलावा किसी अन्य ब्रांच को कमिट करने पर, Cloudbuild जॉब को एक्ज़ीक्यूट किया जा सकेगा. यहां इस्तेमाल की गई Cloud Build फ़ाइल, किसी भी मौजूदा या नई ब्रांच के लिए अपने-आप नेमस्पेस और डिप्लॉयमेंट बना देगी. इससे डेवलपर, मुख्य ब्रांच के साथ इंटिग्रेट करने से पहले अपने कोड की झलक देख पाएंगे.

  1. ट्रिगर सेट अप करें:इस ट्रिगर का मुख्य कॉम्पोनेंट, main और invertRegex पैरामीटर को मैच करने के लिए branchName पैरामीटर का इस्तेमाल करना है. invertRegex पैरामीटर को सही पर सेट किया जाता है. साथ ही, यह branchName पैटर्न को बदलकर, main से अलग किसी भी वैल्यू से मैच करने के लिए सेट किया जाता है. आपकी जानकारी के लिए, build/branch-trigger.json में ये लाइनें दी गई हैं.
      "branchName": "main",
      "invertRegex": true
    
    इसके अलावा, इस ट्रिगर के साथ इस्तेमाल की गई Cloud Build फ़ाइल की आखिरी कुछ लाइनें, उस ब्रांच के नाम पर एक नेमस्पेस बनाती हैं जिसने जॉब को ट्रिगर किया है. इसके बाद, यह ऐप्लिकेशन और सेवा को नए नेमस्पेस में डिप्लॉय करती है. आपकी जानकारी के लिए, build/branch-cloudbuild.yaml में ये लाइनें दी गई हैं
      kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME}
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/services
    
    अब आपको इस्तेमाल किए जा रहे तरीकों के बारे में पता चल गया है. इसलिए, नीचे दी गई gcloud कमांड का इस्तेमाल करके ट्रिगर बनाएं.
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/branch-trigger.json
    
  2. ट्रिगर की समीक्षा करने के लिए, Console में Cloud Build ट्रिगर पेज पर जाएं.ट्रिगर पर जाएं
  3. नई ब्रांच बनाएं:
    git checkout -b new-feature-1
    
  4. कोड में बदलाव करके v1.1 के बारे में बताएं src/app.py में बदलाव करें और जवाब को 1.0 से बदलकर 1.1 करें
    @app.route('/')
    def hello_world():
        return 'Hello World v1.1'
    
  5. बदलाव को सेव करें और रिमोट रिपॉज़िटरी में पुश करें:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. बनाए जा रहे बिल्ड की समीक्षा करने के लिए, Console में Cloud Build का इतिहास पेज पर जाएं.बिल्ड पर जाएंबिल्ड पूरा होने के बाद, अगले चरण पर जाएं
  7. हाल ही में डिप्लॉय की गई ब्रांच सेवा के लिए, बाहरी आईपी पता वापस पाएं.
    kubectl get service $APP_NAME -n new-feature-1
    
    लोड बैलेंसर के आईपी पते की जानकारी देने के बाद, अगले चरण पर जाएं
  8. यह कुकी, बाहरी आईपी को बाद में इस्तेमाल करने के लिए सेव करती है.
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. आवेदन की समीक्षा करें. सेवा के वर्शन का आउटपुट देखें. यह Hello World v1.0 होना चाहिए
    curl http://$BRANCH_IP
    

6. Git की मुख्य शाखा के लिए डिप्लॉयमेंट को अपने-आप होने की सुविधा

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

इस सेक्शन में, आपको एक ऐसा ट्रिगर लागू करना है जो मुख्य ब्रांच में कोड सबमिट होने पर चालू हो जाए. ट्रिगर, कैनरी डिप्लॉयमेंट को लागू करता है. इससे नए वर्शन को 25% लाइव ट्रैफ़िक मिलता है.

  1. मुख्य ब्रांच के लिए ट्रिगर सेट अप करें:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. नए ट्रिगर की समीक्षा करने के लिए, Console में Cloud Build ट्रिगर पेज पर जाएं.ट्रिगर पर जाएं
  3. ब्रांच को मुख्य लाइन में मर्ज करें और रिमोट रिपॉज़िटरी में पुश करें:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. बनाई जा रही इमेज की समीक्षा करने के लिए, Console में Cloud Build का इतिहास पेज पर जाएं.बिल्ड पर जाएंबिल्ड पूरा होने के बाद, अगले चरण पर जाएं
  5. सर्वर से मिले कई जवाबों की समीक्षा करें. इसके लिए, यह कमांड चलाएं. ध्यान दें कि लगभग 25% जवाबों में, Hello World v1.1 का नया जवाब दिख रहा है
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    जब आप जारी रखने के लिए तैयार हों, तो लूप से बाहर निकलने के लिए Ctrl+c दबाएं.

7. git टैग के लिए डिप्लॉयमेंट को ऑटोमेट करना

जब ट्रैफ़िक के छोटे सबसेट के साथ कैनरी डिप्लॉयमेंट की पुष्टि हो जाती है, तब डिप्लॉयमेंट को बाकी लाइव ट्रैफ़िक के लिए रिलीज़ किया जाता है.

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

  1. टैग ट्रिगर सेट अप करें:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. नए ट्रिगर की समीक्षा करने के लिए, Console में Cloud Build ट्रिगर पेज पर जाएं.ट्रिगर पर जाएं
  3. नया टैग बनाएं और उसे रिमोट रिपॉज़िटरी में पुश करें:
    git tag 1.1
    git push gcp 1.1
    
  4. बिल्ड की प्रोसेस देखने के लिए, Console में Cloud Build का इतिहास पेज पर जाएं.बिल्ड पर जाएं
  5. सर्वर से मिले कई जवाबों की समीक्षा करें. इसके लिए, यह कमांड चलाएं और ध्यान दें कि 100% जवाबों में, Hello World v1.1 का नया जवाब दिख रहा है. इसमें कुछ समय लग सकता है, क्योंकि नए पॉड को GKE में डिप्लॉय किया जाता है और उनकी सेहत की जांच की जाती है
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    जब आप जारी रखने के लिए तैयार हों, तो लूप से बाहर निकलने के लिए Ctrl+c दबाएं.बधाई हो! आपने GKE पर अपने ऐप्लिकेशन डिप्लॉय करने के लिए, Cloud Build में ब्रांच और टैग के लिए CI/CD ट्रिगर बनाए हों.

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

प्रोजेक्ट मिटाना

  1. Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  2. प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे आपको मिटाना है. इसके बाद, मिटाएं पर क्लिक करें.
  3. डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.