การตรวจสอบ Skaffold เพื่อการพัฒนา Kubernetes

การตรวจสอบ Skaffold เพื่อการพัฒนา Kubernetes

หนึ่งปีครึ่งที่แล้ว ในวันที่ 5 มีนาคม 2018 Google ได้เปิดตัวเวอร์ชันอัลฟ่าแรกของโครงการโอเพ่นซอร์สสำหรับ CI/CD ที่เรียกว่า นั่งร้านซึ่งมีเป้าหมายเพื่อสร้าง "การพัฒนา Kubernetes ที่เรียบง่ายและทำซ้ำได้" เพื่อให้นักพัฒนาสามารถมุ่งเน้นไปที่การพัฒนามากกว่าการดูแลระบบ สิ่งที่น่าสนใจเกี่ยวกับ Skaffold คืออะไร? ปรากฏว่ามีเคล็ดลับเล็กๆ น้อยๆ ที่สามารถทำให้เป็นเครื่องมืออันทรงพลังสำหรับนักพัฒนา และแม้กระทั่งวิศวกรฝ่ายปฏิบัติการด้วยซ้ำ มาทำความรู้จักกับโครงการและความสามารถของโครงการกันดีกว่า

NB: ยังไงก็ตาม เราได้พูดคุยสั้น ๆ เกี่ยวกับ Skaffold โดยทั่วไปของเราแล้ว การตรวจสอบเครื่องมือสำหรับนักพัฒนาซึ่งชีวิตของเขาเชื่อมโยงกับ Kubernetes

ทฤษฎี. วัตถุประสงค์และความสามารถ

โดยทั่วไปแล้ว Skaffold แก้ปัญหาของการทำให้วงจร CI/CD เป็นแบบอัตโนมัติ (ที่ขั้นตอนการสร้าง พุช และปรับใช้) โดยให้ข้อเสนอแนะแก่นักพัฒนาทันที เช่น ความสามารถในการรับผลลัพธ์ของการเปลี่ยนแปลงโค้ดในภายหลังอย่างรวดเร็ว - ในรูปแบบของแอปพลิเคชันที่อัปเดตที่ทำงานในคลัสเตอร์ Kubernetes และสามารถทำงานในวงจรต่างๆ ได้ (การพัฒนา ระยะ การผลิต...) ซึ่ง Skaffold ช่วยอธิบายไปป์ไลน์ที่เกี่ยวข้องสำหรับการเปิดตัว

ซอร์สโค้ดของ Skaffold เขียนด้วยภาษา Go จัดจำหน่ายโดย ภายใต้ Apache License 2.0 (GitHub) ฟรี

มาดูฟังก์ชั่นหลักและฟีเจอร์ต่างๆ กัน ประการแรกประกอบด้วยสิ่งต่อไปนี้:

  • Skaffold มีเครื่องมือสำหรับสร้างไปป์ไลน์ CI/CD
  • ช่วยให้คุณตรวจสอบการเปลี่ยนแปลงในซอร์สโค้ดในเบื้องหลังและเรียกใช้กระบวนการอัตโนมัติในการรวบรวมโค้ดลงในอิมเมจคอนเทนเนอร์ เผยแพร่อิมเมจเหล่านี้ใน Docker Registry และปรับใช้กับคลัสเตอร์ Kubernetes
  • ซิงโครไนซ์ไฟล์ในพื้นที่เก็บข้อมูลกับไดเร็กทอรีการทำงานในคอนเทนเนอร์
  • ทดสอบอัตโนมัติโดยใช้การทดสอบโครงสร้างคอนเทนเนอร์
  • ส่งต่อพอร์ต
  • อ่านบันทึกของแอปพลิเคชันที่ทำงานอยู่ในคอนเทนเนอร์
  • ช่วยในการดีบักแอปพลิเคชันที่เขียนด้วย Java, Node.js, Python, Go

ตอนนี้เกี่ยวกับคุณสมบัติ:

  • Skaffold เองไม่มีส่วนประกอบฝั่งคลัสเตอร์. นั่นคือไม่จำเป็นต้องกำหนดค่า Kubernetes เพิ่มเติมเพื่อใช้ยูทิลิตี้นี้
  • ไปป์ไลน์ต่างๆ สำหรับการใช้งานของคุณ. คุณจำเป็นต้องเผยแพร่โค้ดไปยัง Minikube ในพื้นที่ในขณะที่คุณกำลังพัฒนา จากนั้นจึงเข้าสู่ขั้นตอนหรือการผลิตหรือไม่? เพื่อจุดประสงค์นี้ก็มี โปรไฟล์ และการกำหนดค่าผู้ใช้ ตัวแปรสภาพแวดล้อม และแฟล็ก ซึ่งช่วยให้คุณสามารถอธิบายไปป์ไลน์ต่างๆ สำหรับแอปพลิเคชันเดียวได้
  • CLI. เฉพาะยูทิลิตี้คอนโซลและการกำหนดค่าใน YAML บนอินเทอร์เน็ตคุณสามารถค้นหาการอ้างอิงถึงความพยายามที่จะสร้าง GUI ทดลองอย่างไรก็ตาม ในขณะนี้น่าจะหมายถึงว่ามีคนต้องการเขา แต่ไม่ใช่จริงๆ
  • ความเป็นโมดูล. Skaffold ไม่ใช่เครื่องเก็บเกี่ยวแบบแยกเดี่ยว แต่มุ่งมั่นที่จะใช้แต่ละโมดูลหรือโซลูชันที่มีอยู่สำหรับงานเฉพาะ

ภาพประกอบหลัง:

  • ในขั้นตอนการประกอบคุณสามารถใช้:
    • นักเทียบท่าสร้างในเครื่องในคลัสเตอร์โดยใช้ kaniko หรือใน Google Cloud Build
    • Bazel ในพื้นที่;
    • Jib Maven และ Jib Gradle ภายในเครื่องหรือใน Google Cloud Build
    • สคริปต์บิลด์แบบกำหนดเองทำงานภายในเครื่อง หากคุณต้องการเรียกใช้โซลูชันบิลด์อื่น (ยืดหยุ่นกว่า/คุ้นเคย/...) จะมีการอธิบายไว้ในสคริปต์เพื่อให้ Skaffold เปิดใช้งาน (ตัวอย่างจากเอกสาร). สิ่งนี้ทำให้คุณสามารถใช้ตัวรวบรวมใด ๆ ที่สามารถเรียกได้โดยใช้สคริปต์
  • ในขั้นตอนการทดสอบดังที่กล่าวไปแล้ว การทดสอบโครงสร้างคอนเทนเนอร์;
  • สำหรับการปรับใช้มีสิ่งต่อไปนี้:
    • คิวเบคเทิล;
    • หางเสือ;
    • ปรับแต่ง

ด้วยเหตุนี้ Skaffold จึงเรียกได้ว่ามีเอกลักษณ์เฉพาะตัว กรอบการทำงานสำหรับการสร้าง CI/CD. นี่คือตัวอย่างขั้นตอนการทำงานเมื่อใช้งาน (จากเอกสารประกอบโครงการ):

การตรวจสอบ Skaffold เพื่อการพัฒนา Kubernetes

งานของ Skaffold โดยทั่วไปมีหน้าตาเป็นอย่างไร?

  1. ยูทิลิตี้ตรวจสอบการเปลี่ยนแปลงในไดเร็กทอรีซอร์สโค้ด หากมีการแก้ไขไฟล์ ไฟล์เหล่านั้นจะซิงโครไนซ์กับพ็อดแอปพลิเคชันในคลัสเตอร์ Kubernetes ถ้าเป็นไปได้โดยไม่ต้องสร้างภาพขึ้นมาใหม่ มิฉะนั้นจะประกอบภาพใหม่
  2. อิมเมจที่ประกอบจะถูกตรวจสอบโดยใช้การทดสอบโครงสร้างคอนเทนเนอร์ ติดแท็ก และส่งไปยัง Docker Registry
  3. หลังจากนั้นอิมเมจจะถูกปรับใช้ - ปรับใช้ในคลัสเตอร์ Kubernetes
  4. หากเริ่มต้นการเปิดตัวโดยใช้คำสั่ง skaffold devจากนั้นเราเริ่มรับบันทึกจากแอปพลิเคชัน และ Skaffold รอให้การเปลี่ยนแปลงดำเนินการทั้งหมดอีกครั้ง

การตรวจสอบ Skaffold เพื่อการพัฒนา Kubernetes
ภาพประกอบขั้นตอนหลักของการดำเนินงาน Skaffold

ฝึกฝน. กำลังลองใช้ Skaffold

เพื่อสาธิตการใช้ Skaffold ฉันจะยกตัวอย่างจาก พื้นที่เก็บข้อมูลโครงการ GitHub... อนึ่ง, ที่นั่น คุณจะพบตัวอย่างอื่นๆ อีกมากมายที่คำนึงถึงข้อมูลเฉพาะด้านต่างๆ ฉันจะดำเนินการทั้งหมดภายในเครื่องใน Minikube การติดตั้งทำได้ง่ายและใช้เวลาไม่กี่นาที และคุณจะต้องใช้ kubectl เพื่อเริ่มต้น

ติดตั้ง Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

มาโคลนพื้นที่เก็บข้อมูลของ Skaffold ด้วยตัวอย่างที่จำเป็น:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

ฉันเลือกตัวอย่างที่มีสองพ็อด โดยแต่ละพ็อดมีแอปพลิเคชัน Go ขนาดเล็กหนึ่งแอปพลิเคชัน แอปพลิเคชันหนึ่งคือส่วนหน้า (leeroy-web) ซึ่งเปลี่ยนเส้นทางคำขอไปยังแอปพลิเคชันที่สอง - แบ็กเอนด์ (leeroy-app) มาดูกันว่ามีลักษณะอย่างไร:

~/skaffold/examples/microservices # tree
.
├── leeroy-app
│   ├── app.go
│   ├── Dockerfile
│   └── kubernetes
│       └── deployment.yaml
├── leeroy-web
│   ├── Dockerfile
│   ├── kubernetes
│   │   └── deployment.yaml
│   └── web.go
├── README.adoc
└── skaffold.yaml
 
4 directories, 8 files

leeroy-app และ leeroy-web มีโค้ด Go และ Dockerfiles แบบง่ายสำหรับการสร้างโค้ดนี้ในเครื่อง:

~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
 
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .

ฉันจะไม่ให้รหัสแอปพลิเคชัน - แค่รู้ก็เพียงพอแล้ว leeroy-web ยอมรับคำขอและมอบฉันทะให้พวกเขา leeroy-app. ดังนั้นในไฟล์ Deployment.yaml มีบริการเฉพาะสำหรับ app (สำหรับเส้นทางภายใน) พอร์ตพ็อด web เราจะส่งต่อให้ตัวเราเองเพื่อการเข้าถึงแอปพลิเคชันอย่างรวดเร็ว

ดูเหมือนว่า skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

ขั้นตอนทั้งหมดที่กล่าวมาข้างต้นมีอธิบายไว้ที่นี่ นอกจากการกำหนดค่านี้แล้ว ยังมีไฟล์ที่มีการตั้งค่าส่วนกลางด้วย - ~/.skaffold/config. สามารถแก้ไขได้ด้วยตนเองหรือผ่านทาง CLI - ตัวอย่างเช่น:

skaffold config set --global local-cluster true

คำสั่งนี้จะตั้งค่าตัวแปรโกลบอล local-cluster สู่ความหมาย trueหลังจากนั้น Skaffold จะไม่พยายามส่งอิมเมจไปยังรีจิสตรีระยะไกล หากคุณกำลังพัฒนาแบบโลคัล คุณสามารถใช้คำสั่งนี้เพื่อสร้างอิมเมจแบบโลคัลได้

กลับไปยัง skaffold.yaml:

  • บนเวที build เราระบุว่าคุณต้องรวบรวมและบันทึกรูปภาพในเครื่อง หลังจากที่ build รันเป็นครั้งแรก เราจะเห็นสิ่งต่อไปนี้:
    // т.к. Minikube создает кластер в отдельной виртуальной машине,
    // придется проникнуть внутрь, чтобы найти образы
    # minikube ssh
    $ docker images
    REPOSITORY                                TAG                                                                IMAGE ID            CREATED             SIZE 
    leeroy-app                                7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e   7d55a5080359        4 hours ago         13MB 
    leeroy-app                                v0.37.1-171-g0270a0c-dirty                                         7d55a5080359        4 hours ago         13MB
    leeroy-web                                5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681   5063bfb29d98        5 hours ago         13.1MB
    leeroy-web                                v0.37.1-171-g0270a0c-dirty                                         5063bfb29d98        5 hours ago         13.1MB

    อย่างที่คุณเห็น Skaffold แท็กรูปภาพด้วยตัวเอง อย่างไรก็ตาม มีการรองรับนโยบายการแท็กหลายประการ

  • นอกจากนี้ในการกำหนดค่าจะมีการระบุไว้ context: ./leeroy-app/, เช่น. ระบุบริบทที่รวบรวมรูปภาพ
  • ในขั้นตอนการปรับใช้ มีการพิจารณาว่าเราจะใช้ kubectl และมาสก์สำหรับไฟล์ Manifest ที่จำเป็น
  • PortForward: คล้ายกับที่เรามักจะส่งต่อพอร์ตโดยใช้ kubectl port-forwardเราให้คำแนะนำแก่ Skaffold เพื่อเรียกใช้คำสั่งนี้ ในกรณีนี้ พอร์ตภายในเครื่อง 9000 จะถูกส่งต่อไปยัง 8080 ในการปรับใช้ด้วยชื่อ leeroy-web.

ถึงเวลาเปิดตัวแล้ว skaffold dev: ทีมงานจะสร้าง “กระแสตอบรับ” อย่างต่อเนื่อง เช่น ไม่เพียงแต่จะรวบรวมทุกอย่างและปรับใช้กับคลัสเตอร์เท่านั้น แต่ยังจะแจ้งให้คุณทราบเกี่ยวกับสถานะของพ็อดในขณะนี้ ตรวจสอบการเปลี่ยนแปลง และอัปเดตสถานะของพ็อด

นี่คือผลการเปิดตัว skaffold dev --port-forward เมื่อประกอบกลับเข้าไปใหม่:

การตรวจสอบ Skaffold เพื่อการพัฒนา Kubernetes

ขั้นแรก คุณจะเห็นว่ามีการใช้แคชอยู่ จากนั้น แอปพลิเคชันจะถูกประกอบ ใช้งาน และส่งต่อพอร์ต ตั้งแต่ระบุ --port-forwardสกาโฟลด์ส่งต่อพอร์ตไปที่ webตามที่เขาถูกถามแต่ app เขาโยนตามดุลยพินิจของเขาเอง (เลือกอันฟรีที่ใกล้ที่สุด) หลังจากนี้ เราได้รับบันทึกแรกจากแอปพลิเคชัน

เรามาตรวจสอบว่าใช้งานได้หรือไม่?

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-6998dfcc95-2nxvf   1/1     Running   0          103s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

การปรับเปลี่ยนไฟล์ leeroy-app/app.go - ไม่กี่วินาทีผ่านไป... และ:

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-ffd79d986-l6nwp    1/1     Running   0          11s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

ในเวลาเดียวกัน Skaffold เองก็แสดงสิ่งเดียวกันบนคอนโซลเหมือนเมื่อก่อน ยกเว้นจุดเดียว: มันเปิดตัวออกมาเท่านั้น leeroy-appและไม่ใช่ทั้งหมดในคราวเดียว

ฝึกฝนมากขึ้น

นอกจากนี้ยังควรกล่าวถึงด้วยว่าเมื่อสร้างโปรเจ็กต์ใหม่ คุณสามารถบูตการกำหนดค่าสำหรับ Skaffold ได้โดยใช้คำสั่ง initซึ่งสะดวกมาก นอกจากนี้ คุณยังสามารถเขียนการกำหนดค่าต่างๆ ได้: ดำเนินการพัฒนาการกำหนดค่าเริ่มต้น จากนั้นจึงเริ่มใช้งานไปยังขั้นตอนด้วยคำสั่ง run (กระบวนการเดียวกับ. devเพียงไม่ตรวจสอบการเปลี่ยนแปลง) โดยใช้การกำหนดค่าอื่น

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

กรณีการใช้งานหนึ่งที่เป็นไปได้สำหรับ Skaffold คือการดำเนินการพัฒนาบนคลัสเตอร์ระยะไกล ไม่ใช่ทุกคนที่สะดวกสบายในการใช้งาน Minikube บนฮาร์ดแวร์ของตัวเอง จากนั้นจึงเปิดตัวแอปพลิเคชันและคาดหวังว่ามันจะทำงานได้อย่างเพียงพอ... ในกรณีนี้ Skaffold แก้ปัญหาได้อย่างสมบูรณ์แบบ ซึ่งสามารถยืนยันได้ เช่น โดยวิศวกรของ Reddit ตามที่เรามี พูดคุยกันแล้ว เขียน ในบล็อกของเรา

และใน สิ่งพิมพ์นี้ จาก Weaveworks คุณจะพบตัวอย่างการสร้างไปป์ไลน์สำหรับการผลิต

ข้อสรุป

Skaffold เป็นเครื่องมือที่สะดวกสำหรับการสร้างไปป์ไลน์ที่เกี่ยวข้องกับการเผยแพร่แอปพลิเคชันไปยัง Kubernetes และมุ่งเน้นไปที่ความต้องการในการพัฒนาเป็นหลัก ทำให้เป็นเรื่องง่ายมากที่จะสร้างไปป์ไลน์ "สั้น" ที่คำนึงถึงความต้องการพื้นฐานของนักพัฒนา แต่คุณสามารถจัดระเบียบกระบวนการที่ใหญ่ขึ้นได้หากต้องการ เป็นหนึ่งในตัวอย่างที่ชัดเจนของการใช้ Skaffold ในกระบวนการ CI/CD จะได้รับ เช่น โครงการทดสอบ ของไมโครเซอร์วิส 10 รายการโดยใช้ความสามารถของ Kubernetes, gRPC, Istio และ OpenCensus Tracing

Skaffold มีดาวมากกว่า 8000 ดวงบน GitHub ซึ่งพัฒนาโดย Google และเป็นส่วนหนึ่งของ GoogleContainerเครื่องมือ โดยทั่วไปแล้ว ในขณะนี้ มีเหตุผลทุกประการที่เชื่อได้ว่าโครงการจะพัฒนาอย่างมีความสุขตลอดไป

PS

อ่านเพิ่มเติมในบล็อกของเรา:

ที่มา: will.com

เพิ่มความคิดเห็น