หนึ่งปีครึ่งที่แล้ว ในวันที่ 5 มีนาคม 2018 Google ได้เปิดตัวเวอร์ชันอัลฟ่าแรกของโครงการโอเพ่นซอร์สสำหรับ CI/CD ที่เรียกว่า
NB: ยังไงก็ตาม เราได้พูดคุยสั้น ๆ เกี่ยวกับ Skaffold โดยทั่วไปของเราแล้ว
ทฤษฎี. วัตถุประสงค์และความสามารถ
โดยทั่วไปแล้ว Skaffold แก้ปัญหาของการทำให้วงจร CI/CD เป็นแบบอัตโนมัติ (ที่ขั้นตอนการสร้าง พุช และปรับใช้) โดยให้ข้อเสนอแนะแก่นักพัฒนาทันที เช่น ความสามารถในการรับผลลัพธ์ของการเปลี่ยนแปลงโค้ดในภายหลังอย่างรวดเร็ว - ในรูปแบบของแอปพลิเคชันที่อัปเดตที่ทำงานในคลัสเตอร์ Kubernetes และสามารถทำงานในวงจรต่างๆ ได้ (การพัฒนา ระยะ การผลิต...) ซึ่ง Skaffold ช่วยอธิบายไปป์ไลน์ที่เกี่ยวข้องสำหรับการเปิดตัว
ซอร์สโค้ดของ Skaffold เขียนด้วยภาษา Go
มาดูฟังก์ชั่นหลักและฟีเจอร์ต่างๆ กัน ประการแรกประกอบด้วยสิ่งต่อไปนี้:
- 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 ถ้าเป็นไปได้โดยไม่ต้องสร้างภาพขึ้นมาใหม่ มิฉะนั้นจะประกอบภาพใหม่
- อิมเมจที่ประกอบจะถูกตรวจสอบโดยใช้การทดสอบโครงสร้างคอนเทนเนอร์ ติดแท็ก และส่งไปยัง Docker Registry
- หลังจากนั้นอิมเมจจะถูกปรับใช้ - ปรับใช้ในคลัสเตอร์ Kubernetes
- หากเริ่มต้นการเปิดตัวโดยใช้คำสั่ง
skaffold dev
จากนั้นเราเริ่มรับบันทึกจากแอปพลิเคชัน และ Skaffold รอให้การเปลี่ยนแปลงดำเนินการทั้งหมดอีกครั้ง
ภาพประกอบขั้นตอนหลักของการดำเนินงาน Skaffold
ฝึกฝน. กำลังลองใช้ Skaffold
เพื่อสาธิตการใช้ Skaffold ฉันจะยกตัวอย่างจาก
ติดตั้ง 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
เมื่อประกอบกลับเข้าไปใหม่:
ขั้นแรก คุณจะเห็นว่ามีการใช้แคชอยู่ จากนั้น แอปพลิเคชันจะถูกประกอบ ใช้งาน และส่งต่อพอร์ต ตั้งแต่ระบุ --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
เพียงไม่ตรวจสอบการเปลี่ยนแปลง) โดยใช้การกำหนดค่าอื่น
บนคาตาโคดาก็มี
กรณีการใช้งานหนึ่งที่เป็นไปได้สำหรับ Skaffold คือการดำเนินการพัฒนาบนคลัสเตอร์ระยะไกล ไม่ใช่ทุกคนที่สะดวกสบายในการใช้งาน Minikube บนฮาร์ดแวร์ของตัวเอง จากนั้นจึงเปิดตัวแอปพลิเคชันและคาดหวังว่ามันจะทำงานได้อย่างเพียงพอ... ในกรณีนี้ Skaffold แก้ปัญหาได้อย่างสมบูรณ์แบบ ซึ่งสามารถยืนยันได้ เช่น โดยวิศวกรของ Reddit ตามที่เรามี พูดคุยกันแล้ว
และใน
ข้อสรุป
Skaffold เป็นเครื่องมือที่สะดวกสำหรับการสร้างไปป์ไลน์ที่เกี่ยวข้องกับการเผยแพร่แอปพลิเคชันไปยัง Kubernetes และมุ่งเน้นไปที่ความต้องการในการพัฒนาเป็นหลัก ทำให้เป็นเรื่องง่ายมากที่จะสร้างไปป์ไลน์ "สั้น" ที่คำนึงถึงความต้องการพื้นฐานของนักพัฒนา แต่คุณสามารถจัดระเบียบกระบวนการที่ใหญ่ขึ้นได้หากต้องการ เป็นหนึ่งในตัวอย่างที่ชัดเจนของการใช้ Skaffold ในกระบวนการ CI/CD
Skaffold มีดาวมากกว่า 8000 ดวงบน GitHub ซึ่งพัฒนาโดย Google และเป็นส่วนหนึ่งของ
PS
อ่านเพิ่มเติมในบล็อกของเรา:
- «
เครื่องมือสำหรับนักพัฒนาแอปพลิเคชันที่ทำงานบน Kubernetes "; - «
werf - เครื่องมือของเราสำหรับ CI / CD ใน Kubernetes (รายงานภาพรวมและวิดีโอ) "; - «
Garden v0.10.0: แล็ปท็อปของคุณไม่จำเป็นต้องใช้ Kubernetes "; - «
เคล็ดลับและคำแนะนำของ Kubernetes: เกี่ยวกับการพัฒนาท้องถิ่นและการนำเสนอทางไกล '
ที่มา: will.com