แทนที่ Kubernetes ด้วย systemd (2024)
(blog.yaakov.online)- ผู้เขียนเล่าประสบการณ์ที่รู้สึกท้อกับความซับซ้อนและการใช้ทรัพยากรที่สูงของ Kubernetes ในการดูแลเซิร์ฟเวอร์ส่วนตัว และได้แทนที่มันด้วยการผสาน systemd และ Podman
- Kubernetes น่าดึงดูดเพราะ GitOps และระบบอัตโนมัติ แต่สำหรับสภาพแวดล้อมขนาดเล็กก็ถือว่าหนักเกินไป
- หากใช้ ฟีเจอร์อัปเดตอัตโนมัติของ Podman และ การสร้างบริการ systemd ก็สามารถทำฟังก์ชันหลักของ Kubernetes แบบเดิมได้อย่างง่ายดาย
- ยังอธิบายการให้บริการระดับผู้ใช้เริ่มทำงานอัตโนมัติด้วยการผสาน systemctl และ loginctl พร้อมย้ำว่าการใช้ทรัพยากรของ VPS ลดลงอย่างมาก
- อย่างไรก็ตาม ยังระบุด้วยว่าการผสาน systemd ของ Podman กำลังจะถูกแทนที่ด้วยแนวทางใหม่ชื่อ "Quadlet" ในเร็ว ๆ นี้
บทนำ: การพบกับ Kubernetes ครั้งแรก
- ผู้เขียนเล่าถึงประสบการณ์ในปี 2018 ที่ลองใช้ Kubernetes และพยายาม สร้างคลัสเตอร์บน NUC ส่วนตัว
- Kubernetes แม้จะซับซ้อน แต่โดยพื้นฐานแล้วทำงานด้วย โครงสร้างลูปแบบวนซ้ำ ดังนี้:
- ตรวจสอบสถานะปัจจุบัน → คำนวณสถานะที่ต้องการ → คำนวณความแตกต่าง → นำไปใช้
- ความสามารถด้านระบบอัตโนมัติผ่านคอมโพเนนต์ต่าง ๆ เช่น cert-manager สร้างความประทับใจอย่างมาก
ความต้องการทรัพยากรที่มากเกินไปของ Kubernetes
- บนเซิร์ฟเวอร์ส่วนตัว (NUC) Kubernetes ทำให้เกิด การใช้ CPU อย่างต่อเนื่อง, เสียงพัดลม, และ ความร้อน
- ดิสทริบิวชันหลายแบบ เช่น Azure, MicroK8s, K3S ก็ยัง ใช้ทรัพยากรไม่น้อย
- MicroK8s: ใช้ CPU 12% (VPS 2vCPU)
- K3S: ใช้ CPU 6% (Ampere A1 2vCPU)
เสน่ห์ยั่วยวนของระบบอัตโนมัติแบบ GitOps
- เครื่องมืออย่าง Flux ทำให้ การทำ deployment อัตโนมัติบนพื้นฐาน Git เป็นไปได้และสะดวกมาก
- เพียง push container image ไปที่ GitHub เซิร์ฟเวอร์ก็จะ deploy แอปเวอร์ชันล่าสุดโดยอัตโนมัติ
- แต่หากไม่มี Kubernetes การทำ ระบบอัตโนมัติแบบนี้ กลับทำได้ยากมาก
การมาถึงของ Podman และ systemd
- Podman เป็นเครื่องมือทางเลือกแทน Docker และมีฟังก์ชัน แปลงคอนเทนเนอร์ให้เป็นบริการ systemd
- สามารถสร้างไฟล์ service ได้อัตโนมัติผ่าน
podman generate systemd - ใช้แท็ก
io.containers.autoupdateเพื่อ อัปเดต image อัตโนมัติวันละครั้ง ได้ - ผู้เขียนอ้างอิงวิธีนี้จาก Fedora Magazine และประสบความสำเร็จในการ สร้างสภาพแวดล้อมแทน Kubernetes
องค์ประกอบที่จำเป็น 3 อย่าง
-
systemctl --user enable mycontainer.service- ตั้งค่าให้คอนเทนเนอร์เริ่มทำงานอัตโนมัติเมื่อเข้าสู่ระบบ
-
loginctl enable-linger- ตั้งค่าให้เซสชันของผู้ใช้ถูกเปิดใช้งานเมื่อเซิร์ฟเวอร์บูต
-
ฟีเจอร์ auto-update ของ Podman
- ด้วยสามสิ่งนี้ ผู้เขียนสามารถ แทนที่ฟังก์ชัน 99% ที่ Kubernetes มอบให้ได้อย่างเรียบง่ายและเบากว่า
ผลลัพธ์ของการย้ายระบบ
- ผู้เขียนย้ายบริการทั้งหมดจาก VPS เดิมไปยัง VPS ใหม่
- ใช้ทรัพยากรเพียงครึ่งเดียวแต่ประสิทธิภาพกลับดีขึ้น, รองรับบริการได้หนาแน่นขึ้น และช่วยลดค่าใช้จ่าย
งานต่อไปในอนาคต: Quadlet
- น่าเสียดายที่การผสาน systemd ของ Podman มีกำหนดจะถูกยกเลิกในเร็ว ๆ นี้
- โดยจะย้ายไปใช้รูปแบบการกำหนดใหม่ที่เรียกว่า ไฟล์ Quadlet แทน
- ผู้เขียนปิดท้ายด้วยการเสริมว่าจำเป็นต้องเตรียมตัวเรียนรู้เทคโนโลยีใหม่นี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
หากมองว่า Kubernetes มีไว้แค่รันและอัปเดตอิมเมจคอนเทนเนอร์ ก็อาจถือว่าใช้งานเกินความจำเป็น
เคยพยายามใช้ Docker เพื่อรันเว็บไซต์ขนาดเล็กไม่กี่แห่ง แต่การอัปเดตอิมเมจและการทดสอบทำได้ยาก
ไม่มีปัญหาในการดูแล Kubernetes cluster แต่สำหรับโปรเจกต์งานอดิเรกใช้งานได้ยากเพราะต้องใช้ทรัพยากรมาก
Systemd แก้ปัญหาได้หลายอย่างและไม่ควรถูกมองข้าม
systemctl editใช้ podman-systemd ดูแล homelab และทุกครั้งที่ลองศึกษารูปแบบ Kubernetes แบบใหม่ก็ไม่พบว่ามีประโยชน์เพิ่มขึ้น
การใช้ Quadlet เพื่อจัดการคอนเทนเนอร์ภายใน systemd คือขั้นต่อไป
สร้าง Skate ขึ้นมาเพื่อสร้างระบบที่รองรับหลายโฮสต์และ Kubernetes manifest
สามารถใช้คำสั่ง Docker compose และ Caddy เพื่อขอใบรับรองอัตโนมัติได้
docker compose up -d --pull alwaysตอนนี้ Systemd มี ParticleOS ซึ่งเป็นดิสทริบิวชันระบบปฏิบัติการที่รองรับอย่างเป็นทางการสำหรับเวิร์กโฟลว์แบบ immutable
มองว่าการ deploy ไปยังเซิร์ฟเวอร์เดี่ยวไม่ควรซับซ้อน จึงเขียนเครื่องมือชื่อ Harbormaster ขึ้นมา