1. บทนำ
ภาพรวม
การแก้ไข Cloud Run ให้คุณระบุการแก้ไขที่ควรได้รับการเข้าชมและเปอร์เซ็นต์การเข้าชมที่จะส่งไปยังการแก้ไขแต่ละรายการ การแก้ไขช่วยให้คุณย้อนกลับไปยังการแก้ไขก่อนหน้า เปิดตัวการแก้ไขทีละน้อย และแยกการเข้าชมระหว่างการแก้ไขหลายรายการได้
Codelab นี้จะแสดงวิธีใช้การแก้ไขเพื่อจัดการการเข้าชมบริการ Cloud Run ดูข้อมูลเพิ่มเติมเกี่ยวกับการแก้ไขได้ในเอกสารประกอบ Cloud Run
สิ่งที่คุณจะได้เรียนรู้
- วิธีแยกการรับส่งข้อมูลระหว่างการแก้ไขอย่างน้อย 2 รายการสำหรับบริการ Cloud Run
- วิธีทยอยเปิดตัวการแก้ไขใหม่
- วิธีเปลี่ยนกลับไปใช้เวอร์ชันก่อนหน้า
2. การตั้งค่าและข้อกําหนด
ข้อกำหนดเบื้องต้น
- คุณเข้าสู่ระบบ Cloud Console แล้ว
- คุณได้ทําให้บริการ Cloud Run ใช้งานได้ก่อนหน้านี้ เช่น คุณสามารถทำตามวิธีทำให้บริการ Cloud Run ใช้งานได้เพื่อเริ่มต้นใช้งาน
ตั้งค่าตัวแปรสภาพแวดล้อม
คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ในโค้ดแล็บนี้
PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo
สร้างที่เก็บ Artifact Registry สำหรับบริการ
gcloud artifacts repositories create $AR_REPO \
--repository-format=docker \
--location=$REGION \
--description="codelab for finetuning using CR jobs" \
--project=$PROJECT_ID
3. การแยกการจราจรของข้อมูล
ตัวอย่างนี้แสดงวิธีสร้างบริการ Cloud Run ที่อ่านตัวแปรสภาพแวดล้อมที่เป็นสีและตอบกลับด้วยชื่อการแก้ไขโดยใช้สีพื้นหลังนั้น
แม้ว่าโค้ดแล็บนี้จะใช้สคริปต์ Python แต่คุณใช้รันไทม์ใดก็ได้
ตั้งค่าตัวแปรสภาพแวดล้อม
คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ในโค้ดแล็บนี้
REGION=<YOUR_REGION> PROJECT_ID=<YOUR-PROJECT-ID> BG_COLOR=darkseagreen SERVICE_NAME=traffic-revisions-color AR_REPO=traffic-revisions-color-repo
สร้างบริการ
ก่อนอื่น ให้สร้างไดเรกทอรีสำหรับซอร์สโค้ดและ cd ไปยังไดเรกทอรีนั้น
mkdir traffic-revisions-codelab && cd $_
จากนั้นสร้างไฟล์ main.py
ที่มีเนื้อหาต่อไปนี้
import os from flask import Flask, render_template_string app = Flask(__name__) TEMPLATE = """ <!doctype html> <html lang="en"> <head> <title>Cloud Run Traffic Revisions</title> <style> body { display: flex; justify-content: center; align-items: center; min-height: 50vh; background-color: {{ bg_color }}; /* Set by environment variable */ font-family: sans-serif; } .content { background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */ padding: 2em; border-radius: 8px; text-align: center; box-shadow: 0 4px 8px rgba(0,0,0,0.1); } </style> </head> <body> <div class="content"> <p>background color: <strong>{{ color_name }}</strong></p> </div> </body> </html> """ @app.route('/') def main(): """Serves the main page with a background color from the ENV.""" # Get the color from the 'BG_COLOR' environment variable. # Default to 'white' if the variable is not set. color = os.environ.get('BG_COLOR', 'white').lower() return render_template_string(TEMPLATE, bg_color=color, color_name=color) if __name__ == '__main__': port = int(os.environ.get('PORT', 8080)) app.run(debug=True, host='0.0.0.0', port=port)
จากนั้นสร้างไฟล์ requirements.txt
ที่มีเนื้อหาต่อไปนี้
Flask>=2.0.0 gunicorn>=20.0.0
สุดท้ายให้สร้าง Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
ENV PYTHONPATH /app
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]
สร้างอิมเมจใน Artifact Registry โดยใช้ Buildpack ด้วย Cloud Build โดยทำดังนี้
gcloud builds submit \
--tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME
และทำให้รุ่นที่ 1 ใช้งานได้ใน Cloud Run ด้วยสี darkseagreen
gcloud run deploy $SERVICE_NAME \
--image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
--region $REGION \
--allow-unauthenticated \
--set-env-vars BG_COLOR=darkseagreen
หากต้องการทดสอบบริการ ให้เปิดอุปกรณ์ปลายทางในเว็บเบราว์เซอร์โดยตรงเพื่อดูสีพื้นหลังเป็นสีเขียวน้ำทะเลเข้ม
ตอนนี้ให้ทําให้การแก้ไขครั้งที่ 2 ใช้งานได้ด้วยสีพื้นหลังสีแทน
# update the env var BG_COLOR=tan gcloud run deploy $SERVICE_NAME \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \ --region $REGION \ --set-env-vars BG_COLOR=tan
ตอนนี้เมื่อรีเฟรชเว็บไซต์ คุณจะเห็นพื้นหลังสีน้ำตาล
แยกการเข้าชม 50:50
หากต้องการแยกการเข้าชมระหว่างเวอร์ชันสีเขียวน้ำทะเลเข้มและสีแทน คุณต้องค้นหารหัสการแก้ไขของบริการ Cloud Run ที่เกี่ยวข้อง คุณดูรหัสการแก้ไขได้โดยเรียกใช้คําสั่งนี้
gcloud run revisions list --service $SERVICE_NAME \ --region $REGION --format 'value(REVISION)'
คุณควรเห็นผลลัพธ์ที่คล้ายกับด้านล่าง
traffic-revisions-color-00003-qoq traffic-revisions-color-00002-zag
คุณสามารถแยกการเข้าชมระหว่างการแก้ไข 2 รายการเป็น 50/50 ได้โดยเรียกใช้คําสั่งต่อไปนี้กับการแก้ไข
gcloud run services update-traffic $SERVICE_NAME \ --region $REGION \ --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50
ทดสอบการแยกการเข้าชม
คุณทดสอบบริการได้โดยรีเฟรชหน้าในเบราว์เซอร์
คุณควรเห็นการแก้ไขสีเขียวน้ำทะเลเข้มครึ่งหนึ่ง และอีกครึ่งหนึ่งจะเห็นการแก้ไขสีแทน นอกจากนี้ คุณจะเห็นชื่อการแก้ไขแสดงอยู่ในเอาต์พุตด้วย เช่น
<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>
4. การทยอยเปิดตัว
ในส่วนนี้ คุณจะได้เรียนรู้วิธีทยอยเปิดตัวการเปลี่ยนแปลงในรุ่นใหม่ของบริการระบบคลาวด์ ดูข้อมูลเพิ่มเติมเกี่ยวกับการทยอยเปิดตัวได้ในเอกสารประกอบ
คุณจะใช้โค้ดเดียวกับส่วนก่อนหน้า แต่จะใช้เป็นบริการ Cloud Run ใหม่
ก่อนอื่น ให้ตั้งค่าสีพื้นหลังเป็น beige
และติดตั้งใช้งานฟังก์ชันที่มีชื่อ gradual-rollouts-colors
หากต้องการทำให้ฟังก์ชัน Cloud Run ใช้งานได้ใน Cloud Run โดยตรง ให้เรียกใช้คําสั่งต่อไปนี้
# update the env var BG_COLOR=beige gcloud beta run deploy gradual-rollouts-colors \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \ --region $REGION \ --allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
สมมติว่าเราต้องการนำการแก้ไขใหม่ที่มีสีพื้นหลังสีลาเวนเดอร์ไปใช้ทีละน้อย
ก่อนอื่น มาตั้งค่าการแก้ไขปัจจุบันเป็นสีเบจเพื่อให้ได้การเข้าชม 100% ซึ่งจะทำให้มั่นใจได้ว่าการแก้ไขในอนาคตจะไม่ได้รับการเข้าชม โดยค่าเริ่มต้น Cloud Run จะกำหนดการเข้าชม 100% ไปยังการแก้ไขที่มี Flag latest
การระบุด้วยตนเองว่าเวอร์ชันเบจเวอร์ชันปัจจุบันนี้ควรได้รับการเข้าชมทั้งหมดจะทำให้เวอร์ชันที่มี Flag latest
ไม่ได้รับการเข้าชม 100% อีกต่อไป โปรดดูเอกสารประกอบ
# get the revision name BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-colors \ --region $REGION --format 'value(REVISION)') # now set 100% traffic to that revision gcloud run services update-traffic gradual-rollouts-colors \ --to-revisions=$BEIGE_REVISION=100 \ --region $REGION
คุณจะเห็นเอาต์พุตที่คล้ายกับ Traffic: 100% radual-rollouts-colors-00001-yox
ตอนนี้คุณจึงสามารถทําให้เวอร์ชันใหม่ใช้งานได้โดยที่ไม่มีการเข้าชม คุณสามารถอัปเดตตัวแปรสภาพแวดล้อม BG_COLOR สำหรับการแก้ไขนี้ได้แทนที่จะเปลี่ยนแปลงโค้ด
หากต้องการทำให้ฟังก์ชัน Cloud Run ใช้งานได้ใน Cloud Run โดยตรง ให้เรียกใช้คําสั่งต่อไปนี้
# update color BG_COLOR=lavender # deploy the function that will not receive any traffic gcloud beta run deploy gradual-rollouts-colors \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \ --region $REGION \ --allow-unauthenticated \ --update-env-vars BG_COLOR=$BG_COLOR
และตอนนี้เมื่อเข้าชมเว็บไซต์ในเบราว์เซอร์ คุณจะเห็นสีเบจ แม้ว่าเวอร์ชันที่ใช้งานล่าสุดจะเป็นสีลาเวนเดอร์
ทดสอบการแก้ไขที่แสดงการเข้าชม 0%
สมมติว่าคุณยืนยันว่าการแก้ไขใช้งานได้สําเร็จและแสดงการเข้าชม 0% แม้ว่าจะผ่านการตรวจสอบประสิทธิภาพการทำงานแล้ว แต่คุณยังคงต้องยืนยันว่าการแก้ไขนี้ใช้พื้นหลังสีลาเวนเดอร์
หากต้องการทดสอบเวอร์ชันสีม่วง ให้ใช้แท็กกับเวอร์ชันนั้น การติดแท็กช่วยให้คุณทดสอบการแก้ไขใหม่ใน URL ที่เฉพาะเจาะจงได้โดยตรงโดยไม่ต้องแสดงการเข้าชม
ก่อนอื่น ให้ดู URL รูปภาพสำหรับการแก้ไขล่าสุด (ซึ่งเป็นสีม่วง)
IMAGE_URL_LAVENDER=$(gcloud run services describe gradual-rollouts-colors --region $REGION --format 'value(IMAGE)')
จากนั้นติดแท็กรูปภาพนั้นด้วยสีที่เกี่ยวข้อง
gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION
คุณจะเห็นเอาต์พุตที่คล้ายกับต่อไปนี้
The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app
เมื่อไปที่ URL การแก้ไขนั้น คุณจะเห็นสีลาเวนเดอร์
การเข้าชมที่เพิ่มขึ้นทีละน้อย
ตอนนี้คุณก็เริ่มส่งการเข้าชมไปยังเวอร์ชันสีม่วงได้แล้ว ตัวอย่างด้านล่างแสดงวิธีส่งการเข้าชม 1% ไปยัง lavender
gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1
หากต้องการส่งการเข้าชม 50% ไปยัง lavender ให้ใช้คําสั่งเดียวกัน แต่ระบุ 50% แทน
gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=50
คุณควรเห็นรายการจำนวนการเข้าชมที่การแก้ไขแต่ละรายการได้รับ
Traffic: 50% gradual-rollouts-colors-00001-hos 50% gradual-rollouts-colors-00004-mum lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app
เมื่อพร้อมที่จะเปิดตัวสีลาเวนเดอร์อย่างเต็มรูปแบบแล้ว ให้ตั้งค่าสีลาเวนเดอร์เป็น 100% เพื่อแทนที่สีเบจ
gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=100
และตอนนี้เมื่อเข้าชมเว็บไซต์ คุณจะเห็นเฉพาะสีลาเวนเดอร์
5. ย้อนกลับ
สมมติว่าความคิดเห็น UX ในช่วงแรกระบุว่าลูกค้าชอบสีเบจมากกว่าสีลาเวนเดอร์ และคุณต้องเปลี่ยนกลับไปใช้สีเบจ
คุณย้อนกลับไปยังเวอร์ชันก่อนหน้า (สีเบจ) ได้โดยเรียกใช้คำสั่งนี้
gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-revisions $BEIGE_REVISION=100
และตอนนี้เมื่อเข้าชมเว็บไซต์ คุณจะเห็นสีเบจเป็นสีพื้นหลัง
ดูข้อมูลเพิ่มเติมเกี่ยวกับการย้อนกลับได้ในเอกสาร
6. ยินดีด้วย
ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์
เราขอแนะนําให้อ่านเอกสารประกอบเกี่ยวกับการเปิดตัว การย้อนกลับ และการย้ายข้อมูลการเข้าชม
สิ่งที่เราได้พูดถึง
- วิธีแยกการรับส่งข้อมูลระหว่างการแก้ไขอย่างน้อย 2 รายการสำหรับบริการ Cloud Run
- วิธีทยอยเปิดตัวการแก้ไขใหม่
- วิธีเปลี่ยนกลับไปใช้เวอร์ชันก่อนหน้า
7. ล้างข้อมูล
หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น หากมีการเรียกใช้ฟังก์ชัน Cloud Run นี้โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในแพ็กเกจฟรี) คุณสามารถลบบริการ Cloud Run หรือลบโปรเจ็กต์ที่สร้างไว้ในขั้นตอนที่ 2
หากต้องการลบบริการ Cloud Run ให้ไปที่ Cloud Run ในคอนโซล Cloud ที่ https://console.cloud.google.com/run/ แล้วลบฟังก์ชันที่คุณสร้างในโค้ดแล็บนี้
หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่ใช้ได้โดยการเรียกใช้ gcloud projects list