ক্লাউড বিল্ডের সাথে Google Kubernetes Engine (GKE) তে ক্রমাগত স্থাপনা

১. সংক্ষিপ্ত বিবরণ

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

আপনাকে নিম্নলিখিত ধাপগুলো সম্পন্ন করতে হবে:

  • GKE অ্যাপ্লিকেশন তৈরি করুন
  • গিট ব্রাঞ্চগুলির জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করুন
  • গিট প্রধান শাখার জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করুন
  • গিট ট্যাগের জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করুন

২. শুরু করার আগে

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

  1. একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।

প্রজেক্ট সিলেক্টর পেজে যান

  1. আপনার প্রোজেক্টের জন্য বিলিং চালু করুন।

বিলিং সক্ষম করুন

৩. আপনার পরিবেশ প্রস্তুত করা

  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. নিম্নলিখিত API গুলি সক্রিয় করুন:
    • রিসোর্স ম্যানেজার
    • জিকেই
    • ক্লাউড সোর্স রিপোজিটরি
    • ক্লাউড বিল্ড
    • কন্টেইনার রেজিস্ট্রি
    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. আপনি যদি আগে ক্লাউড শেলে গিট ব্যবহার না করে থাকেন, তাহলে আপনার পছন্দের user.name এবং user.email ভ্যালুগুলো সেট করুন:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. স্যাম্পল রিপোজিটরি থেকে কোডটি ক্লাউড সোর্স রিপোজিটরিতে সংরক্ষণ করুন:
    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. আপনার ক্লাস্টারে ক্লাউড বিল্ডকে অধিকার দিন। ক্লাউড বিল্ড আপনার GKE ক্লাস্টারে অ্যাপ্লিকেশনটি স্থাপন করবে এবং এর জন্য তার অধিকারের প্রয়োজন হবে।
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

আপনার পরিবেশ প্রস্তুত!

৪. আপনার GKE অ্যাপ্লিকেশন তৈরি করা

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

  1. ক্লাউড বিল্ড দিয়ে অ্যাপ্লিকেশনটি তৈরি করুন:
    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. চলমান পডের সংখ্যা পর্যালোচনা করুন। নিশ্চিত করুন যে আপনার ফ্রন্টএন্ডের জন্য চারটি পড চলছে, যার মধ্যে তিনটি প্রোডাকশন ট্র্যাফিকের জন্য এবং একটি ক্যানারি রিলিজের জন্য। এর মানে হলো, আপনার ক্যানারি রিলিজের পরিবর্তনগুলো প্রতি ৪ জন ব্যবহারকারীর মধ্যে মাত্র ১ জনকে (২৫%) প্রভাবিত করবে।
    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
    

অভিনন্দন! আপনি নমুনা অ্যাপটি ডেপ্লয় করেছেন! এরপর, আপনার পরিবর্তনগুলো ধারাবাহিকভাবে ডেপ্লয় করার জন্য ট্রিগার সেট আপ করতে হবে।

৫. গিট ব্রাঞ্চের জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করা

এই অংশে আপনি এমন একটি ট্রিগার সেট আপ করবেন যা main ব্রাঞ্চ ছাড়া অন্য যেকোনো ব্রাঞ্চ কমিট হলে একটি ক্লাউডবিল্ড জব এক্সিকিউট করবে। এখানে ব্যবহৃত ক্লাউড বিল্ড ফাইলটি যেকোনো বিদ্যমান বা নতুন ব্রাঞ্চের জন্য স্বয়ংক্রিয়ভাবে একটি নেমস্পেস এবং ডিপ্লয়মেন্ট তৈরি করবে, যা ডেভেলপারদের 'main' ব্রাঞ্চের সাথে ইন্টিগ্রেশনের আগে তাদের কোড প্রিভিউ করার সুযোগ দেবে।

  1. ট্রিগারটি সেট আপ করুন: এই ট্রিগারের মূল উপাদান হলো branchName প্যারামিটারের ব্যবহার, যা main ম্যাচ করে এবং ` invertRegex প্যারামিটার, যা `true` সেট করা থাকে এবং branchName প্যাটার্নটিকে পরিবর্তন করে main ছাড়া অন্য যেকোনো কিছুকে ম্যাচ করার জন্য। আপনার সুবিধার জন্য build/branch-trigger.json ফাইলে নিম্নলিখিত লাইনগুলো দেখতে পারেন।
      "branchName": "main",
      "invertRegex": true
    
    এছাড়াও, এই ট্রিগারের সাথে ব্যবহৃত ক্লাউড বিল্ড ফাইলের শেষ কয়েকটি লাইন, যে ব্রাঞ্চটি জবটি ট্রিগার করেছে তার নামে একটি নেমস্পেস তৈরি করে এবং তারপর নতুন নেমস্পেসের মধ্যে অ্যাপ্লিকেশন ও সার্ভিসটি ডেপ্লয় করে। আপনার অবগতির জন্য 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. ট্রিগারটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড ট্রিগার পৃষ্ঠায় যান। ট্রিগার-এ যান।
  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. চলমান বিল্ডটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড হিস্ট্রি পৃষ্ঠায় যান। বিল্ডস-এ যান। বিল্ডটি সম্পূর্ণ হলে পরবর্তী ধাপে এগিয়ে যান।
  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
    

৬. গিট প্রধান শাখার জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করা

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

এই অংশে, আপনি এমন একটি ট্রিগার তৈরি করবেন যা মেইন ব্রাঞ্চে কোড কমিট করা হলে সক্রিয় হয়। এই ট্রিগারটি ক্যানারি ডেপ্লয়মেন্টটি স্থাপন করে, যা নতুন রিভিশনের সমস্ত লাইভ ট্রাফিকের ২৫% গ্রহণ করে।

  1. প্রধান শাখার জন্য ট্রিগার সেট আপ করুন:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. নতুন ট্রিগারটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড ট্রিগার পৃষ্ঠায় যান। ট্রিগার-এ যান।
  3. ব্রাঞ্চটিকে মেইন লাইনের সাথে মার্জ করুন এবং রিমোট রিপোজিটরিতে পুশ করুন:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. চলমান বিল্ডটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড হিস্ট্রি পৃষ্ঠায় যান। বিল্ডস-এ যান। বিল্ডটি সম্পন্ন হলে পরবর্তী ধাপে এগিয়ে যান।
  5. সার্ভার থেকে আসা একাধিক প্রতিক্রিয়া পর্যালোচনা করুন। নিম্নলিখিত কমান্ডটি চালান এবং লক্ষ্য করুন যে, প্রায় ২৫% প্রতিক্রিয়াতে Hello World v1.1-এর নতুন প্রতিক্রিয়াটি দেখা যাচ্ছে।
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    যখন আপনি চালিয়ে যেতে প্রস্তুত হবেন, লুপ থেকে বেরিয়ে আসার জন্য Ctrl+c চাপুন।

৭. গিট ট্যাগের জন্য ডেপ্লয়মেন্ট স্বয়ংক্রিয় করা

অল্প কিছু ট্র্যাফিকের মাধ্যমে ক্যানারি ডেপ্লয়মেন্টটি যাচাই করার পর, আপনি বাকি লাইভ ট্র্যাফিকের জন্য ডেপ্লয়মেন্টটি রিলিজ করে দেন।

এই অংশে, আপনি এমন একটি ট্রিগার সেট আপ করেন যা রিপোজিটরিতে একটি ট্যাগ তৈরি করার সময় সক্রিয় হয়। ট্রিগারটি ছবিটিকে উপযুক্ত ট্যাগ দিয়ে লেবেল করে এবং তারপর প্রোডাকশনে আপডেটগুলি ডেপ্লয় করে, যা নিশ্চিত করে যে ১০০% ট্র্যাফিক ট্যাগ করা ছবিটিই অ্যাক্সেস করছে।

  1. ট্যাগ ট্রিগার সেট আপ করুন:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. নতুন ট্রিগারটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড ট্রিগার পৃষ্ঠায় যান। ট্রিগার-এ যান।
  3. একটি নতুন ট্যাগ তৈরি করুন এবং রিমোট রিপোজিটরিতে পুশ করুন:
    git tag 1.1
    git push gcp 1.1
    
  4. চলমান বিল্ডটি পর্যালোচনা করতে, কনসোলের ক্লাউড বিল্ড হিস্ট্রি পৃষ্ঠায় যান। বিল্ডস-এ যান।
  5. সার্ভার থেকে একাধিক প্রতিক্রিয়া পর্যালোচনা করুন। নিম্নলিখিত কমান্ডটি চালান এবং লক্ষ্য করুন যে ১০০% প্রতিক্রিয়াতেই Hello World v1.1-এর নতুন প্রতিক্রিয়াটি দেখা যাচ্ছে। GKE-এর মধ্যে নতুন পডগুলি স্থাপন এবং স্বাস্থ্য পরীক্ষা করা হচ্ছে বলে এতে কিছুটা সময় লাগতে পারে।
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    যখন আপনি চালিয়ে যেতে প্রস্তুত হবেন, লুপ থেকে বেরিয়ে আসার জন্য Ctrl+c চাপুন। অভিনন্দন! আপনি আপনার অ্যাপগুলোকে GKE-তে ডেপ্লয় করার জন্য ক্লাউড বিল্ড-এ ব্রাঞ্চ এবং ট্যাগগুলোর জন্য CI/CD ট্রিগার তৈরি করেছেন।

৮. পরিচ্ছন্নতা

প্রকল্পটি মুছে ফেলুন

  1. ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  2. প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
  3. ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।