2 điểm bởi GN⁺ 2025-05-06 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tác giả chia sẻ trải nghiệm thất vọng với độ phức tạp và mức tiêu tốn tài nguyên của Kubernetes khi vận hành máy chủ cá nhân, và đã thay thế bằng tổ hợp systemd và Podman
  • Kubernetes hấp dẫn nhờ GitOps và tự động hóa, nhưng trong môi trường quy mô nhỏ thì lại là một hệ thống quá nặng
  • Tận dụng tính năng tự động cập nhật của Podmankhả năng tạo service systemd có thể triển khai đơn giản các chức năng cốt lõi vốn có của Kubernetes
  • Bài viết cũng giải thích tự động chạy service ở cấp người dùng bằng cách kết hợp systemctl và loginctl, đồng thời nhấn mạnh rằng mức tiêu thụ tài nguyên trên VPS đã giảm mạnh
  • Tuy vậy, bài viết cũng đề cập rằng tích hợp systemd của Podman sắp được thay thế bằng một cách làm mới có tên "Quadlet"

Mở đầu: Lần đầu gặp Kubernetes

  • Tác giả giới thiệu trải nghiệm thử nghiệm Kubernetes vào năm 2018, khi cố gắng dựng một cụm trên NUC cá nhân
  • Kubernetes phức tạp, nhưng về cơ bản hoạt động theo một cấu trúc vòng lặp lặp lại như sau:
    • Xác định trạng thái hiện tại → tính toán trạng thái mong muốn → tính toán khác biệt → áp dụng
  • Các tính năng tự động hóa dùng nhiều thành phần như cert-manager đã để lại ấn tượng rất mạnh

Yêu cầu tài nguyên quá mức của Kubernetes

  • Trên máy chủ cá nhân (NUC), Kubernetes gây ra mức sử dụng CPU liên tục, tiếng ồn quạtnhiệt lượng tăng cao
  • Nhiều bản phân phối khác nhau như Azure, MicroK8s, K3S cũng tiêu tốn tài nguyên đáng kể
    • MicroK8s: dùng 12% CPU (VPS 2vCPU)
    • K3S: dùng 6% CPU (Ampere A1 2vCPU)

Sự cám dỗ của tự động hóa GitOps

  • Với các công cụ như Flux, việc tự động hóa triển khai dựa trên Git trở nên rất thuận tiện
  • Chỉ cần push image container lên GitHub, máy chủ sẽ tự động triển khai phiên bản ứng dụng mới nhất
  • Tuy nhiên, nếu không có Kubernetes thì việc triển khai kiểu tự động hóa như vậy là rất khó

Sự xuất hiện của Podman và systemd

  • Podman là công cụ thay thế Docker và có chức năng chuyển container thành service systemd
  • Có thể tự động tạo file service thông qua podman generate systemd
  • Có thể tự động cập nhật image mỗi ngày một lần thông qua thẻ io.containers.autoupdate
  • Tham khảo phương pháp này từ Fedora Magazine, tác giả đã thành công trong việc xây dựng một môi trường thay thế Kubernetes

Ba thành phần cần thiết

  1. systemctl --user enable mycontainer.service

    • Thiết lập để container tự động chạy khi đăng nhập
  2. loginctl enable-linger

    • Thiết lập để phiên người dùng được kích hoạt khi máy chủ khởi động
  3. Tính năng auto-update của Podman

  • Chỉ với ba thành phần này, tác giả có thể thay thế 99% chức năng mà Kubernetes cung cấp bằng một giải pháp đơn giản và nhẹ hơn

Kết quả di chuyển

  • Tác giả đã di chuyển toàn bộ dịch vụ từ VPS cũ sang VPS mới
  • Tài nguyên giảm còn một nửa nhưng hiệu năng lại tốt hơn, mật độ dịch vụ tăng lên và chi phí cũng giảm

Việc cần làm tiếp theo: Quadlet

  • Đáng tiếc là tích hợp systemd của Podman sắp bị loại bỏ
  • Thay vào đó, nó sẽ chuyển sang một cách định nghĩa mới là file Quadlet
  • Bài viết kết lại bằng lưu ý rằng cần chuẩn bị để học công nghệ mới này

1 bình luận

 
GN⁺ 2025-05-06
Ý kiến trên Hacker News
  • Nếu chỉ xem Kubernetes như công cụ để chạy và cập nhật image container, thì đó có thể là dùng quá mức cần thiết

    • Kubernetes cung cấp các tài nguyên cần thiết để container có thể chia sẻ trạng thái, kết nối với nhau và truy cập cấu hình hoặc secret
    • Chi phí CPU và bộ nhớ phát sinh từ việc quản lý container và cung cấp các tài nguyên cần thiết
    • Trong hệ thống phân tán, không phải mọi hệ thống đều vận hành theo cách mong muốn, vì vậy bộ điều khiển liên tục cố gắng đưa chúng về trạng thái mong muốn
  • Đã từng thử vận hành vài website nhỏ bằng Docker, nhưng việc cập nhật image và kiểm thử khá khó khăn

    • Thay toàn bộ bằng một script tạo unit systemd trên Debian và khởi động lại khi dịch vụ thay đổi
    • Dùng VM kiểm thử để rsync thay đổi sang host triển khai rồi chạy script triển khai
    • Toàn bộ hệ thống chạy trên VPS 2GB, và nếu Wordpress chính thức hỗ trợ SQLite thì có thể giảm xuống 1GB
    • Dùng Mariadb để tối thiểu hóa yêu cầu hỗ trợ
  • Không có vấn đề gì với việc quản lý cụm Kubernetes, nhưng với các dự án cá nhân thì khó dùng vì yêu cầu tài nguyên

    • Kubernetes ngốn quá nhiều tài nguyên để chạy trên VPS $10/tháng
    • Dùng thủ công các lệnh docker compose, và dùng tính năng khám phá container của Traefik thay cho Ingress
    • Viết các script nhỏ để quản lý crontab thay cho CronJobs
    • Đang cố giải quyết kém hiệu quả hơn những vấn đề mà Kubernetes đã giải quyết sẵn
    • Muốn có một giải pháp thay thế nhẹ hơn, cung cấp API tương thích Kubernetes nhưng chạy tốt trên các VPS giá rẻ
  • Systemd giải quyết được nhiều vấn đề và không nên bị xem nhẹ

    • Cung cấp nhiều tính năng như machinectl, nspawn, vmspawn, importctl, v.v.
    • homed/homectl mở rộng quản lý người dùng, mounts tự động mount ổ đĩa, boot điều khiển khởi động/dừng dịch vụ, timers thay thế cron
    • Các service unit kiểm soát tác vụ, và có thể chỉnh sửa tệp cấu hình bằng systemctl edit
  • Vận hành homelab bằng podman-systemd, và mỗi lần tìm hiểu một biến thể Kubernetes mới thì không có thêm phiền phức nào đáng kể

    • Dùng playbook Ansible để pull image trước và đặt các tệp unit vào đúng vị trí
    • Vận hành stack máy in 3D Voron bằng podman-systemd, và đang cân nhắc chuyển sang mkosi cùng systemd-sysupdate
    • Có sự phiền toái là phải chuyển các tệp docker-compose thành systemd unit
    • Podman giúp giảm độ phức tạp trong thiết lập người dùng/quyền hạn
  • Dùng Quadlet để quản lý container bên trong systemd là bước tiếp theo

    • Có thể xem chi tiết trong blog của Red Hat
  • Đã tạo Skate để xây dựng một hệ thống hỗ trợ multi-host và manifest Kubernetes

    • Bên trong, nó sử dụng podman và systemd
  • Có thể dùng lệnh docker compose và Caddy để tự động lấy chứng chỉ

    • Có thể thiết lập đơn giản bằng lệnh docker compose up -d --pull always
    • Cấu hình CI được dựng bằng scpssh
    • Đơn giản và cũng hoạt động trên máy phát triển
  • Systemd hiện cũng cung cấp ParticleOS, bản phân phối OS được hỗ trợ chính thức cho workflow bất biến

  • Cho rằng việc triển khai lên một máy chủ đơn không nên phức tạp, nên đã viết một công cụ tên là Harbormaster

    • Dùng tệp YAML để phát hiện repository và chạy các tệp Docker Compose
    • Giữ toàn bộ trạng thái trong một thư mục duy nhất nên dễ sao lưu
    • Đây là công cụ điều phối container dễ dùng nhất cần thiết cho một máy chủ đơn