การเผยแพร่ด้วย Cloud Deploy

1. วัตถุประสงค์

ในบทแนะนำนี้ คุณจะได้สร้างคลัสเตอร์ GKE 3 รายการชื่อ preview, canary และ prod จากนั้นสร้างเป้าหมาย Cloud Deploy ที่สอดคล้องกับแต่ละคลัสเตอร์และไปป์ไลน์ Cloud Deploy ที่จะกำหนดลำดับขั้นตอนในการทำการติดตั้งใช้งานในเป้าหมายเหล่านั้น

เวิร์กโฟลว์การทำให้ใช้งานได้จะทริกเกอร์โดยไปป์ไลน์ Cloud Build ซึ่งจะสร้างรีลีส Cloud Deploy และทำการติดตั้งใช้งานในคลัสเตอร์ตัวอย่าง หลังจากยืนยันว่าการติดตั้งใช้งานในเวอร์ชันตัวอย่างสำเร็จและทำงานได้ตามที่คาดไว้แล้ว คุณจะต้องเลื่อนระดับเวอร์ชันในคลัสเตอร์ Canary ด้วยตนเอง การโปรโมตเวอร์ชันในคลัสเตอร์ที่ใช้งานจริงจะต้องได้รับการอนุมัติ โดยคุณจะอนุมัติไปป์ไลน์ที่ใช้งานจริงใน UI ของ Cloud Deploy แล้วจึงโปรโมต

วัตถุประสงค์ของบทแนะนำนี้แบ่งออกเป็นขั้นตอนต่อไปนี้

  • เตรียมพื้นที่ทำงาน
  • กำหนดเป้าหมาย Cloud Deploy
  • กำหนดไปป์ไลน์ Cloud Deploy
  • สร้างรุ่น
  • เลื่อนระดับการทำให้ใช้งานได้
  • อนุมัติรุ่นสำหรับเวอร์ชันที่ใช้งานจริง

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ โดยเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ และคุณสามารถอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (และโดยทั่วไปจะระบุเป็น PROJECT_ID) ดังนั้นหากไม่ชอบรหัสนี้ ให้สร้างรหัสแบบสุ่มอีกรหัส หรือคุณจะลองใช้รหัสของคุณเองและดูว่ามีรหัสนั้นหรือไม่ก็ได้ จากนั้นจะ "หยุด" หลังจากสร้างโปรเจ็กต์แล้ว
  • นอกจากนี้ยังมีค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดแหล่งข้อมูลเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ให้ทำตามวิธีการ "ล้างข้อมูล" ที่ตอนท้ายของ Codelab ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

2. การตั้งค่าแพลตฟอร์ม

การเตรียมพื้นที่ทำงาน

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

  1. ตั้งค่าเริ่มต้นของ gcloud config

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. โคลนที่เก็บ

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. ตั้งค่าตัวแปรสภาพแวดล้อม

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. เปิดใช้ API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. สร้างคลัสเตอร์ 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

การกำหนดเป้าหมาย Cloud Deploy

  1. สร้างไฟล์ในไดเรกทอรีการทำให้ใช้งานได้ชื่อ preview.yaml ด้วยคำสั่งต่อไปนี้ใน Cloud Shell

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.
  1. สร้างไฟล์ในไดเรกทอรีการทำให้ใช้งานได้ชื่อ canary.yaml ด้วยคำสั่งต่อไปนี้ใน Cloud Shell

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

  1. สร้างไฟล์ในไดเรกทอรีการทำให้ใช้งานได้ชื่อ prod.yaml ด้วยคำสั่งต่อไปนี้ใน Cloud Shell

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 ซึ่งจะไม่อนุญาตให้โปรโมตไปยังเป้าหมาย Prod จนกว่าจะได้รับอนุมัติ คุณต้องมีบทบาท roles/clouddeploy.approver เพื่ออนุมัติรุ่น

  1. สร้างเป้าหมายการทำให้ใช้งานได้
         `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

  1. สร้างไฟล์ในไดเรกทอรีการทำให้ใช้งานได้ชื่อ 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 เมื่อสร้างรุ่น

  1. ใช้ไปป์ไลน์

gcloud beta deploy apply --file deploy/pipeline.yaml

4. ระยะการพัฒนา

เมื่อมีการพัฒนาแอปพลิเคชันแล้ว เครื่องมือ CICD อัตโนมัติจะสร้างและจัดเก็บชิ้นงาน ระบบจะเรียกใช้คำสั่งต่อไปนี้เพื่อสร้างแอปพลิเคชันโดยใช้ Skaffold และจัดเก็บชิ้นงานสำหรับการติดตั้งใช้งานด้วย Cloud Deploy ขั้นตอนนี้จะดำเนินการโดยกระบวนการ CICD สำหรับบิลด์แอปพลิเคชันทุกรายการ

  1. สร้างและจัดเก็บแอปพลิเคชันด้วย 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 ระบบจะเปิดตัวรีลีสดังกล่าวในเป้าหมายแรกซึ่งเป็นเวอร์ชันตัวอย่างโดยอัตโนมัติ

  1. ไปที่ <Cloud Deploy> ใน Google Cloud Console
  2. คลิก "sample-app"

ในหน้าจอนี้ คุณจะเห็นภาพกราฟิกของไปป์ไลน์

  1. ยืนยันว่ามีเส้นขอบสีเขียวที่ด้านซ้ายของช่องแสดงตัวอย่าง ซึ่งหมายความว่าระบบได้นํารุ่นไปใช้ในสภาพแวดล้อมนั้นแล้ว
  2. ดูรายละเอียดเพิ่มเติมเกี่ยวกับผลงานได้โดยคลิกชื่อผลงานในส่วนรายละเอียดผลงานที่ด้านล่างของหน้าจอ (ไม่บังคับ)
  3. ตรวจสอบว่ารุ่นที่เผยแพร่ทำให้แอปพลิเคชันใช้งานได้สำเร็จหรือไม่ โดยเรียกใช้คำสั่งต่อไปนี้ใน 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

  1. คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
  2. เลือก "แสดงตัวอย่างบนพอร์ต 8080"

ซึ่งจะนำคุณไปยังหน้าใหม่ที่แสดงข้อความ "Hello World!"

  1. ใช้ ctrl+c ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต

โปรโมตผลงาน

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

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

ตรวจสอบโปรโมชันการเปิดตัว

  1. ไปที่ไปป์ไลน์ sample-app ในคอนโซล Google Cloud
  2. ยืนยันว่ามีเส้นขอบสีเขียวทางด้านซ้ายของกรอบ Canary ซึ่งหมายความว่ามีการติดตั้งใช้งานรุ่นในสภาพแวดล้อมนั้นแล้ว
  3. ยืนยันว่าแอปพลิเคชันได้รับการติดตั้งใช้งานอย่างถูกต้องโดยสร้างอุโมงค์ไปยังแอปพลิเคชัน

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

  1. คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
  2. เลือก "แสดงตัวอย่างบนพอร์ต 8080"

ซึ่งจะนำคุณไปยังหน้าใหม่ที่แสดงข้อความ "Hello World!"

  1. ใช้ ctrl+c ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต

การอนุมัติรุ่นสำหรับเวอร์ชันที่ใช้งานจริง

โปรดจำไว้ว่าเมื่อเราสร้างเป้าหมาย prod ผ่าน prod.yaml เราได้ระบุแท็ก requireApproval เป็น true ซึ่งจะบังคับให้ต้องได้รับการอนุมัติก่อนจึงจะโปรโมตในสภาพแวดล้อมการผลิตได้

  1. เลื่อนรุ่น Canary เป็นเวอร์ชันที่ใช้งานจริงด้วยคำสั่งต่อไปนี้

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. ไปที่ไปป์ไลน์ sample-app ในคอนโซล Google Cloud
  2. สังเกตตัวบ่งชี้สีเหลืองที่ระบุว่า "1 รายการรอดำเนินการ"

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

  1. คลิกปุ่ม "ตรวจสอบ" ใต้ประกาศสีเหลือง
  2. ในหน้าจอถัดไป ให้คลิก "ตรวจสอบ" อีกครั้งเพื่อเข้าถึงหน้าจอการอนุมัติสำหรับการใช้งานจริง
  3. ตรวจสอบความแตกต่างของไฟล์ Manifest เพื่อตรวจสอบการเปลี่ยนแปลง (ไม่บังคับ) ในกรณีนี้คือไฟล์ใหม่ทั้งหมด
  4. คลิกปุ่ม "อนุมัติ"
  5. กลับไปที่หน้าไปป์ไลน์ของแอปตัวอย่าง ซึ่งคุณจะเห็นว่าการเผยแพร่ไปยังเวอร์ชันที่ใช้งานจริงกำลังดำเนินการอยู่

ตรวจสอบรุ่นสำหรับเวอร์ชันที่ใช้งานจริง

เช่นเดียวกับสภาพแวดล้อมอื่นๆ คุณสามารถตรวจสอบการติดตั้งใช้งานเมื่อเสร็จสมบูรณ์ได้โดยใช้ขั้นตอนด้านล่าง

  1. เรียกใช้คำสั่งต่อไปนี้ใน 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

  1. คลิกไอคอนแสดงตัวอย่างเว็บที่ด้านขวาบนของหน้าจอ
  2. เลือก "แสดงตัวอย่างบนพอร์ต 8080"

ซึ่งจะนำคุณไปยังหน้าใหม่ที่แสดงข้อความ "Hello World!"

  1. ใช้ ctrl+c ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต