1. วัตถุประสงค์
ในบทแนะนํานี้ คุณจะได้สร้างคลัสเตอร์ GKE 3 คลัสเตอร์ชื่อ "เวอร์ชันตัวอย่าง" "แคนนารี" และ "เวอร์ชันที่ใช้งานจริง" จากนั้นสร้างเป้าหมาย Cloud Deploy ที่สอดคล้องกับแต่ละคลัสเตอร์และไปป์ไลน์ Cloud Deploy ที่จะกำหนดลำดับขั้นตอนเพื่อทำการทำให้ใช้งานได้ในเป้าหมายเหล่านั้น
ขั้นตอนการติดตั้งใช้งานจะเริ่มต้นโดยไปป์ไลน์ cloudbuild ที่จะสร้างรุ่น Cloud Deploy และทำการทำให้ใช้งานได้ในคลัสเตอร์เวอร์ชันตัวอย่าง หลังจากยืนยันว่าการทําให้ใช้งานได้ในเวอร์ชันตัวอย่างสําเร็จและทํางานตามที่คาดไว้แล้ว คุณจะโปรโมตรุ่นในคลัสเตอร์ Canary ด้วยตนเอง การโปรโมตรุ่นในคลัสเตอร์ prod จะต้องมีการอนุมัติ โดยคุณจะต้องอนุมัติไปป์ไลน์ prod ใน UI ของ Cloud Deploy แล้วจึงโปรโมต
วัตถุประสงค์ของบทแนะนํานี้แบ่งออกเป็นขั้นตอนต่อไปนี้
- เตรียมพื้นที่ทำงาน
- กำหนดเป้าหมาย Cloud Deploy
- กำหนดไปป์ไลน์ Cloud Deploy
- สร้างรุ่น
- โปรโมตการทำให้ใช้งานได้
- อนุมัติรุ่นสำหรับเวอร์ชันที่ใช้งานจริง
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ และคุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ซึ่งมักจะระบุเป็น
PROJECT_ID
) ดังนั้นหากไม่ชอบรหัสที่สร้างไว้ ให้สร้างรหัสอื่นแบบสุ่ม หรือจะลองสร้างรหัสของคุณเองและดูว่ารหัสนั้นใช้งานได้หรือไม่ก็ได้ จากนั้นระบบจะ "หยุด" ข้อมูลไว้หลังจากสร้างโปรเจ็กต์แล้ว - ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ ให้ทําตามวิธีการ "ล้างข้อมูล" ที่แสดงอยู่ท้าย Codelab ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
2. การตั้งค่าแพลตฟอร์ม
การเตรียมพื้นที่ทำงาน
เราจะตั้งค่าสภาพแวดล้อมที่จำเป็นต่อการเรียกใช้บทแนะนำนี้ เมื่อขั้นตอนนี้เสร็จสมบูรณ์แล้ว เราจะสร้างคลัสเตอร์ GKE ที่ใช้เรียกใช้การนําส่งได้
- ตั้งค่าเริ่มต้นของ gcloud config
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- โคลนที่เก็บ
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- ตั้งค่าตัวแปรสภาพแวดล้อม
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- เปิดใช้ API
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- สร้างคลัสเตอร์ GKE
`gcloud container clusters create preview \`
--zone=us-central1-a --async
`gcloud container clusters create canary \`
--zone=us-central1-b --async
`gcloud container clusters create prod \`
--zone=us-central1-c
การกําหนดเป้าหมายการทําให้ใช้งานได้ในระบบคลาวด์
- สร้างไฟล์ในไดเรกทอรี "deploy" ชื่อ preview.yaml ด้วยคําสั่งต่อไปนี้ใน CloudShell
cat <<EOF >deploy/preview.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: preview
annotations: {}
labels: {}
description: Target for preview environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview
EOF
As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
- สร้างไฟล์ในไดเรกทอรี "deploy" ชื่อ canary.yaml ด้วยคําสั่งต่อไปนี้ใน CloudShell
cat <<EOF >deploy/canary.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: canary
annotations: {}
labels: {}
description: Target for canary environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary
EOF
- สร้างไฟล์ในไดเรกทอรีการนําส่งชื่อ prod.yaml ด้วยคําสั่งต่อไปนี้ใน CloudShell
cat <<EOF >deploy/prod.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
annotations: {}
labels: {}
description: Target for prod environment
requireApproval: true
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod
EOF
โปรดสังเกตแท็ก requireApproval ซึ่งตั้งค่าเป็น true ซึ่งจะไม่อนุญาตให้โปรโมตไปยังเป้าหมายเวอร์ชันที่ใช้งานจริงจนกว่าจะได้รับอนุมัติ คุณต้องมีบทบาท roles/clouddeploy.approver จึงจะอนุมัติรุ่นได้
- สร้างเป้าหมายการทำให้ใช้งานได้
`gcloud config set deploy/region us-central1`
gcloud beta deploy apply --file deploy/preview.yaml
gcloud beta deploy apply --file deploy/canary.yaml
gcloud beta deploy apply --file deploy/prod.yaml
3. การสร้างแอป
โดยทั่วไปแล้ว การสร้างแอปพลิเคชันใหม่จะตั้งค่าไปป์ไลน์ CICD ให้ทำการบิลด์ การทดสอบการผสานรวม และทำให้ใช้งานได้โดยอัตโนมัติ ขั้นตอนต่อไปนี้ถือเป็นส่วนหนึ่งของกระบวนการตั้งค่าสําหรับแอปใหม่ แอปพลิเคชันใหม่แต่ละรายการจะมีการกําหนดค่าไปป์ไลน์การนําส่ง
การกําหนดไปป์ไลน์ Cloud Deploy
- สร้างไฟล์ในไดเรกทอรี "deploy" ชื่อ pipeline.yaml ด้วยคําสั่งต่อไปนี้ใน Cloud Shell
cat <<EOF >>deploy/pipeline.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
name: sample-app
labels:
`app: sample-app`
description: delivery pipeline
serialPipeline:
stages:
- targetId: preview
`profiles:`
`- preview`
- targetId: canary
`profiles:`
`- canary`
- targetId: prod
`profiles:`
`- prod`
EOF
As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.
แท็ก serialPipeline
มีแท็กชื่อ stages ซึ่งเป็นรายการเป้าหมายทั้งหมดที่กำหนดค่าให้ไปใช้งานไปป์ไลน์การนำส่งนี้
targetId
ระบุเป้าหมายที่เฉพาะเจาะจงที่จะใช้สำหรับระยะนี้ของไปป์ไลน์การนำส่ง ค่าคือพร็อพเพอร์ตี้ metadata.name จากคําจํากัดความเป้าหมาย
profiles
คือรายการชื่อโปรไฟล์ Skaffold ตั้งแต่ 0 รายการขึ้นไปจาก skaffold.yaml Cloud Deploy จะใช้โปรไฟล์ที่มีการแสดงผล skaffold เมื่อสร้างรุ่น
- ใช้ไปป์ไลน์
gcloud beta deploy apply --file deploy/pipeline.yaml
4. ระยะการพัฒนา
เมื่อพัฒนาแอปพลิเคชัน เครื่องมือทางเทคนิค CICD แบบอัตโนมัติจะสร้างและจัดเก็บชิ้นงาน ระบบจะเรียกใช้คําสั่งต่อไปนี้เพื่อสร้างแอปพลิเคชันโดยใช้ skaffold และจัดเก็บชิ้นงานสําหรับการทําให้ใช้งานได้ด้วย Cloud Deploy ขั้นตอนนี้จะดำเนินการโดยกระบวนการ CICD สำหรับบิลด์แอปพลิเคชันทุกรายการ
- สร้างและจัดเก็บแอปพลิเคชันด้วย skaffold
skaffold build \
--file-output=artifacts.json \
--default-repo gcr.io/$PROJECT_ID \
--push=true
5. ระยะการเผยแพร่
เมื่อกระบวนการ CICD สิ้นสุดลง ซึ่งโดยปกติแล้วจะเป็นตอนที่ติดแท็กโค้ดสำหรับเวอร์ชันที่ใช้งานจริง คุณจะเริ่มกระบวนการเผยแพร่โดยเรียกใช้คำสั่ง cloud deploy release
หลังจากนั้นเมื่อการติดตั้งใช้งานได้รับการตรวจสอบและอนุมัติแล้ว คุณจะย้ายรุ่นไปยังสภาพแวดล้อมเป้าหมายต่างๆ ได้โดยโปรโมตและอนุมัติการดำเนินการผ่านกระบวนการอัตโนมัติหรือการอนุมัติด้วยตนเอง
การสร้างรุ่น
เราได้สร้างไฟล์ Cloud Deploy ในบทแนะนํานี้ก่อนหน้านี้เพื่อให้ทราบวิธีทํางานของ Cloud Deploy เพื่อการสาธิต เราได้สร้างไฟล์ Cloud Deploy เดียวกันและพุชไปยังที่เก็บ GitHub ที่มีตัวอย่างแอปพลิเคชัน Go และจะใช้ Cloud Deploy เพื่อเผยแพร่แอปพลิเคชันดังกล่าว
export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
gcloud beta deploy releases create \
sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--description="Release demo" \
--build-artifacts=artifacts.json \
--annotations="release-id=rel-${REL_TIMESTAMP}"
ตรวจสอบรุ่น
เมื่อสร้างรุ่น Cloud Deploy แล้ว ระบบจะเปิดตัวรุ่นดังกล่าวในเป้าหมายแรกซึ่งเป็นเวอร์ชันตัวอย่างโดยอัตโนมัติ
- ไปที่ <Cloud Deploy> ในคอนโซล Google Cloud
- คลิก "sample-app"
ในหน้าจอนี้ คุณจะเห็นภาพกราฟิกของไปป์ไลน์
- ยืนยันเส้นขอบสีเขียวทางด้านซ้ายของช่องแสดงตัวอย่าง ซึ่งหมายความว่ามีการทําให้รุ่นใช้งานได้ในสภาพแวดล้อมนั้นแล้ว
- ตรวจสอบรายละเอียดเพิ่มเติมเกี่ยวกับรุ่น (ไม่บังคับ) โดยคลิกชื่อรุ่นในส่วน "รายละเอียดรุ่น" ที่ด้านล่างของหน้าจอ
- ตรวจสอบว่ารุ่นทำให้แอปพลิเคชันใช้งานได้สําเร็จ โดยเรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell
gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
- เลือก "แสดงตัวอย่างบนพอร์ต 8080"
ซึ่งจะนำคุณไปยังหน้าใหม่ที่มีข้อความว่า "Hello World"
- ใช้
ctrl+c
ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต
การโปรโมตผลงาน
เมื่อเผยแพร่รุ่นไปยังเป้าหมายแรก (เวอร์ชันตัวอย่าง) ในไปป์ไลน์แล้ว คุณสามารถโปรโมตรุ่นไปยังเป้าหมายถัดไป (Canary) ได้ เรียกใช้คําสั่งต่อไปนี้เพื่อเริ่มกระบวนการ
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
ตรวจสอบโปรโมชันการเผยแพร่
- ไปที่ไปป์ไลน์ sample-app ในคอนโซล Google Cloud
- ตรวจสอบเส้นขอบสีเขียวทางด้านซ้ายของช่อง Canary ซึ่งหมายความว่ามีการทําให้รุ่นใช้งานได้ในสภาพแวดล้อมนั้น
- ยืนยันว่ามีการทําให้แอปพลิเคชันใช้งานได้อย่างถูกต้องโดยการสร้างอุโมงค์ไปยังแอปพลิเคชัน
gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
- เลือก "แสดงตัวอย่างบนพอร์ต 8080"
ซึ่งจะนำคุณไปยังหน้าใหม่ที่มีข้อความว่า "Hello World"
- ใช้
ctrl+c
ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต
การอนุมัติรุ่นสำหรับเวอร์ชันที่ใช้งานจริง
โปรดทราบว่าเมื่อเราสร้างเป้าหมาย prod ผ่าน prod.yaml เราได้ระบุแท็ก requireApproval เป็น true ซึ่งจะบังคับให้ต้องได้รับการอนุมัติเพื่อโปรโมตในเวอร์ชันที่ใช้งานจริง
- โปรโมตรุ่น Canary ไปยังเวอร์ชันที่ใช้งานจริงด้วยคําสั่งต่อไปนี้
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- ไปที่ไปป์ไลน์ sample-app ในคอนโซล Google Cloud
- สังเกตที่ไฟบอกสถานะสีเหลืองที่ระบุว่า "รอดำเนินการ 1 รายการ"
ข้อความนี้ระบุว่ามีรุ่นที่รอคิวเพื่อนำไปใช้งานจริง แต่ต้องผ่านการตรวจสอบและอนุมัติ
- คลิกปุ่ม "ตรวจสอบ" ใต้การแจ้งเตือนสีเหลือง
- ในหน้าจอถัดไป ให้คลิก "ตรวจสอบ" อีกครั้งเพื่อเข้าถึงหน้าจอการอนุมัติสำหรับเวอร์ชันที่ใช้งานจริง
- ตรวจสอบความแตกต่างของไฟล์ Manifest (ไม่บังคับ) เพื่อตรวจสอบการเปลี่ยนแปลง ในกรณีนี้ ให้เลือกไฟล์ใหม่ทั้งหมด
- คลิกปุ่ม "อนุมัติ"
- กลับไปที่หน้าไปป์ไลน์ sample-app ซึ่งคุณจะเห็นการเผยแพร่ไปยังเวอร์ชันที่ใช้งานจริงที่อยู่ระหว่างดำเนินการ
ตรวจสอบรุ่นสำหรับเวอร์ชันที่ใช้งานจริง
คุณสามารถตรวจสอบการติดตั้งใช้งานเมื่อเสร็จสมบูรณ์แล้วโดยทำตามขั้นตอนด้านล่างเช่นเดียวกับในสภาพแวดล้อมอื่นๆ
- เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อสร้างการส่งต่อพอร์ต
gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
- เลือก "แสดงตัวอย่างบนพอร์ต 8080"
ซึ่งจะนำคุณไปยังหน้าใหม่ที่มีข้อความว่า "Hello World"
- ใช้
ctrl+c
ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต