Kubernetes’i systemd ile değiştirmek (2024)
(blog.yaakov.online)- Kişisel sunucular ve küçük VPS’ler için Kubernetes’in bildirimsel otomasyonu çekici olsa da CPU ve bellek yükü ile operasyonel karmaşıklık gerçek faydanın önüne geçebilir
- Kubernetes, istenen durumu sürekli tutturma yöntemiyle Pod ayarlaması ve TLS sertifikası yenileme gibi otomasyonlar sağlar; ancak bunun için oldukça büyük bir çalışma zamanını sürekli ayakta tutar
- Azure Kubernetes Service, Microk8s, K3S ve Raspberry Pi denemelerinde boşta kaynak kullanımı ile ısınma/fan sesi tekrar tekrar sorun oldu
- Podman, konteynerleri systemd servisi hâline getirebilir ve
io.containers.autoupdateilepodman auto-updatekullanarak yeni imajları algılayıp değiştirebilir - Podman, systemd ve user lingering birleşimi, Kubernetes’ten beklenen otomasyonun büyük bölümünü daha basit şekilde sağlar; ancak systemd entegrasyonu Quadlet yönüne kayıyor
Kubernetes otomasyonunun kişisel sunucular için neden ağır kaldığı
- Kubernetes birçok bileşen, web servisi, sidecar ve webhook’tan oluşsa da temel çalışma biçimi, mevcut durum ile istenen durumu sürekli karşılaştırıp farkları uygulayan bir döngüye yakındır
- Bir Pod’un var olması gerekirken yoksa oluşturur
- Replica sayısı 3 olmalı ama 4 ise birini kaldırır
- Bu model özellikle cert-manager gibi eklentilerde yararlıydı
- Belirli bir alan adı için geçerli bir TLS sertifikası olması gerektiği bildirilir
- Sertifikanın nasıl talep edileceği tanımlanırsa, sertifika yokken veya süresi dolmaya yaklaşırken yeni sertifikayı alıp web sunucusuna kurar
- Kişisel denemeler için eğlenceli ve öğretici olsa da gerçek operasyon amaçları için aşırı büyük bir araç sayılırdı
- Kaynak yükü farklı ortamlarda tekrarlandı
- NUC’ta bilgisayar sürekli çalışıp ısınıyor ve fan sesi çıkarıyor, bu da uyumayı zorlaştırıyordu
- Azure Kubernetes Service’te Kubernetes uygulaması RAM’in büyük bölümünü kaplıyor, worker node’da boşta CPU’nun yaklaşık %7–10’unu kullanıyordu
- 2 vCPU x86_64 VPS’te tek örnekli Microk8s’in boşta CPU kullanımı yaklaşık %12 düzeyindeydi
- 2 vCPU Ampere A1 makinede K3S daha hafif bir uygulama olarak bilinse de sürekli yaklaşık %6 CPU kullanıyordu
- Raspberry Pi’de de ısınma/fan sorunu olmadan iş yüklerine yeterli CPU bırakacak bir uygulama bulunamadı
Podman ve systemd ile değiştirilen otomasyon yöntemi
- Kubernetes’i kullanmaya devam ettiren en büyük neden dağıtım otomasyonuydu
- GitOps ve Flux kullanıldığında değişiklik yapmak kolaydı
- Konteyner imaj otomasyonu ve Flux v2 webhook’larıyla yeni imaj push edildiğinde sunucu birkaç saniye içinde yeni imajı alıp production uygulamasını çalıştırıyordu
- Kubernetes dışında bulunan mevcut alternatifler tatmin edici değildi
- Orijinal komut satırı argümanlarının tamamını hatırlayıp konteyneri yeniden oluşturma yaklaşımı yüksek yönetim yükü getiriyordu
docker.socküzerinde tam kontrol isteyen araçlar da tercih edilmiyordu
- Podman auto-updating ihtiyaç duyulan işleve yakındı
- Podman, Docker CLI alternatifi olarak görülebilir
- Konteyner oluşturulduktan sonra systemd servis dosyası üretilebilir
- Servis başlatıldığında konteyneri oluşturur veya değiştirir; servis durdurulduğunda konteyneri kaldırır
- Otomatik güncelleme
io.containers.autoupdateetiketiyle çalışır- Günde bir kez timer ile çalıştırılır ya da
podman auto-updatedoğrudan yürütülür - Yeni imaj varsa konteyneri o imajla yeniden oluşturur
- Günde bir kez timer ile çalıştırılır ya da
- Fedora Magazine’deki Auto-updating Podman containers with systemd uygulamanın büyük kısmını sağladı; ek olarak iki ayar gerekiyordu
systemctl --user enable mycontainer.serviceile oturum açıldığında konteynerin otomatik başlaması sağlanırloginctl enable-lingerile sunucu başlarken kullanıcı oturumunun çalışması sağlanır
- Podman, systemd ve user lingering birleşimiyle Kubernetes’ten elde edilen faydaların yaklaşık %99’u çok daha düşük karmaşıklık ve CPU/bellek yüküyle elde edildi
- Tüm servisler mevcut VPS’ten vCPU ve RAM’i yarı yarıya daha az olan yeni bir VPS’e taşındı; birkaç saatlik çalışma bazında daha hafif, daha hızlıydı ve işlem maliyeti de daha düşüktü
- Ancak Podman’ın systemd entegrasyonu görünüşe göre artık destek dışı; konteyner tanımları için Quadlet dosyaları yönünde tartışmalar sürüyor
1 yorum
Hacker News görüşleri
Orijinal yazarın duygularına tamamen katılıyorum. İş yerinde onlarca mikroservisin çalıştığı birden çok Kubernetes kümesini nispeten kolay yönetiyoruz; ama gelir getirmeyen hobi projelerinde bütçe küçük olduğu için Kubernetes kullanmak istesem de kullanamıyorum.
1 paylaşımlı vCPU ve 2GB RAM’li aylık 10 dolarlık bir VPS için Kubernetes fazla ağır. Deployment yerine SSH ile
docker compose up/downkomutunu elle çalıştırıyorum, Ingress yerine Traefik’in container keşif özelliğine güveniyorum; CronJobs kullanamadığım için crontab’ı idempotent biçimde yöneten küçük bir betiği bile kendim yazdım.Asıl istediğim, ucuz VPS’lerde de iyi çalışan Kubernetes uyumlu bir API sağlayan hafif bir alternatif. Kurumsal düzey container orkestrasyonu ile hobi amaçlı düşük maliyetli hosting arasındaki uçurum hâlâ çok büyük.
docker composegibi davranır.Yazıda anlatılan yönteme benzer şekilde systemd unit’leriyle birlikte de kullanılabilir. Podman, Docker API’sinin de çoğunu ya da tamamını desteklediğinden
docker composeda çalışır; SSH üzerinden uzak sokete bağlanıp işlem yapmak da mümkündür.https://docs.podman.io/en/latest/markdown/podman-kube-play.1...
https://docs.podman.io/en/latest/markdown/podman-systemd.uni...
Ücretsiz olarak 4 ARM64 çekirdeği ve 24GB RAM veriyor; tercih ettiğiniz düzene göre bunları 1 ila 4 node’a bölebiliyorsunuz.
https://www.oracle.com/cloud/free/
docker composegibi kullanılabiliyor.Traefik ve label’ları kullanarak reverse proxy ile TLS sertifikalarını genelleştirip, basit bir kimlik doğrulama sağlayıcısı olarak Authelia’yı eklemek yeterli. GitHub’da örnek proje de çok; bir hafta sonu kadar ayırıp kurarsanız yönetimi oldukça kolay bir sistem oluyor.
systemd çok eleştirilir ama gerçekten pek çok sorunu çözdüğü için kolayca göz ardı edilmemeli. Dağıtımlara varsayılan olarak girmeye başladığında insanların değişmek zorunda kalmaktan hoşlanmaması büyük etkendi.
Container’lar,
machinectl, daha güçlü bir chroot olannspawn, tam sanallaştırma gerektiğinde kullanılanvmspawn, makineleri indirme, içe aktarma ve dışa aktarma içinimportctl, ev dizini şifreleme ve yetki kontrolünü kolaylaştıranhomed/homectlgibi şeyler var.fstabyerine mount’ları unit olarak ele alır, boot sırasını ve servislerin başlatılıp durdurulmasını kontrol eder;crondan daha güçlü timer’lar da sunar. Örneğin makine kapalı olduğu için çalıştırılamayan işleri bilmek ya da boot sonrası belirli koşullarda gecikmeli çalıştırmak mümkündür.Service unit’leri işleri ayrıntılı biçimde denetleyebilir ve yetkileri kısıtlayabilir;
systemctl editile asıl yapılandırmaya dokunmadan override ayarları oluşturabilirsiniz. Başta öğrenmesi biraz zahmetli, ama karmaşık işler yapacaksanız dokümantasyona hiç bakmayı gerektirmeyen bir araç zaten yok.Sorun maintainer’ların tutumuydu. İyi çalışan şeyleri rahatça bozup buna uygun düzeltmeler sunmamak gibi bir yaklaşım vardı. systemd yüzünden acı çekmediyseniz ya geç katılmışsınızdır ya da ihtiyaçlarınız tesadüfen çekirdek maintainer’ların ihtiyaçlarıyla örtüşmüştür.
execetmeye çalışarak daha karmaşık davranışlara girmesi.PID 1’in yapması gereken şeyi %100 doğru yapıp bunun dışında hiçbir şey yapmayan bir program çok daha küçük olabilir. Buradan systemd’yi başlatırsanız, systemd’de bir sorun çıksa bile bu hemen kernel panic’e dönüşmez.
Kaynak: https://ewontfix.com/14/
cronu unutun demek bana ikna edici gelmiyor. 50 yıl boyunca gayet iyi çalıştı; şimdi birdenbire çok yanlış bir şeymiş ve doğal olarak systemd ile değiştirilmesi gerekiyormuş gibi davranılıyor.fstabı unutup systemd mount’larını kullanırsanız, otomatik mount kuralları karmaşıktır ve dokümantasyonla bire bir eşleseniz bile bazen sadece çalışmaz; bu yüzden dosya sistemi zamanında mount edilmeyebilir.Dağıtımlar veya upstream açısından hayatı çok kolaylaştırır; fakat bunun bedeli olarak sistemin en alt katmanlarına giderek büyüyen bir karmaşıklık ekler. Bakış açısına göre
journalctl,timedatectl, dbus bağımlılığı veya alternatifi gibi şeylerin Unix felsefesine uymadığı düşünülebilir.Amaç yalnızca süreçleri koordine etmek, doğru sırayla çalıştırmak ve otomatik etkinleştirmeyi garanti etmekse, k8s veya Docker’dan daha uygun seviyede bir araç olduğunu düşünüyorum.
Homelab’i bir süredir podman-systemd, yani Quadlet ile çalıştırıyorum; yeni k8s türevlerine her baktığımda ek zahmete değmediğini gördüm. Eski Ansible playbook’larında imajları önceden çekip unit dosyalarını doğru yere koymak yeterli oluyor.
Voron 3D yazıcı stack’inin tamamını da podman-systemd ile çalıştırarak tüm bileşenleri tek seferde güncelleyip rollback yapabilir hale getirdim. Ancak şimdi
mkosivesystemd-sysupdateile tüm disk imajını tek seferde güncelleyip rollback yapma yöntemini de değerlendiriyorum.Başlıca sorun, insanların genelde yalnızca
docker-composedosyaları dağıtması ve bunları systemd unit’lerine dönüştürmek gerekmesi; ayrıca bazı Docker imajlarının kullanıcı/izin ayarlarında Podman için gereksiz karmaşıklık taşıması. Özellikle container root olarak çalışmayı reddederse veya başka bir kullanıcıya geçerse can sıkıcıusernsID eşlemeleri gerekebiliyor.Yine de genel olarak herhangi bir k8s ya da k8s türevi kurulumdan çok daha az karmaşık. systemd ve journald ile tamamen entegre olup iki ayrı yere bölünmemesi de güzel.
Sadece unit’leri koymanın yeterli olduğu bir yöntem, bu yüzden çok kararlı ve basit.
composedosyalarını Quadlet dosyalarına dönüştürürkenpodletkullanabilirsiniz: https://github.com/containers/podletAma k8s’in birden çok düğüm üzerinde sunduğu orkestrasyon ve zamanlama soyutlamasının yerini tutmaz. “Podman-systemd dosyalarını çalıştırabilen makineler burada, çalıştırmak istediğim tanım da burada; bunları uygun şekilde yerleştir” kısmı eksik.
podman runkomutuyla container’ı ayağa kaldırıp düzgün çalıştığını doğruluyorsunuz; ardındanpodletile temel container dosyasını oluşturuyor, volume ve network’leri başka Quadlet dosyalarına ayıracak şekilde container dosyasını düzenliyorsunuz; hepsi bu.podman-composeprojesi de hâlâ aktif biçimde bakımı yapılıyor gibi görünüyor vedocker-composeiçin iyi bir alternatif olabilir. Ama Podman ile systemd entegrasyonu zaten son derece tatmin edici.Bunu daha da basitleştirmenin bir sonraki adımı, container’ları systemd içinde Quadlet ile yönetmek. Ayrıntılar https://www.redhat.com/en/blog/quadlet-podman adresinde.
docker compose’dan rootless Podman Quadlet’e taşıdım; geçiş zordu ama sonuçtan çok memnunum.skate’i yaptım: https://github.com/skateco/skate. Temelde bu amaç için, ama birden fazla host’u destekliyor ve k8s manifest’lerini de destekliyor. İçeride Podman ve systemd kullanıyor.
Öte yandan k8s’in API’sinin ve kullanıcı deneyiminin berbat olduğunu düşünüyorum. Docker Compose spesifikasyonu çok daha kullanıcı dostu; şu anda birden fazla host için
docker-composedenemesi yapıyorum: https://github.com/psviderski/uncloudYeniden deb paketi olarak paketleyip EC2 instance’larında doğrudan systemd ile çalıştırma yöntemine döndüm; artık container kullanmıyorum. Instance’ları ALB bağlı bir Auto Scaling Group’a koyuyorum ve açılışta basit bir
ansible-pulldeb’i kuruyor.Oldukça ham bir yöntem ama sonsuz JSON içindeki YAML içindeki HCL’den bıktım. Artık yalnızca Ansible YAML civarında bir şeylerle uğraşmak istiyorum.
apt full-upgradeçalıştırıp yalnızca çalışan süreçleri yeniden başlatarak korunabilmeniz.Bir şeyleri yeniden build etmeniz ya da sizin oluşturmuş olabileceğiniz veya olmayabileceğiniz bir container’ın derinlerine gömülü kütüphaneyi nasıl güncelleyeceğinizi araştırmanız gerekmiyor.
cgroup desteği sayesinde tek bir VPS üzerinde birden fazla servis çalıştırmak da güzel.
Yazı bir yılı aşkın eski olduğu için, artık systemd tarafında değişmez (immutable) iş akışları için resmi destek sunan bir OS dağıtımı olan ParticleOS bile var
https://github.com/systemd/particleos
https://news.ycombinator.com/item?id=43649088
systemd-kernelile değiştirmek olur; o zaman tamamlanmış olurOkuyunca tüm bunların
docker composekomutu ve sertifikaları otomatik alan Caddy gibi bir şeyle değiştirilebileceği izlenimi veriyorSadece
compose.yamlvarsa temeldedocker compose up -d --pull alwaystek satırı yeter. CI ayarı dascp compose.yaml user@remote-host:~/ardındanssh user@remote-host 'docker compose up -d --pull always'olsa yeterliAvantajı basit olması ve geliştirme makinesinde de çalışması. Elbette yan hedef eğlenceli bir şey denemek ve öğrenmekse Quadlet, k8s, systemd de iyi seçenekler
docker context create --docker 'host=ssh://user@remote-host' remote-hostçalıştırmak yeterliSonrasında
docker -c remote-host compose -f compose.yaml up -d --pull alwayskullanırsanız dosya kopyalamanıza gerek kalmaz. Ayrıca~/.ssh/configiçine kullanıcı bilgilerini ayarlarsanız SSH çağrılarındauser@yazmanız gerekmez; ekip içinde dokümanları veya komutları kopyalayıp kullanmak kolaylaşırDOCKER_HOSTortam değişkeni ayarlanabilir. Ancakcomposedosyası interpolasyonunda yerel ortam değişkenlerinin kullanıldığına dikkat etmek gerekirTek bir sunucuya dağıtım yapmanın bu kadar karmaşık olmaması gerektiğini düşündüğüm için, istediğim şekilde dağıtım yapan bir araç yaptım: https://harbormaster.readthedocs.io/
Harbormaster, YAML dosyasıyla depoyu bulur, periyodik olarak klonlayıp günceller ve içindeki Docker Compose dosyasını çalıştırır. Tüm durumu da tek bir dizinde tuttuğu için yedeklemesi kolaydır
Sadece tek bir sunucu gerekiyorsa, şimdiye kadar gördüğüm konteyner orkestrasyon araçları içinde en kolay ve en iyisi. Tüm yapılandırmanın depoda deklaratif olarak tanımlanması, tüm durumun tek dizinde olması ve her şeyin sadece Compose dosyası olması hoşuma gidiyor
Buradaki yorumları okuyunca yaşlanmış gibi hissediyorum. Artık kimse sadece ssh ve nginx kullanmıyor mu diye düşünüyorum
Her şeyi tek bir kutuya tıkıştırıp o kutuyu agresif biçimde yedeklersiniz, biter. Ev kullanımı için mikroservis yönetimine gerçekten gerek yok