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
- Cloud Source Repositories
- Cloud Build
- Container Registry
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async - โคลนแหล่งข้อมูลตัวอย่างและเปลี่ยนไปที่ไดเรกทอรีของ Lab โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git - แทนที่ค่าตัวยึดตำแหน่งในที่เก็บตัวอย่างด้วย
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%.*}; donecat 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" - จัดเก็บโค้ดจากที่เก็บตัวอย่างใน 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 - สร้างคลัสเตอร์ GKE
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE} - ให้สิทธิ์ 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
ในส่วนนี้ คุณจะได้สร้างและติดตั้งใช้งานแอปพลิเคชันเวอร์ชันเริ่มต้นที่ใช้ตลอดบทแนะนำนี้
- สร้างแอปพลิเคชันด้วย Cloud Build โดยทำดังนี้
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/ - ทำให้ใช้งานได้ในสภาพแวดล้อม Canary และการใช้งานจริงด้วยตนเอง:สร้างการทำให้ใช้งานจริงและบริการสำหรับการใช้งานจริงและ Canary โดยใช้คำสั่ง
kubectl apply บริการที่ติดตั้งใช้งานที่นี่จะกำหนดเส้นทางการรับส่งข้อมูลไปยังการติดตั้งใช้งานทั้งแบบ Canary และ Prodkubectl 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 - ตรวจสอบจำนวนพ็อดที่ทำงานอยู่ ยืนยันว่าคุณมีพ็อด 4 รายการที่ทำงานอยู่สำหรับส่วนหน้า ซึ่งรวมถึง 3 รายการสำหรับการเข้าชมที่ใช้งานจริง และ 1 รายการสำหรับการเปิดตัวแบบคานารี ซึ่งหมายความว่าการเปลี่ยนแปลงในรุ่นคานารีจะมีผลกับผู้ใช้เพียง 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 v1.0
curl http://$PRODUCTION_IP
ยินดีด้วย คุณทำให้แอปตัวอย่างใช้งานได้แล้ว จากนั้นคุณจะตั้งค่าทริกเกอร์เพื่อทำการเปลี่ยนแปลงอย่างต่อเนื่อง
5. การทำให้การติดตั้งใช้งานสำหรับกิ่ง Git เป็นไปโดยอัตโนมัติ
ในส่วนนี้ คุณจะตั้งค่าทริกเกอร์ที่จะเรียกใช้งาน Cloudbuild ในการคอมมิตของสาขาอื่นๆ นอกเหนือจาก main ไฟล์ Cloud Build ที่ใช้ที่นี่จะสร้างเนมสเปซและการติดตั้งใช้งานสำหรับสาขาที่มีอยู่หรือสาขาใหม่โดยอัตโนมัติ ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ดูตัวอย่างโค้ดก่อนที่จะผสานรวมกับสาขาหลักได้
- ตั้งค่าทริกเกอร์:องค์ประกอบสำคัญของทริกเกอร์นี้คือการใช้พารามิเตอร์
branchNameเพื่อให้ตรงกับmainและพารามิเตอร์invertRegexซึ่งตั้งค่าเป็น "จริง" และเปลี่ยนรูปแบบ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/servicesgcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json - หากต้องการตรวจสอบทริกเกอร์ ให้ไปที่หน้าทริกเกอร์ Cloud Build ในคอนโซลไปที่ทริกเกอร์
- สร้างกิ่งใหม่
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 ใน Consoleไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์แล้ว ให้ทำตามขั้นตอนถัดไป
- เรียกข้อมูลที่อยู่ 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 v1.0
curl http://$BRANCH_IP
6. การทำให้การติดตั้งใช้งานสำหรับกิ่งหลักของ Git เป็นไปโดยอัตโนมัติ
ก่อนที่จะเผยแพร่โค้ดไปยังการใช้งานจริง โดยปกติแล้วจะมีการเผยแพร่โค้ดไปยังการเข้าชมจริงบางส่วนก่อนที่จะย้ายข้อมูลการเข้าชมทั้งหมดไปยังโค้ดเบสใหม่
ในส่วนนี้ คุณจะใช้ทริกเกอร์ที่จะเปิดใช้งานเมื่อมีการคอมมิตโค้ดไปยังกิ่งหลัก ทริกเกอร์จะทําให้การติดตั้งใช้งานแบบคานารีซึ่งรับการรับส่งข้อมูลแบบเรียลไทม์ทั้งหมด 25% ไปยังการแก้ไขใหม่
- ตั้งค่าทริกเกอร์สำหรับกิ่งหลัก
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json - หากต้องการตรวจสอบทริกเกอร์ใหม่ ให้ไปที่หน้าทริกเกอร์ของ Cloud Build ในคอนโซลไปที่ทริกเกอร์
- ผสานสาขาเข้ากับบรรทัดหลักและพุชไปยังที่เก็บระยะไกล
git checkout main git merge new-feature-1 git push gcp main - หากต้องการตรวจสอบบิลด์ที่กำลังดำเนินการ ให้ไปที่หน้าประวัติ Cloud Build ใน Consoleไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์แล้ว ให้ไปยังขั้นตอนถัดไป
- ตรวจสอบการตอบกลับหลายรายการจากเซิร์ฟเวอร์ เรียกใช้คำสั่งต่อไปนี้และสังเกตว่าการตอบกลับประมาณ 25% แสดงการตอบกลับใหม่ของ Hello World v1.1
เมื่อพร้อมดำเนินการต่อ ให้กดwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+cเพื่อออกจากลูป
7. การทำให้การติดตั้งใช้งานสำหรับแท็ก Git เป็นไปโดยอัตโนมัติ
หลังจากตรวจสอบการติดตั้งใช้งาน Canary ด้วยการเข้าชมกลุ่มย่อยแล้ว คุณจะเผยแพร่การติดตั้งใช้งานไปยังการเข้าชมแบบสดที่เหลือ
ในส่วนนี้ คุณจะตั้งค่าทริกเกอร์ที่จะเปิดใช้งานเมื่อสร้างแท็กในที่เก็บ ทริกเกอร์จะติดป้ายกำกับรูปภาพด้วยแท็กที่เหมาะสม จากนั้นจะนำการอัปเดตไปใช้กับสภาพแวดล้อมการใช้งานจริงเพื่อให้มั่นใจว่าการเข้าชม 100% จะเข้าถึงรูปภาพที่ติดแท็ก
- ตั้งค่าทริกเกอร์ของแท็ก
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json - หากต้องการตรวจสอบทริกเกอร์ใหม่ ให้ไปที่หน้าทริกเกอร์ของ Cloud Build ในคอนโซลไปที่ทริกเกอร์
- สร้างแท็กใหม่และพุชไปยังที่เก็บข้อมูลระยะไกล
git tag 1.1 git push gcp 1.1 - หากต้องการตรวจสอบบิลด์ที่กำลังดำเนินการ ให้ไปที่หน้าประวัติ Cloud Build ในคอนโซลไปที่บิลด์
- ตรวจสอบการตอบกลับหลายรายการจากเซิร์ฟเวอร์เรียกใช้คำสั่งต่อไปนี้และสังเกตว่าการตอบกลับ 100% แสดงการตอบกลับใหม่ของ Hello World v1.1 ซึ่งอาจใช้เวลาสักครู่เนื่องจากมีการติดตั้งใช้งานพ็อดใหม่และตรวจสอบสถานะภายใน GKE
เมื่อพร้อมดำเนินการต่อ ให้กดwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+cเพื่อออกจากลูป ขอแสดงความยินดีด้วย คุณสร้างทริกเกอร์ CI/CD ใน Cloud Build สำหรับกิ่งและแท็กเพื่อทำให้แอปใช้งานได้ใน GKE
8. ล้างข้อมูล
ลบโปรเจ็กต์
- ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
- ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์