2 คะแนน โดย GN⁺ 2025-05-06 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้เขียนเล่าประสบการณ์ที่รู้สึกท้อกับความซับซ้อนและการใช้ทรัพยากรที่สูงของ 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 อย่าง

  1. systemctl --user enable mycontainer.service

    • ตั้งค่าให้คอนเทนเนอร์เริ่มทำงานอัตโนมัติเมื่อเข้าสู่ระบบ
  2. loginctl enable-linger

    • ตั้งค่าให้เซสชันของผู้ใช้ถูกเปิดใช้งานเมื่อเซิร์ฟเวอร์บูต
  3. ฟีเจอร์ auto-update ของ Podman

  • ด้วยสามสิ่งนี้ ผู้เขียนสามารถ แทนที่ฟังก์ชัน 99% ที่ Kubernetes มอบให้ได้อย่างเรียบง่ายและเบากว่า

ผลลัพธ์ของการย้ายระบบ

  • ผู้เขียนย้ายบริการทั้งหมดจาก VPS เดิมไปยัง VPS ใหม่
  • ใช้ทรัพยากรเพียงครึ่งเดียวแต่ประสิทธิภาพกลับดีขึ้น, รองรับบริการได้หนาแน่นขึ้น และช่วยลดค่าใช้จ่าย

งานต่อไปในอนาคต: Quadlet

  • น่าเสียดายที่การผสาน systemd ของ Podman มีกำหนดจะถูกยกเลิกในเร็ว ๆ นี้
  • โดยจะย้ายไปใช้รูปแบบการกำหนดใหม่ที่เรียกว่า ไฟล์ Quadlet แทน
  • ผู้เขียนปิดท้ายด้วยการเสริมว่าจำเป็นต้องเตรียมตัวเรียนรู้เทคโนโลยีใหม่นี้

1 ความคิดเห็น

 
GN⁺ 2025-05-06
ความคิดเห็นจาก Hacker News
  • หากมองว่า Kubernetes มีไว้แค่รันและอัปเดตอิมเมจคอนเทนเนอร์ ก็อาจถือว่าใช้งานเกินความจำเป็น

    • Kubernetes จัดเตรียมทรัพยากรที่จำเป็นเพื่อให้คอนเทนเนอร์แชร์สถานะ เชื่อมต่อถึงกัน และเข้าถึงการตั้งค่าหรือข้อมูลลับได้
    • ต้นทุนด้าน CPU และหน่วยความจำเกิดจากการจัดการคอนเทนเนอร์และการจัดเตรียมทรัพยากรที่จำเป็น
    • ในระบบกระจายศูนย์ ทุกระบบไม่ได้ทำงานตามที่ต้องการเสมอไป ดังนั้นตัวควบคุมจึงพยายามทำให้บรรลุสถานะที่ต้องการอย่างต่อเนื่อง
  • เคยพยายามใช้ Docker เพื่อรันเว็บไซต์ขนาดเล็กไม่กี่แห่ง แต่การอัปเดตอิมเมจและการทดสอบทำได้ยาก

    • จึงแทนที่ทุกอย่างด้วยสคริปต์ที่สร้าง systemd unit บน Debian และรีสตาร์ตเมื่อมีการเปลี่ยนแปลงบริการ
    • ใช้ VM สำหรับทดสอบเพื่อ rsync การเปลี่ยนแปลงไปยังโฮสต์ที่ใช้ deploy แล้วรันสคริปต์ deploy
    • ทั้งระบบรันอยู่บน VPS 2GB และหาก Wordpress รองรับ SQLite อย่างเป็นทางการ ก็อาจลดเหลือ 1GB ได้
    • ใช้ Mariadb เพื่อลดความต้องการด้านการซัพพอร์ตให้น้อยที่สุด
  • ไม่มีปัญหาในการดูแล Kubernetes cluster แต่สำหรับโปรเจกต์งานอดิเรกใช้งานได้ยากเพราะต้องใช้ทรัพยากรมาก

    • Kubernetes ใช้ทรัพยากรมากเกินไปสำหรับการรันบน VPS ราคา $10/เดือน
    • ใช้คำสั่ง docker compose แบบแมนนวล และใช้ฟีเจอร์ค้นหาคอนเทนเนอร์ของ Traefik แทน Ingress
    • เขียนสคริปต์เล็ก ๆ เพื่อจัดการ crontab แทน CronJobs
    • กำลังพยายามแก้ปัญหาที่ Kubernetes แก้ไว้แล้วด้วยวิธีที่มีประสิทธิภาพน้อยกว่า
    • อยากได้ทางเลือกน้ำหนักเบาที่ให้ API แบบเข้ากันได้กับ Kubernetes และทำงานได้ดีบน VPS ราคาถูก
  • Systemd แก้ปัญหาได้หลายอย่างและไม่ควรถูกมองข้าม

    • มีฟีเจอร์หลากหลาย เช่น machinectl, nspawn, vmspawn, importctl
    • homed/homectl ใช้ขยายการจัดการผู้ใช้, mounts ใช้เมานต์ไดรฟ์อัตโนมัติ, boot ใช้ควบคุมการเริ่ม/หยุดบริการ, timers ใช้แทน cron
    • service unit ใช้ควบคุมงาน และสามารถแก้ไขไฟล์คอนฟิกได้ด้วย systemctl edit
  • ใช้ podman-systemd ดูแล homelab และทุกครั้งที่ลองศึกษารูปแบบ Kubernetes แบบใหม่ก็ไม่พบว่ามีประโยชน์เพิ่มขึ้น

    • ใช้ Ansible playbook เพื่อดึงอิมเมจล่วงหน้าและวางไฟล์ unit ไว้ในตำแหน่งที่เหมาะสม
    • รันสแตกเครื่องพิมพ์ 3D Voron ด้วย podman-systemd และกำลังพิจารณาย้ายไปใช้ mkosi กับ systemd-sysupdate
    • มีความยุ่งยากตรงที่ต้องแปลงไฟล์ Docker-compose ให้เป็น systemd unit
    • Podman ช่วยลดความซับซ้อนของการตั้งค่าผู้ใช้/สิทธิ์
  • การใช้ Quadlet เพื่อจัดการคอนเทนเนอร์ภายใน systemd คือขั้นต่อไป

    • รายละเอียดเพิ่มเติมดูได้จากบล็อกของ Red Hat
  • สร้าง Skate ขึ้นมาเพื่อสร้างระบบที่รองรับหลายโฮสต์และ Kubernetes manifest

    • ภายในใช้ podman และ systemd
  • สามารถใช้คำสั่ง Docker compose และ Caddy เพื่อขอใบรับรองอัตโนมัติได้

    • ตั้งค่าได้ง่าย ๆ ด้วยคำสั่ง docker compose up -d --pull always
    • การตั้งค่า CI ใช้ scp และ ssh
    • เรียบง่ายและใช้ได้บนเครื่องพัฒนาด้วย
  • ตอนนี้ Systemd มี ParticleOS ซึ่งเป็นดิสทริบิวชันระบบปฏิบัติการที่รองรับอย่างเป็นทางการสำหรับเวิร์กโฟลว์แบบ immutable

  • มองว่าการ deploy ไปยังเซิร์ฟเวอร์เดี่ยวไม่ควรซับซ้อน จึงเขียนเครื่องมือชื่อ Harbormaster ขึ้นมา

    • ใช้ไฟล์ YAML เพื่อค้นหารีโพซิทอรีและรันไฟล์ Docker Compose
    • เก็บสถานะทั้งหมดไว้ในไดเรกทอรีเดียว ทำให้สำรองข้อมูลง่าย
    • เป็นเครื่องมือ orchestration คอนเทนเนอร์ที่ง่ายที่สุดเท่าที่จำเป็นสำหรับเซิร์ฟเวอร์เดี่ยว