Mengganti Kubernetes dengan systemd (2024)
(blog.yaakov.online)- Di server pribadi dan VPS kecil, otomatisasi deklaratif Kubernetes memang menarik, tetapi beban CPU dan memori serta kompleksitas operasionalnya bisa melampaui manfaat nyatanya
- Kubernetes mengotomatisasi hal seperti penyesuaian Pod dan pembaruan sertifikat TLS dengan terus menjaga kondisi agar sesuai dengan keadaan yang diinginkan, tetapi untuk itu ia harus terus menjalankan runtime yang cukup besar
- Dalam eksperimen dengan Azure Kubernetes Service, Microk8s, K3S, dan Raspberry Pi, penggunaan resource saat idle serta panas dan kebisingan kipas berulang kali menjadi masalah
- Podman dapat membuat container menjadi layanan systemd dan mendeteksi serta mengganti image baru dengan
io.containers.autoupdatedanpodman auto-update - Kombinasi Podman, systemd, dan user lingering menyediakan sebagian besar otomatisasi yang diinginkan dari Kubernetes dengan cara yang lebih sederhana, tetapi integrasi systemd kini bergerak ke arah Quadlet
Mengapa otomatisasi Kubernetes terasa terlalu berat untuk server pribadi
- Kubernetes terdiri dari banyak komponen, layanan web, sidecar, dan webhook, tetapi perilaku intinya lebih mirip loop yang terus membandingkan kondisi saat ini dengan kondisi yang diinginkan lalu menerapkan perbedaannya
- Jika seharusnya ada Pod tetapi tidak ada, maka dibuat
- Jika replica seharusnya 3 tetapi ada 4, maka satu dihapus
- Model ini sangat berguna terutama pada ekstensi seperti cert-manager
- Dideklarasikan bahwa harus ada sertifikat TLS yang valid untuk domain tertentu
- Jika cara meminta sertifikat sudah ditentukan, maka saat sertifikat belum ada atau masa berlakunya hampir habis, sistem akan mengambil sertifikat baru dan memasangnya ke server web
- Untuk eksperimen pribadi ini menyenangkan dan bernilai sebagai pembelajaran, tetapi untuk tujuan operasional nyata, ini terasa seperti alat yang berlebihan
- Beban resource terus muncul berulang di berbagai lingkungan
- Di NUC, komputer terus menyala, menjadi panas, dan menimbulkan suara kipas sehingga sulit tidur
- Di Azure Kubernetes Service, implementasi Kubernetes memakan RAM besar, dan di worker node CPU idle terpakai sekitar 7~10%
- Pada Microk8s single-instance di VPS x86_64 2 vCPU, CPU idle berada di kisaran 12%
- K3S pada mesin Ampere A1 2 vCPU dikenal sebagai implementasi yang lebih ringan, tetapi tetap memakai CPU konstan sekitar 6%
- Bahkan di Raspberry Pi pun tidak ditemukan implementasi yang bisa menyisakan CPU cukup untuk workload tanpa masalah panas dan kipas
Pendekatan otomatisasi setelah beralih ke Podman dan systemd
- Alasan terbesar tetap memakai Kubernetes adalah otomatisasi deployment
- Dengan GitOps dan Flux, perubahan menjadi mudah dilakukan
- Dengan otomatisasi image container dan webhook Flux v2, saat image baru di-push, dalam hitungan detik server mengambil image baru dan menjalankan aplikasi produksi
- Alternatif lama yang ditemukan di luar Kubernetes tidak memuaskan
- Pendekatan yang harus mengingat semua argumen command line asli untuk membuat ulang container menambah beban pengelolaan
- Alat yang meminta kontrol penuh atas
docker.sockjuga tidak disukai
- Podman auto-updating lebih mendekati fungsi yang dibutuhkan
- Podman bisa dipandang sebagai alternatif Docker CLI
- Setelah membuat container, kita bisa menghasilkan file layanan systemd
- Saat layanan dimulai, container dibuat atau diganti, dan saat layanan dihentikan, container dihapus
- Pembaruan otomatis bekerja melalui tag
io.containers.autoupdate- Bisa dijalankan lewat timer sekali sehari atau dengan langsung menjalankan
podman auto-update - Jika ada image baru, container akan dibuat ulang menggunakan image tersebut
- Bisa dijalankan lewat timer sekali sehari atau dengan langsung menjalankan
- Artikel Fedora Magazine Auto-updating Podman containers with systemd memberikan sebagian besar cara implementasinya, dan tambahan dua pengaturan lagi diperlukan
systemctl --user enable mycontainer.serviceagar container otomatis mulai saat loginloginctl enable-lingeragar sesi pengguna berjalan saat server dinyalakan
- Dengan kombinasi Podman, systemd, dan user lingering, sekitar 99% manfaat yang sebelumnya didapat dari Kubernetes bisa diperoleh dengan kompleksitas serta beban CPU dan memori yang jauh lebih rendah
- Seluruh layanan dipindahkan dari VPS lama ke VPS baru dengan vCPU dan RAM setengahnya, dan setelah berjalan selama beberapa jam, hasilnya lebih ringan, lebih cepat, dan biaya komputasinya juga lebih rendah
- Namun, integrasi systemd di Podman tampaknya sudah deprecated, dan definisi container kini dibahas menuju penggunaan file Quadlet
1 komentar
Opini Hacker News
Saya sepenuhnya memahami perasaan penulis asli. Di tempat kerja, kami mengelola beberapa cluster Kubernetes yang menjalankan puluhan microservice dengan relatif mudah, tetapi untuk proyek hobi yang tidak menghasilkan pendapatan, anggarannya kecil sehingga meski ingin memakai Kubernetes, saya tidak bisa
Di VPS $10 per bulan dengan 1 vCPU bersama dan RAM 2GB, Kubernetes terlalu berat. Alih-alih Deployment, saya menjalankan
docker compose up/downsecara manual lewat SSH; alih-alih Ingress, saya mengandalkan fitur penemuan container Traefik; dan karena tidak bisa memakai CronJobs, saya bahkan membuat sendiri skrip kecil untuk mengelola crontab secara idempotenYang benar-benar saya inginkan adalah alternatif ringan yang menyediakan API kompatibel Kubernetes dan tetap berjalan baik di VPS murah. Kesenjangan antara orkestrasi container kelas enterprise dan hosting murah untuk hobi masih terlalu besar
docker composeyang memakai manifest KubernetesSeperti pendekatan yang dijelaskan di tulisan itu, Podman juga bisa digunakan bersama unit systemd. Podman juga mendukung sebagian besar atau seluruh Docker API, jadi
docker composepun berjalan, dan Anda juga bisa bekerja dengan menghubungkan ke soket jarak jauh lewat SSHhttps://docs.podman.io/en/latest/markdown/podman-kube-play.1...
https://docs.podman.io/en/latest/markdown/podman-systemd.uni...
Mereka memberi 4 core ARM64 dan RAM 24GB secara gratis, dan bisa dibagi menjadi 1–4 node sesuai cara yang Anda inginkan
https://www.oracle.com/cloud/free/
docker composeversi lebih kuatDengan Traefik dan label, reverse proxy serta sertifikat TLS bisa digeneralisasi, lalu Authelia dapat ditambahkan sebagai penyedia autentikasi sederhana. Ada banyak proyek contoh di GitHub, dan setelah disetel kira-kira selama akhir pekan, sistemnya menjadi cukup mudah dikelola
systemd memang sering dicaci, tetapi ia menyelesaikan sangat banyak masalah, jadi tidak boleh diremehkan begitu saja. Saat mulai menjadi bawaan di berbagai distro, sebagian besar orang tidak suka karena mereka harus berubah
Ada container,
machinectl,nspawnsebagai chroot yang lebih kuat,vmspawnsaat butuh virtualisasi penuh,importctluntuk mengunduh, mengimpor, dan mengekspor mesin, sertahomed/homectlyang memudahkan enkripsi direktori home dan kontrol izinsystemd menangani mount sebagai unit alih-alih
fstab, mengontrol urutan boot serta start/stop service, dan juga menyediakan timer yang lebih kuat daripadacron. Misalnya, bisa mengetahui job yang terlewat karena mesin sedang mati, atau menjalankan dengan penundaan setelah boot dalam kondisi tertentuUnit service memungkinkan kontrol pekerjaan secara rinci dan pembatasan hak akses, dan dengan
systemctl editAnda bisa membuat konfigurasi override tanpa menyentuh konfigurasi asli. Awalnya memang agak merepotkan untuk dipelajari, tetapi kalau ingin melakukan hal yang kompleks, toh tidak ada alat yang sama sekali tidak perlu membaca dokumentasiMasalahnya adalah sikap para maintainer. Mereka dengan santai merusak hal-hal yang sebelumnya berjalan baik tanpa menyediakan perbaikan yang memadai. Jika Anda tidak merasakan penderitaan karena systemd, mungkin Anda bergabung belakangan, atau kebutuhan Anda kebetulan selaras dengan kebutuhan para maintainer inti
execterhadap dirinya sendiri di tempatProgram yang melakukan 100% tepat apa yang harus dilakukan PID 1 dan tidak melakukan apa pun selain itu bisa dibuat jauh lebih kecil. Jika systemd dijalankan di atasnya, sesuatu yang bermasalah pada systemd tidak langsung berujung pada kernel panic
Sumber: https://ewontfix.com/14/
cron. Ia sudah bekerja dengan baik selama 50 tahun, lalu tiba-tiba dianggap sangat salah dan seolah sudah sewajarnya diganti oleh systemdfstabdan memakai mount systemd, aturan automount-nya rumit, dan meskipun dicocokkan 1:1 dengan dokumentasi, kadang-kadang tetap saja tidak berjalan, sehingga filesystem bisa tidak ter-mount tepat waktuBagi distro atau upstream, ia membuat hidup jauh lebih mudah, tetapi sebagai gantinya menambahkan kompleksitas yang terus membesar di lapisan paling bawah sistem. Bergantung pada sudut pandang, hal-hal seperti
journalctl,timedatectl, dependensi atau pengganti dbus bisa dianggap tidak sesuai dengan filosofi UnixJika tujuannya hanya mengoordinasikan proses, menjalankannya dalam urutan yang benar, dan memastikan aktivasi otomatis, menurut saya ini alat pada level yang lebih tepat daripada k8s atau Docker
Saya sudah cukup lama menjalankan homelab dengan podman-systemd, yaitu Quadlet, dan setiap kali melihat varian k8s baru, rasanya tidak sepadan dengan kerepotan tambahan yang harus ditanggung. Playbook Ansible lama yang sudah ada sudah cukup: mengambil image terlebih dahulu lalu menaruh file unit di tempatnya
Seluruh stack printer 3D Voron juga dijalankan dengan podman-systemd, sehingga semua komponennya bisa diperbarui dan di-rollback sekaligus. Namun sekarang juga sedang mempertimbangkan pendekatan memperbarui dan me-rollback seluruh image disk sekaligus dengan
mkosidansystemd-sysupdateMasalah utamanya adalah orang-orang umumnya hanya mendistribusikan file
docker-compose, sehingga harus dikonversi menjadi unit systemd, dan sebagian image Docker memiliki kerumitan yang tidak perlu bagi Podman dalam pengaturan pengguna dan izin. Terutama jika kontainer menolak berjalan sebagai root atau beralih ke pengguna lain, kadang diperlukan pemetaan IDusernsyang merepotkanMeski begitu, secara keseluruhan ini jauh lebih tidak rumit dibanding konfigurasi k8s atau varian k8s mana pun. Integrasinya dengan systemd dan journald juga menyenangkan karena tidak terpecah ke dua tempat
Cukup menaruh unit saja, jadi sangat stabil dan sederhana
composemenjadi file Quadlet, bisa memakaipodlet: https://github.com/containers/podletNamun itu tidak menggantikan abstraksi orkestrasi dan penjadwalan di atas banyak node yang disediakan k8s. Bagian “ini ada mesin-mesin yang bisa menjalankan file Podman-systemd, dan ini spesifikasi yang ingin dijalankan, tolong tempatkan sendiri” masih hilang
podman run, memastikan berjalan dengan benar, lalu membuat file kontainer dasar denganpodlet, kemudian memodifikasi file kontainer dengan memisahkan volume dan jaringan ke file Quadlet lain; selesaiProyek
podman-composetampaknya juga masih aktif dipelihara dan bisa menjadi alternatif yang bagus untukdocker-compose. Namun integrasi Podman dengan systemd memang sangat memuaskanLangkah berikutnya untuk membuat ini lebih sederhana adalah mengelola kontainer di dalam systemd dengan Quadlet. Detailnya ada di https://www.redhat.com/en/blog/quadlet-podman
docker composeke rootless Podman Quadlet; transisinya sulit, tetapi saya sangat puas dengan hasilnyaSaya membuat skate: https://github.com/skateco/skate. Pada dasarnya untuk tujuan seperti ini, tetapi mendukung banyak host dan juga mendukung manifest k8s. Secara internal memakai Podman dan systemd
Namun menurut saya k8s punya API dan pengalaman pengguna yang buruk sekali. Spesifikasi Docker Compose jauh lebih ramah pengguna, jadi saat ini saya sedang bereksperimen dengan
docker-composeuntuk banyak host: https://github.com/psviderski/uncloudSaya kembali membungkusnya sebagai paket deb dan menjalankannya langsung dengan systemd di instans EC2, tidak lagi memakai kontainer. Instans dimasukkan ke Auto Scaling Group yang terhubung ke ALB, dan saat boot
ansible-pullsederhana memasang deb tersebutIni memang pendekatan yang cukup mentah, tetapi saya lelah dengan HCL di dalam YAML di dalam JSON tanpa akhir. Sekarang saya hanya ingin berurusan dengan YAML Ansible saja
apt full-upgradedan me-restart hanya proses yang sedang berjalan untuk terlindungiTidak perlu membangun ulang apa pun, atau mencari cara memperbarui library yang terkubur jauh di dalam kontainer yang mungkin dibuat sendiri atau mungkin juga tidak
Berkat dukungan cgroup, menjalankan beberapa layanan di satu VPS juga enak
Karena tulisan ini sudah lebih dari setahun, sekarang bahkan sudah ada ParticleOS, distribusi OS dukungan resmi dari systemd untuk alur kerja immutable
https://github.com/systemd/particleos
https://news.ycombinator.com/item?id=43649088
systemd-kernel, dan saat itu semuanya lengkapSetelah membacanya, sepertinya semua ini bisa diganti dengan perintah
docker composedan sesuatu seperti Caddy yang otomatis mengambil sertifikatSelama ada
compose.yaml, pada dasarnya cukup satu baris:docker compose up -d --pull always. Konfigurasi CI juga cukup denganscp compose.yaml user@remote-host:~/lalussh user@remote-host 'docker compose up -d --pull always'Keunggulannya adalah sederhana dan juga berjalan di mesin pengembangan. Tentu saja kalau tujuan tambahannya adalah mencoba hal menarik dan belajar, Quadlet, k8s, maupun systemd juga pilihan yang bagus
docker context create --docker 'host=ssh://user@remote-host' remote-hostSetelah itu, gunakan
docker -c remote-host compose -f compose.yaml up -d --pull alwayssehingga tidak perlu menyalin file. Selain itu, jika informasi pengguna diatur di~/.ssh/config, tidak perlu menulisuser@saat memanggil SSH, sehingga tim lebih mudah menyalin dokumentasi atau perintahDOCKER_HOST. Namun perlu diperhatikan bahwa interpolasi filecomposemenggunakan variabel lingkungan lokalKarena menurut saya deployment ke satu server tidak seharusnya serumit ini, saya membuat alat untuk melakukan deployment sesuai cara yang saya inginkan: https://harbormaster.readthedocs.io/
Harbormaster mencari repositori lewat file YAML, secara berkala melakukan clone dan update, lalu menjalankan file Docker Compose di dalamnya. Semua state juga disimpan dalam satu direktori, sehingga mudah dicadangkan
Jika yang dibutuhkan hanya satu server, ini adalah alat orkestrasi container paling mudah dan bagus yang pernah saya lihat sejauh ini. Saya suka karena seluruh konfigurasi dideklarasikan di repositori, semua state ada di satu direktori, dan semuanya hanyalah file Compose
Membaca komentar-komentar di sini membuat saya merasa tua. Rasanya sekarang tidak ada lagi yang hanya memakai ssh dan nginx
Masukkan semuanya ke satu box, lalu backup box itu secara agresif, selesai. Untuk pemakaian di rumah, benar-benar tidak perlu sampai mengelola microservices