1. ภาพรวม
ในห้องทดลองนี้ คุณจะได้เรียนรู้วิธีตั้งค่าไปป์ไลน์การนำส่งอย่างต่อเนื่องสำหรับ GKE ด้วย Cloud Build ห้องทดลองนี้ไฮไลต์วิธีทริกเกอร์งาน Cloud Build สำหรับเหตุการณ์ Git ต่างๆ รวมถึงรูปแบบง่ายๆ สำหรับรุ่น Canary อัตโนมัติใน 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%.*}; 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"
- จัดเก็บโค้ดจากที่เก็บตัวอย่างใน 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 และเวอร์ชันที่ใช้งานจริง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
- ตรวจสอบจำนวนพ็อดที่กำลังทำงานอยู่ ยืนยันว่าคุณมีพ็อด 4 รายการที่กำลังทำงานสำหรับฟรอนท์เอนด์ โดยมี 3 พ็อดสำหรับการเข้าชมจริง และอีก 1 พ็อดสำหรับการเผยแพร่แบบ Canary ซึ่งหมายความว่าการเปลี่ยนแปลงรุ่น Canary จะส่งผลต่อผู้ใช้เพียง 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 บนคอมมิตของ Branch อื่นที่ไม่ใช่ main
ไฟล์ Cloud Build ที่ใช้ที่นี่จะสร้างเนมสเปซและการทำให้ใช้งานได้โดยอัตโนมัติสำหรับ Branch ที่มีอยู่หรือ Branch ใหม่ ซึ่งช่วยให้นักพัฒนาแอปสามารถดูตัวอย่างโค้ดได้ก่อนที่จะผสานรวมกับ Branch หลัก
- ตั้งค่าทริกเกอร์:คอมโพเนนต์หลักของทริกเกอร์นี้คือการใช้พารามิเตอร์
branchName
เพื่อจับคู่main
และพารามิเตอร์invertRegex
ซึ่งตั้งค่าเป็น "จริง" และปรับเปลี่ยนรูปแบบbranchName
ให้จับคู่กับอะไรก็ได้ที่ไม่ใช่main
โปรดดูบรรทัดต่อไปนี้ในbuild/branch-trigger.json
เพื่อเป็นข้อมูลอ้างอิง"branchName": "main", "invertRegex": true
นอกจากนี้ 2-3 บรรทัดสุดท้ายของไฟล์ Cloud Build ที่ใช้กับทริกเกอร์นี้ ให้สร้างเนมสเปซที่ตั้งชื่อตาม Branch ที่ทริกเกอร์งาน จากนั้นทำให้แอปพลิเคชันและบริการใช้งานได้ภายในเนมสเปซใหม่ โปรดดูบรรทัดต่อไปนี้ใน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
- หากต้องการตรวจสอบทริกเกอร์ ให้ไปที่หน้าทริกเกอร์ Cloud Build ในคอนโซลไปที่ทริกเกอร์
- สร้าง Branch ใหม่:
git checkout -b new-feature-1
- แก้ไขโค้ดเพื่อระบุ v1.1 แก้ไข
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 ในคอนโซลไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์ ให้ไปยังขั้นตอนถัดไป
- เรียกข้อมูลที่อยู่ 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
ก่อนที่โค้ดจะเผยแพร่สู่เวอร์ชันที่ใช้งานจริง เป็นเรื่องปกติที่จะเผยแพร่โค้ดไปยังส่วนย่อยของการเข้าชมที่เผยแพร่อยู่ขนาดเล็ก ก่อนที่จะย้ายการเข้าชมทั้งหมดไปยังฐานของโค้ดใหม่
ในส่วนนี้ คุณจะได้ใช้ทริกเกอร์ที่เปิดใช้งานเมื่อมีการคอมมิตโค้ดกับ Branch หลัก ทริกเกอร์นี้ทำให้การติดตั้งใช้งาน Canary ได้รับการรับส่งข้อมูลแบบสด 25% ทั้งหมดไปยังการแก้ไขใหม่
- ตั้งค่าทริกเกอร์สำหรับ Branch หลัก ดังนี้
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json
- หากต้องการตรวจสอบทริกเกอร์ใหม่ ให้ไปที่หน้าทริกเกอร์ Cloud Build ในคอนโซลไปที่ทริกเกอร์
- ผสาน Branch ไปยังบรรทัดหลักและพุชไปยังที่เก็บระยะไกล:
git checkout main git merge new-feature-1 git push gcp main
- หากต้องการตรวจสอบบิลด์ที่กำลังดำเนินการ ให้ไปที่หน้าประวัติ Cloud Build ในคอนโซลไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์ ให้ไปยังขั้นตอนถัดไป
- ตรวจสอบการตอบกลับหลายรายการจากเซิร์ฟเวอร์ เรียกใช้คำสั่งต่อไปนี้ และโปรดทราบว่าประมาณ 25% ของการตอบกลับจะแสดงการตอบกลับใหม่ของ Hello World v1.1
เมื่อพร้อมดำเนินการต่อแล้ว ให้กดwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+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 ในคอนโซลไปที่บิลด์
- ตรวจสอบการตอบกลับหลายรายการจาก Server เรียกใช้คำสั่งต่อไปนี้และโปรดทราบว่าการตอบกลับทั้ง 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 ให้ไปที่หน้าจัดการทรัพยากร
- ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเครื่องเพื่อลบโปรเจ็กต์