1. بررسی اجمالی
در این آزمایشگاه، راهاندازی یک خط لوله تحویل پیوسته برای GKE با Cloud Build را خواهید آموخت. این آزمایشگاه نحوه راهاندازی مشاغل Cloud Build برای رویدادهای git مختلف و همچنین یک الگوی ساده برای انتشار خودکار قناری در GKE را نشان میدهد.
شما مراحل زیر را تکمیل خواهید کرد:
- برنامه GKE را ایجاد کنید
- به طور خودکار استقرار برای شاخه های git
- استقرار خودکار برای شاخه اصلی git
- به طور خودکار استقرار برای تگ های git
2. قبل از شروع
برای این راهنمای مرجع، به یک پروژه Google Cloud نیاز دارید. می توانید یک پروژه جدید ایجاد کنید یا پروژه ای را که قبلا ایجاد کرده اید انتخاب کنید:
- یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
- صورتحساب پروژه خود را فعال کنید.
3. محیط خود را آماده کنید
- متغیرهای محیطی را برای استفاده در این آموزش ایجاد کنید:
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
- API های زیر را فعال کنید:
- مدیر منابع
- GKE
- مخازن منبع ابری
- ساخت ابر
- رجیستری کانتینر
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async
- منبع نمونه را کلون کنید و به دایرکتوری آزمایشگاه بروید:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git
- مقادیر مکاننما را در مخزن نمونه با
PROJECT_ID
خود جایگزین کنید: در این مرحله شما نمونههایی از فایلهای پیکربندی مختلف را منحصر به محیط فعلی خود ایجاد میکنید. برای بررسی نمونهای از الگوهای در حال بهروزرسانی، دستور زیر را اجرا کنید. با اجرای دستور followign تعویض متغیر را انجام دهید.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
- اگر قبلاً از Git در Cloud Shell استفاده نکردهاید، مقادیر
user.name
وuser.email
را که میخواهید استفاده کنید تنظیم کنید:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME"
- کد را از مخزن نمونه در مخازن منبع ابری ذخیره کنید:
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
- خوشه GKE خود را ایجاد کنید.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE}
- حقوق 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 خود
در این بخش، برنامه تولید اولیه ای را که در طول این آموزش استفاده می کنید، ساخته و استقرار می دهید.
- ساخت اپلیکیشن با Cloud Build:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
- استقرار دستی در محیطهای 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
- بررسی تعداد پادهای در حال اجرا تأیید کنید که چهار پاد در حال اجرا برای قسمت جلویی دارید، از جمله سه پاد برای ترافیک تولید و یکی برای انتشار قناری. این بدان معنی است که تغییرات در نسخه قناری شما تنها بر 1 از 4 (25٪) کاربران تأثیر می گذارد.
kubectl get pods -n production -l app=$APP_NAME -l role=frontend
- آدرس IP خارجی خدمات تولید را بازیابی کنید.
هنگامی که بار متعادل کننده آدرس IP را برگرداند، به مرحله بعدی ادامه دهیدkubectl get service $APP_NAME -n production
- IP خارجی را برای استفاده بعدی ذخیره کنید.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME)
- بررسی برنامه خروجی نسخه سرویس را بررسی کنید. باید Hello World نسخه 1.0 را خوانده شود
curl http://$PRODUCTION_IP
تبریک می گویم! شما برنامه نمونه را مستقر کردید! در مرحله بعد، یک محرک برای استقرار مداوم تغییرات خود تنظیم خواهید کرد.
5. استقرار خودکار برای شاخه های git
در این بخش شما یک ماشه راه اندازی می کنید که یک کار Cloudbuild را در commit هر شاخه ای غیر از main
اجرا می کند. فایل Cloud Build مورد استفاده در اینجا به طور خودکار یک فضای نام و استقرار برای هر شاخه موجود یا جدید ایجاد می کند و به توسعه دهندگان این امکان را می دهد تا پیش نمایش کد خود را قبل از ادغام با شاخه اصلی مشاهده کنند.
- راهاندازی را تنظیم کنید: مؤلفه کلیدی این تریگر استفاده از پارامتر
branchName
برای مطابقت باmain
و پارامترinvertRegex
است که روی true تنظیم شده است و الگویbranchName
را برای مطابقت با هر چیزی کهmain
نیست تغییر میدهد. برای مرجع خود می توانید خطوط زیر را درbuild/branch-trigger.json
بیابید. علاوه بر این، چند خط آخر فایل Cloud Build که با این تریگر استفاده می شود، فضای نامی را به نام شاخه ای که کار را راه اندازی کرده است ایجاد می کند، سپس برنامه و سرویس را در فضای نام جدید مستقر می کند. برای مرجع خود می توانید خطوط زیر را در"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yaml
بیابید اکنون که مکانیسم های مورد استفاده را درک کردید، با دستور gcloud زیر، ماشه را ایجاد کنید.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 beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json
- برای بررسی محرک، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
- یک شعبه جدید ایجاد کنید:
git checkout -b new-feature-1
- کد را برای نشان دادن v1.1Edit
src/app.py
تغییر دهید و پاسخ را از 1.0 به 1.1 تغییر دهید.@app.route('/') def hello_world(): return 'Hello World v1.1'
- تغییر را انجام دهید و به مخزن راه دور فشار دهید:
git add . && git commit -m "updated" && git push gcp new-feature-1
- برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. رفتن به Builds پس از تکمیل ساخت، به مرحله بعد بروید
- آدرس IP خارجی سرویس شعبه تازه مستقر شده را بازیابی کنید.
هنگامی که بار متعادل کننده آدرس IP را برگرداند، به مرحله بعدی ادامه دهیدkubectl get service $APP_NAME -n new-feature-1
- IP خارجی را برای استفاده بعدی ذخیره کنید.
export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature-1 services $APP_NAME)
- برنامه را مرور کنید خروجی نسخه سرویس را بررسی کنید. باید Hello World نسخه 1.0 را خوانده شود
curl http://$BRANCH_IP
6. استقرار خودکار برای شاخه اصلی git
قبل از انتشار کد برای تولید، معمول است که کد را برای زیرمجموعه کوچکی از ترافیک زنده قبل از انتقال همه ترافیک به پایه کد جدید منتشر کنید.
در این بخش، شما یک تریگر را پیاده سازی می کنید که زمانی که کد به شاخه اصلی متعهد می شود، فعال می شود. ماشه استقرار قناری را به کار می گیرد که 25٪ از کل ترافیک زنده را به نسخه جدید دریافت می کند.
- ماشه را برای شاخه اصلی تنظیم کنید:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json
- برای بررسی راهانداز جدید، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
- شاخه را به خط اصلی ادغام کنید و به مخزن راه دور فشار دهید:
git checkout main git merge new-feature-1 git push gcp main
- برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. به Builds بروید پس از اتمام ساخت، به مرحله بعد بروید
- چندین پاسخ از سرور را بررسی کنید دستور زیر را اجرا کنید و توجه داشته باشید که تقریباً 25٪ از پاسخ ها پاسخ جدید Hello World v1.1 را نشان می دهند.
وقتی آماده ادامه دادن شدید،while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+c
را فشار دهید تا از حلقه خارج شوید.
7. استقرار خودکار برای تگ های git
بعد از اینکه استقرار قناری با یک زیرمجموعه کوچک از ترافیک تأیید شد، استقرار را به بقیه ترافیک زنده رها می کنید.
در این بخش، شما یک تریگر تنظیم می کنید که با ایجاد یک برچسب در مخزن فعال می شود. ماشه تصویر را با برچسب مناسب برچسب گذاری می کند و سپس به روز رسانی ها را برای اطمینان از دسترسی 100٪ ترافیک به تصویر برچسب گذاری شده اجرا می کند.
- راهاندازی برچسب را تنظیم کنید:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json
- برای بررسی راهانداز جدید، به صفحه Cloud Build Triggers در کنسول بروید. به Triggers بروید
- یک تگ جدید ایجاد کنید و به مخزن راه دور فشار دهید:
git tag 1.1 git push gcp 1.1
- برای بررسی ساخت در حال انجام، به صفحه Cloud Build History در کنسول بروید. به Builds بروید
- چندین پاسخ از سرور را مرور کنید دستور زیر را اجرا کنید و توجه داشته باشید که 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. پاکسازی
پروژه را حذف کنید
- در Cloud Console، به صفحه مدیریت منابع بروید.
- در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
- در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.