การติดตั้งใช้งานอย่างต่อเนื่องกับ Google Kubernetes Engine (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
    • 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
    
  3. โคลนแหล่งข้อมูลตัวอย่างและเปลี่ยนไปที่ไดเรกทอรีของ Lab โดยใช้คำสั่งต่อไปนี้
    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. หากไม่เคยใช้ Git ใน Cloud Shell มาก่อน ให้ตั้งค่า user.name และ user.email ที่ต้องการใช้
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. จัดเก็บโค้ดจากที่เก็บตัวอย่างใน 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
    
  7. สร้างคลัสเตอร์ GKE
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. ให้สิทธิ์ 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

ในส่วนนี้ คุณจะได้สร้างและติดตั้งใช้งานแอปพลิเคชันเวอร์ชันเริ่มต้นที่ใช้ตลอดบทแนะนำนี้

  1. สร้างแอปพลิเคชันด้วย Cloud Build โดยทำดังนี้
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. ทำให้ใช้งานได้ในสภาพแวดล้อม Canary และการใช้งานจริงด้วยตนเอง:สร้างการทำให้ใช้งานจริงและบริการสำหรับการใช้งานจริงและ Canary โดยใช้คำสั่ง 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
    
    บริการที่ติดตั้งใช้งานที่นี่จะกำหนดเส้นทางการรับส่งข้อมูลไปยังการติดตั้งใช้งานทั้งแบบ Canary และ Prod
  3. ตรวจสอบจำนวนพ็อดที่ทำงานอยู่ ยืนยันว่าคุณมีพ็อด 4 รายการที่ทำงานอยู่สำหรับส่วนหน้า ซึ่งรวมถึง 3 รายการสำหรับการเข้าชมที่ใช้งานจริง และ 1 รายการสำหรับการเปิดตัวแบบคานารี ซึ่งหมายความว่าการเปลี่ยนแปลงในรุ่นคานารีจะมีผลกับผู้ใช้เพียง 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 v1.0
    curl http://$PRODUCTION_IP
    

ยินดีด้วย คุณทำให้แอปตัวอย่างใช้งานได้แล้ว จากนั้นคุณจะตั้งค่าทริกเกอร์เพื่อทำการเปลี่ยนแปลงอย่างต่อเนื่อง

5. การทำให้การติดตั้งใช้งานสำหรับกิ่ง Git เป็นไปโดยอัตโนมัติ

ในส่วนนี้ คุณจะตั้งค่าทริกเกอร์ที่จะเรียกใช้งาน Cloudbuild ในการคอมมิตของสาขาอื่นๆ นอกเหนือจาก main ไฟล์ Cloud Build ที่ใช้ที่นี่จะสร้างเนมสเปซและการติดตั้งใช้งานสำหรับสาขาที่มีอยู่หรือสาขาใหม่โดยอัตโนมัติ ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ดูตัวอย่างโค้ดก่อนที่จะผสานรวมกับสาขาหลักได้

  1. ตั้งค่าทริกเกอร์:องค์ประกอบสำคัญของทริกเกอร์นี้คือการใช้พารามิเตอร์ branchName เพื่อให้ตรงกับ main และพารามิเตอร์ invertRegex ซึ่งตั้งค่าเป็น "จริง" และเปลี่ยนรูปแบบ 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 ในคอนโซลไปที่ทริกเกอร์
  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 ใน Consoleไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์แล้ว ให้ทำตามขั้นตอนถัดไป
  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 v1.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 ในคอนโซลไปที่ทริกเกอร์
  3. ผสานสาขาเข้ากับบรรทัดหลักและพุชไปยังที่เก็บระยะไกล
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. หากต้องการตรวจสอบบิลด์ที่กำลังดำเนินการ ให้ไปที่หน้าประวัติ Cloud Build ใน Consoleไปที่บิลด์เมื่อบิลด์เสร็จสมบูรณ์แล้ว ให้ไปยังขั้นตอนถัดไป
  5. ตรวจสอบการตอบกลับหลายรายการจากเซิร์ฟเวอร์ เรียกใช้คำสั่งต่อไปนี้และสังเกตว่าการตอบกลับประมาณ 25% แสดงการตอบกลับใหม่ของ Hello World v1.1
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    เมื่อพร้อมดำเนินการต่อ ให้กด Ctrl+c เพื่อออกจากลูป

7. การทำให้การติดตั้งใช้งานสำหรับแท็ก Git เป็นไปโดยอัตโนมัติ

หลังจากตรวจสอบการติดตั้งใช้งาน Canary ด้วยการเข้าชมกลุ่มย่อยแล้ว คุณจะเผยแพร่การติดตั้งใช้งานไปยังการเข้าชมแบบสดที่เหลือ

ในส่วนนี้ คุณจะตั้งค่าทริกเกอร์ที่จะเปิดใช้งานเมื่อสร้างแท็กในที่เก็บ ทริกเกอร์จะติดป้ายกำกับรูปภาพด้วยแท็กที่เหมาะสม จากนั้นจะนำการอัปเดตไปใช้กับสภาพแวดล้อมการใช้งานจริงเพื่อให้มั่นใจว่าการเข้าชม 100% จะเข้าถึงรูปภาพที่ติดแท็ก

  1. ตั้งค่าทริกเกอร์ของแท็ก
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. หากต้องการตรวจสอบทริกเกอร์ใหม่ ให้ไปที่หน้าทริกเกอร์ของ Cloud Build ในคอนโซลไปที่ทริกเกอร์
  3. สร้างแท็กใหม่และพุชไปยังที่เก็บข้อมูลระยะไกล
    git tag 1.1
    git push gcp 1.1
    
  4. หากต้องการตรวจสอบบิลด์ที่กำลังดำเนินการ ให้ไปที่หน้าประวัติ Cloud Build ในคอนโซลไปที่บิลด์
  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. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  3. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์