استقرار مداوم به موتور Google Kubernetes (GKE) با Cloud Build

1. بررسی اجمالی

در این آزمایشگاه، راه‌اندازی یک خط لوله تحویل پیوسته برای GKE با Cloud Build را خواهید آموخت. این آزمایشگاه نحوه راه‌اندازی مشاغل Cloud Build برای رویدادهای git مختلف و همچنین یک الگوی ساده برای انتشار خودکار قناری در 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. API های زیر را فعال کنید:
    • مدیر منابع
    • GKE
    • مخازن منبع ابری
    • ساخت ابر
    • رجیستری کانتینر
    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
    
    با اجرای دستور followign تعویض متغیر را انجام دهید.
    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. اگر قبلاً از Git در Cloud Shell استفاده نکرده‌اید، مقادیر 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. حقوق Cloud Build را به کلاستر خود بدهید. Cloud Build برنامه را در GKE Cluster شما مستقر می کند و برای انجام این کار به حقوق نیاز دارد.
    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. استقرار دستی در محیط‌های Canary و Production: استقرار و سرویس‌های تولید و قناری را با استفاده از دستورات 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. بررسی تعداد پادهای در حال اجرا تأیید کنید که چهار پاد در حال اجرا برای قسمت جلویی دارید، از جمله سه پاد برای ترافیک تولید و یکی برای انتشار قناری. این بدان معنی است که تغییرات در نسخه قناری شما تنها بر 1 از 4 (25٪) کاربران تأثیر می گذارد.
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. آدرس IP خارجی خدمات تولید را بازیابی کنید.
    kubectl get service $APP_NAME -n production
    
    هنگامی که بار متعادل کننده آدرس IP را برگرداند، به مرحله بعدی ادامه دهید
  5. IP خارجی را برای استفاده بعدی ذخیره کنید.
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. بررسی برنامه خروجی نسخه سرویس را بررسی کنید. باید Hello World نسخه 1.0 را خوانده شود
    curl http://$PRODUCTION_IP
    

تبریک می گویم! شما برنامه نمونه را مستقر کردید! در مرحله بعد، یک محرک برای استقرار مداوم تغییرات خود تنظیم خواهید کرد.

5. استقرار خودکار برای شاخه های git

در این بخش شما یک ماشه راه اندازی می کنید که یک کار Cloudbuild را در commit هر شاخه ای غیر از main اجرا می کند. فایل Cloud Build مورد استفاده در اینجا به طور خودکار یک فضای نام و استقرار برای هر شاخه موجود یا جدید ایجاد می کند و به توسعه دهندگان این امکان را می دهد تا پیش نمایش کد خود را قبل از ادغام با شاخه اصلی مشاهده کنند.

  1. راه‌اندازی را تنظیم کنید: مؤلفه کلیدی این تریگر استفاده از پارامتر branchName برای مطابقت با main و پارامتر invertRegex است که روی true تنظیم شده است و الگوی 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. برای بررسی محرک، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
  3. یک شعبه جدید ایجاد کنید:
    git checkout -b new-feature-1
    
  4. کد را برای نشان دادن v1.1Edit 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. برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. رفتن به Builds پس از تکمیل ساخت، به مرحله بعد بروید
  7. آدرس IP خارجی سرویس شعبه تازه مستقر شده را بازیابی کنید.
    kubectl get service $APP_NAME -n new-feature-1
    
    هنگامی که بار متعادل کننده آدرس IP را برگرداند، به مرحله بعدی ادامه دهید
  8. IP خارجی را برای استفاده بعدی ذخیره کنید.
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. برنامه را مرور کنید خروجی نسخه سرویس را بررسی کنید. باید Hello World نسخه 1.0 را خوانده شود
    curl http://$BRANCH_IP
    

6. استقرار خودکار برای شاخه اصلی git

قبل از انتشار کد برای تولید، معمول است که کد را برای زیرمجموعه کوچکی از ترافیک زنده قبل از انتقال همه ترافیک به پایه کد جدید منتشر کنید.

در این بخش، شما یک تریگر را پیاده سازی می کنید که زمانی که کد به شاخه اصلی متعهد می شود، فعال می شود. ماشه استقرار قناری را به کار می گیرد که 25٪ از کل ترافیک زنده را به نسخه جدید دریافت می کند.

  1. ماشه را برای شاخه اصلی تنظیم کنید:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. برای بررسی راه‌انداز جدید، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
  3. شاخه را به خط اصلی ادغام کنید و به مخزن راه دور فشار دهید:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. به Builds بروید پس از اتمام ساخت، به مرحله بعد بروید
  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. برای بررسی راه‌انداز جدید، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
  3. یک تگ جدید ایجاد کنید و به مخزن راه دور فشار دهید:
    git tag 1.1
    git push gcp 1.1
    
  4. برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. به Builds بروید
  5. چندین پاسخ از سرور را مرور کنید دستور زیر را اجرا کنید و توجه داشته باشید که 100% پاسخ‌ها پاسخ جدید Hello World v1.1 را نشان می‌دهند این ممکن است یک لحظه طول بکشد زیرا پادهای جدید مستقر می‌شوند و سلامت آن در GKE بررسی می‌شود.
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    وقتی آماده ادامه دادن شدید Ctrl+c فشار دهید تا از حلقه خارج شوید. تبریک می‌گوییم! شما تریگرهای CI/CD را در Cloud Build برای شاخه ها و برچسب ها ایجاد کردید تا برنامه های خود را در GKE مستقر کنید.

8. پاکسازی

پروژه را حذف کنید

  1. در Cloud Console، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
  3. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.