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

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

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

ขั้นตอนการติดตั้งใช้งานจะเริ่มต้นโดยไปป์ไลน์ cloudbuild ที่จะสร้างรุ่น Cloud Deploy และทำการทำให้ใช้งานได้ในคลัสเตอร์เวอร์ชันตัวอย่าง หลังจากยืนยันว่าการทําให้ใช้งานได้ในเวอร์ชันตัวอย่างสําเร็จและทํางานตามที่คาดไว้แล้ว คุณจะโปรโมตรุ่นในคลัสเตอร์ Canary ด้วยตนเอง การโปรโมตรุ่นในคลัสเตอร์ prod จะต้องมีการอนุมัติ โดยคุณจะต้องอนุมัติไปป์ไลน์ prod ใน 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 จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ซึ่งมักจะระบุเป็น PROJECT_ID) ดังนั้นหากไม่ชอบรหัสที่สร้างไว้ ให้สร้างรหัสอื่นแบบสุ่ม หรือจะลองสร้างรหัสของคุณเองและดูว่ารหัสนั้นใช้งานได้หรือไม่ก็ได้ จากนั้นระบบจะ "หยุด" ข้อมูลไว้หลังจากสร้างโปรเจ็กต์แล้ว
  • ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ ให้ทําตามวิธีการ "ล้างข้อมูล" ที่แสดงอยู่ท้าย 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

การกําหนดเป้าหมายการทําให้ใช้งานได้ในระบบคลาวด์

  1. สร้างไฟล์ในไดเรกทอรี "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.
  1. สร้างไฟล์ในไดเรกทอรี "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

  1. สร้างไฟล์ในไดเรกทอรีการนําส่งชื่อ 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 จึงจะอนุมัติรุ่นได้

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

  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
  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 ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต

การโปรโมตผลงาน

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

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. กลับไปที่หน้าไปป์ไลน์ sample-app ซึ่งคุณจะเห็นการเผยแพร่ไปยังเวอร์ชันที่ใช้งานจริงที่อยู่ระหว่างดำเนินการ

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

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

  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 ในเทอร์มินัลเพื่อสิ้นสุดการส่งต่อพอร์ต