ทำความเข้าใจ Skaffold

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

Skaffold เป็นเครื่องมือที่จัดการเวิร์กโฟลว์สำหรับการสร้าง การพุช และการนำแอปพลิเคชันของคุณไปใช้งาน คุณสามารถใช้ Skaffold เพื่อกำหนดค่าพื้นที่ทํางานการพัฒนาในเครื่องได้อย่างง่ายดาย เพิ่มประสิทธิภาพวงจรการพัฒนาภายใน และผสานรวมกับเครื่องมืออื่นๆ เช่น Kustomize และ Helm เพื่อช่วยจัดการไฟล์ Manifest ของ Kubernetes

ในบทแนะนํานี้ คุณจะได้ทําความเข้าใจแนวคิดหลักๆ ของ Skaffold, ใช้ Skaffold เพื่อทําให้ขั้นตอนการพัฒนาภายในเป็นแบบอัตโนมัติ จากนั้นจึงทําให้แอปพลิเคชันใช้งานได้

สิ่งที่จะเกิดขึ้นกับคุณมีดังนี้

  • กำหนดค่าและเปิดใช้ Skaffold สําหรับการพัฒนาในเครื่อง
  • สร้างและเรียกใช้แอปพลิเคชัน golang แบบง่าย
  • จัดการการทำให้แอปพลิเคชันใช้งานได้ในเครื่องด้วย Skaffold
  • แสดงผลไฟล์ Manifest และทำให้แอปพลิเคชันของคุณใช้งานได้

2. ก่อนจะเริ่ม

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

  1. เปิดเครื่องมือแก้ไข Cloud Shell โดยไปที่ URL ต่อไปนี้
https://shell.cloud.google.com

อนุญาตคุกกี้ของบุคคลที่สาม คลิก "เว็บไซต์ไม่ทำงาน" แล้วคลิก "อนุญาตคุกกี้"

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. หากยังไม่ได้ดำเนินการ ให้โคลนแหล่งที่มาของแอปพลิเคชันในหน้าต่างเทอร์มินัลด้วยคำสั่งต่อไปนี้
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. เปลี่ยนเป็นไดเรกทอรีที่เก็บที่โคลน
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. ตั้งค่าเวิร์กスペース Cloud Shell เป็นไดเรกทอรีปัจจุบันโดยเรียกใช้คำสั่งต่อไปนี้
cloudshell workspace .

กำลังเตรียมโปรเจ็กต์ของคุณ

  1. ตรวจสอบว่าได้ตั้งค่าโปรเจ็กต์ Google Cloud อย่างถูกต้องโดยเรียกใช้คําสั่งต่อไปนี้
gcloud config set project {{project-id}}

3. การเริ่มต้นใช้งาน Skaffold

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์การกำหนดค่า Skaffold ระดับบนสุด skaffold.yaml
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. เปิดไฟล์ skaffold.yaml ในแผง IDE นี่คือไฟล์การกำหนดค่าระดับบนสุดที่กำหนดไปป์ไลน์ Skaffold

โปรดสังเกตรูปแบบ YAML ที่คล้ายกับ Kubernetes และส่วนต่อไปนี้ใน YAML

  • build
  • deploy
  • profiles

ส่วนเหล่านี้จะอธิบายถึงวิธีสร้างและติดตั้งใช้งานแอปพลิเคชัน รวมถึงโปรไฟล์สำหรับเป้าหมายการทำให้ใช้งานได้แต่ละรายการ

อ่านข้อมูลเพิ่มเติมเกี่ยวกับรายการขั้นตอนทั้งหมดของ Skaffold ได้ในเอกสารประกอบของ Skaffold Pipeline Stages

4. สร้าง

ส่วน build มีการกำหนดค่าที่ระบุวิธีสร้างแอปพลิเคชัน ในกรณีนี้ คุณจะเห็นการกําหนดค่าสําหรับวิธีจัดการแท็ก git รวมถึงส่วน artifacts ที่กําหนดรูปภาพคอนเทนเนอร์ซึ่งประกอบกันเป็นแอปพลิเคชัน

นอกจากนี้ ในส่วนนี้คุณจะเห็นการอ้างอิงไปยัง Dockerfile ที่จะใช้ในการสร้างรูปภาพด้วย นอกจากนี้ Skaffold ยังรองรับเครื่องมือสร้างอื่นๆ ด้วย เช่น Jib, Maven, Gradle, Buildpacks ที่ดำเนินการบนระบบคลาวด์, Bazel และสคริปต์ที่กำหนดเอง อ่านข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดค่านี้ได้ในเอกสารประกอบเกี่ยวกับการสร้าง Skaffold

5. ทำให้ใช้งานได้

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

เครื่องมือ Kustomize มีฟังก์ชันสำหรับสร้างไฟล์ Manifest ของ Kubernetes ด้วยการรวมชุดไฟล์ YAML ของคอมโพเนนต์ทั่วไป (ในไดเรกทอรี base) เข้ากับ "การวางซ้อน" อย่างน้อย 1 รายการ ซึ่งโดยทั่วไปจะสอดคล้องกับเป้าหมายการทำให้ใช้งานได้อย่างน้อย 1 รายการ ซึ่งโดยทั่วไปคือ dev, test, staging และ production หรือที่คล้ายกัน

ในตัวอย่างนี้ คุณจะเห็นการวางซ้อน 2 รายการสำหรับเป้าหมาย 3 รายการ ได้แก่ dev, staging และ prod ระบบจะใช้การวางซ้อน dev ระหว่างการพัฒนาในเครื่องและการวางซ้อน staging และ prod เมื่อติดตั้งใช้งานโดยใช้ Skaffold

6. โปรไฟล์

ส่วน profiles มีการกำหนดค่าที่กำหนดการกำหนดค่าบิลด์ การทดสอบ และการติดตั้งใช้งานสำหรับบริบทต่างๆ โดยปกติแล้ว บริบทต่างๆ จะเป็นสภาพแวดล้อมที่แตกต่างกันในไปป์ไลน์การติดตั้งใช้งานแอปพลิเคชัน เช่น staging หรือ prod ในตัวอย่างนี้ ซึ่งหมายความว่าคุณสามารถจัดการไฟล์ Manifest ที่เนื้อหาจำเป็นต้องแตกต่างกันสำหรับสภาพแวดล้อมเป้าหมายต่างๆ ได้อย่างง่ายดายโดยไม่ต้องกำหนดค่า Boilerplate ซ้ำ

การกําหนดค่าในส่วน profiles สามารถแทนที่หรือแก้ไขรายการใดๆ จากการกําหนดค่าหลักได้ (เช่น ส่วน build, test หรือ deploy)

ตัวอย่างของกรณีนี้คือการเปิดไฟล์ overlays > prod > deployment.yaml โปรดทราบว่ามีการกําหนดค่าจํานวนการจําลองสําหรับแอปพลิเคชันที่นี่เป็น 3 รายการ ซึ่งลบล้างการกําหนดค่าฐาน

  1. เปิดไฟล์ต่อไปนี้ app > main.go ในแผง IDE นี่คือแอปพลิเคชัน golang ง่ายๆ ที่เขียนสตริงไปยัง stdout ทุกๆ วินาที
  2. โปรดทราบว่าแอปพลิเคชันจะแสดงชื่อพ็อด Kubernetes ที่ใช้งานอยู่ด้วย

การดู Dockerfile

  1. เปิดไฟล์ app > Dockerfile ในแผง IDE ไฟล์นี้มีลําดับคำสั่งในการสร้างอิมเมจคอนเทนเนอร์แอปพลิเคชันสำหรับไฟล์ main.go และมีการอ้างอิงในไฟล์ skaffold.yaml ระดับบนสุด

7. การพัฒนาด้วย Skaffold

การกำหนดค่าสภาพแวดล้อม Kubernetes

  1. เรียกใช้คําสั่งต่อไปนี้เพื่อให้แน่ใจว่าคลัสเตอร์ Kubernetes ในพื้นที่ทํางานและได้รับการกําหนดค่าแล้ว
minikube start

ซึ่งอาจใช้เวลาหลายนาที คุณควรเห็นเอาต์พุตต่อไปนี้หากคลัสเตอร์เริ่มต้นสําเร็จ

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. เรียกใช้คําสั่งต่อไปนี้เพื่อสร้างเนมสเปซ Kubernetes สําหรับ dev, staging และ prod
kubectl apply -f namespaces.yaml

คุณควรจะเห็นผลลัพธ์ต่อไปนี้

namespace/dev created
namespace/staging created
namespace/prod created

การใช้ Skaffold สําหรับการพัฒนาซอฟต์แวร์ในเครื่อง

  1. เรียกใช้คําสั่งต่อไปนี้เพื่อสร้างแอปพลิเคชันและทำให้ใช้งานได้ในคลัสเตอร์ Kubernetes ในเครื่องที่ทำงานใน Cloud Shell
skaffold dev

คุณควรเห็นกระบวนการสร้างคอนเทนเนอร์แอปพลิเคชันทำงาน ซึ่งอาจใช้เวลา 1 นาที จากนั้นจะเห็นเอาต์พุตแอปพลิเคชันซ้ำทุกๆ วินาที

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

โปรดทราบว่าชื่อพ็อดจริงจะแตกต่างจากเอาต์พุตทั่วไปที่ระบุไว้ข้างต้น

การเปลี่ยนแปลงแอปพลิเคชัน

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

  1. เปิดไฟล์ app > main.go ในแผง IDE แล้วเปลี่ยนสตริงเอาต์พุต ดังนี้
"Hello world from pod %s!\n"

ถึง:

"Hello Skaffold world from pod %s!\n"

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

  1. ตอนนี้ในไฟล์ "app > main.go" ในแผง IDE ให้เปลี่ยนบรรทัดต่อไปนี้
time.Sleep(time.Second * 1)

ถึง

time.Sleep(time.Second * 10)

คุณควรเห็นแอปพลิเคชันสร้างขึ้นใหม่และทำให้ใช้งานได้อีกครั้ง โดยบรรทัดเอาต์พุตจะปรากฏขึ้นทุกๆ 10 วินาที

เปลี่ยนแปลงการกำหนดค่า Kubernetes

ต่อไปคุณจะทำการเปลี่ยนแปลงการกําหนดค่า Kubernetes และ Skaffold จะทําการนําไปใช้งานอีกครั้งโดยอัตโนมัติ

  1. เปิดไฟล์ base > deployment.yaml ใน IDE และเปลี่ยนบรรทัดต่อไปนี้
replicas: 1

ถึง

replicas: 2

เมื่อมีการทําให้การทํางานของแอปพลิเคชันอีกครั้ง คุณควรเห็นพ็อด 2 รายการทํางานอยู่ โดยแต่ละพ็อดจะมีชื่อต่างกัน

  1. ตอนนี้ให้เปลี่ยนบรรทัดเดียวกันในไฟล์ base > deployment.yaml กลับเป็น
replicas: 1

คุณควรเห็นพ็อดใดพ็อดหนึ่งถูกนำออกจากบริการเพื่อให้เหลือเพียงพ็อดนั้น

  1. สุดท้าย ให้กด Ctrl-C ในหน้าต่างเทอร์มินัลเพื่อหยุดการพัฒนาในเครื่องของ Skaffold

การตัดรุ่น

ถัดไป คุณจะต้องสร้างรุ่นโดยการสร้างอิมเมจรุ่น และทำให้ใช้งานได้ในคลัสเตอร์

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างรุ่น
skaffold build --file-output artifacts.json

คำสั่งนี้จะสร้างอิมเมจสุดท้าย (หากจำเป็น) และส่งออกรายละเอียดของรุ่นไปยังไฟล์ artifacts.json

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

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อดูเนื้อหาของไฟล์ artifacts.json
cat artifacts.json | jq

โปรดทราบว่าไฟล์มีการอ้างอิงรูปภาพที่จะใช้ในการติดตั้งใช้งานขั้นสุดท้าย

การติดตั้งใช้งานกับการทดลองใช้

  1. เรียกใช้คําสั่งต่อไปนี้เพื่อทําให้รุ่นใช้งานได้โดยใช้โปรไฟล์ staging
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

เมื่อการทําให้ใช้งานได้เสร็จสมบูรณ์แล้ว คุณควรเห็นเอาต์พุตจากพ็อด 2 รายการที่คล้ายกับตัวอย่างต่อไปนี้

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. กด Ctrl-C ในหน้าต่างเทอร์มินัลเพื่อหยุดเอาต์พุตของ Skaffold
  2. เรียกใช้คำสั่งต่อไปนี้เพื่อดูว่าแอปพลิเคชันทำงานอยู่ในคลัสเตอร์
kubectl get all --namespace staging

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

การนำไปใช้กับเวอร์ชันที่ใช้งานจริง

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อทำให้รุ่นใช้งานได้โดยใช้โปรไฟล์ prod
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

เมื่อการทําให้ใช้งานได้เสร็จสมบูรณ์แล้ว คุณควรเห็นเอาต์พุตจากพ็อด 3 รายการที่คล้ายกับตัวอย่างต่อไปนี้

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. กด Ctrl-C ในหน้าต่างเทอร์มินัลเพื่อหยุดเอาต์พุตของ Skaffold

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

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อดูว่าแอปพลิเคชันทำงานอยู่ในคลัสเตอร์
kubectl get all --namespace prod

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

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

คุณควรเห็นพ็อดแอปพลิเคชัน 3 รายการที่ทำงานอยู่ด้วย

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. ยินดีด้วย

ยินดีด้วย คุณได้เสร็จสิ้นห้องทดลอง Understanding Skaffold และได้เรียนรู้วิธีกำหนดค่าและใช้ Skaffold สำหรับการพัฒนาซอฟต์แวร์ในพื้นที่และการติดตั้งใช้งานแอปพลิเคชันแล้ว

ขั้นตอนต่อไปที่ทำได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Skaffold ได้ที่

ล้างข้อมูล

  1. เรียกใช้คําสั่งต่อไปนี้เพื่อปิดคลัสเตอร์ในเครื่อง
minikube delete