- Glasskube, Kubernetes için açık kaynaklı bir paket yöneticisi olarak tanıtılıyor; paketleri dağıtmayı, güncellemeyi ve yapılandırmayı Helm veya Kustomize gibi araçlara göre 20 kat daha hızlı hale getirdiği belirtiliyor
- Kullanıcılar paketleri Glasskube UI, CLI veya GitOps yöntemiyle dağıtabiliyor; Homebrew ve npm’in sadeliğinden ilham almış
- Başlıca özellikleri arasında Helm deposu aramadan UI üzerinden paket kurulumu, tip güvenli yapılandırma girdileri, paketler arası değer enjeksiyonu, bağımlılık farkındalığıyla kurulum ve önceden test edilmiş güvenli güncellemeler yer alıyor
- Tüm Glasskube paketleri özel kaynaklar olarak yönetiliyor ve GitOps ile ele alınabiliyor; birden fazla depo ve private package dağıtımı da destekleniyor
- Şu anda Kubernetes Dashboard, cert-manager, Ingress-NGINX Controller, Kube Prometheus Stack, Cloud Native PG gibi paketleri destekliyor; beta sürüm Homebrew ile kurulabiliyor
Glasskube’un çözmeyi hedeflediği Kubernetes paket yönetimi sorunu
- Glasskube, Kubernetes için açık kaynaklı bir paket yöneticisidir
- Kubernetes’te paket dağıtma, güncelleme ve yapılandırma işlerini Helm veya Kustomize gibi araçlara göre 20 kat daha hızlı hale getirdiği belirtiliyor
- Homebrew ve npm’in sadeliğinden ilham almış; kullanıcılar aşağıdaki yöntemlerden birini seçebiliyor
- Glasskube UI
- Glasskube CLI
- GitOps üzerinden doğrudan paket dağıtımı
- Geliştirilme arka planında, Kubernetes ekosisteminde 5 yılı aşkın süre çalışırken paket yönetimi, yapılandırma ve dağıtım konularında sürekli zorluklar yaşanması var
- Önceki iş akışlarında, anlaşılması zor komutlar ve kavramlar için şablon oluşturmak ve dokümantasyon yazmak çok zaman alıyordu
- Homebrew, apt, dnf gibi araçların kullanımının kolay ve daha az sorunlu olması, Glasskube geliştirilirken karşılaştırma noktası oldu
Kurulum ve yapılandırma akışı
brew install glasskube/tap/glasskube
- Diğer kurulum seçenekleri installation guide içinde yer alıyor
- CLI kurulduktan sonra, cluster için gerekli bileşenleri kurmak üzere aşağıdaki komut çalıştırılıyor
glasskube bootstrap
- Cluster bootstrap işlemi tamamlandıktan sonra paket yöneticisi UI’ı başlatılabiliyor
glasskube serve
- Bu komut varsayılan tarayıcıda
http://localhost:8580 adresini açıyor; kullanıcılar mevcut paketleri keşfedip kurabiliyor
UI, yapılandırma ve bağımlılık yönetimi özellikleri
- Glasskube UI, tüm paketleri tek bir yerde sunarak kullanıcıların Helm depolarını ayrıca aramadan cluster’a paket kurabilmesini sağlıyor
- Paket yapılandırması, UI veya etkileşimli CLI soru formu üzerinden tip güvenli girdilerle oluşturulabiliyor
- Diğer paketlerden, ConfigMap’lerden ve Secret’lardan kolayca değer enjekte edilebiliyor
- Tip bilgisi olmayan ve dokümante edilmemiş
values.yaml dosyalarını kullanmayan bir yaklaşım öneriliyor
- Bağımlılık yönetimi, Glasskube paketlerinin birçok farklı paket tarafından kullanılabilmesini ve referans alınabilmesini sağlayacak şekilde işliyor
- Bağımlı paketler doğru namespace’e kuruluyor
- README bunu “umbrella chart en başından beri böyle çalışmalıydı” şeklinde ifade ediyor
Güncellemeler, GitOps ve depo desteği
- Paket güncellemeleri için istenen sürüme yönelik pending update önceden görülebiliyor ve tek tıklamayla ya da CLI komutuyla uygulanabiliyor
- Tüm güncellemeler Glasskube test paketiyle önceden test ediliyor
- Paketlere yönelik geri bildirim ve yorumlar GitHub discussions üzerinden veya Glasskube UI içinde bırakılabiliyor
- GitOps entegrasyonu, tüm Glasskube paketlerinin özel kaynaklar olarak yönetilmesi yaklaşımına dayanıyor
- Renovate entegrasyonu da devam ediyor; ilgili issue renovatebot/renovate#29322 adresinde yer alıyor
- Birden fazla depo ve private package kullanılabiliyor
- Şirket içi servis paketlerini dağıtmak için kullanılabiliyor
- Geliştiricilerin güncel durumdaki şirket içi servisleri kolayca yapılandırmasını sağlayan bir senaryo sunuyor
Paket kurulum mimarisi
glasskube install [package] akışında UI veya CLI, Client aracılığıyla paket deposunu ve Kubernetes API’yi birlikte kullanan bir yapı izliyor
- UI, yerel sunucu
http://localhost:8580 üzerinden Client’a bağlanıyor
- CLI, cobra CLI üzerinden Client’a bağlanıyor
- Client önce paket doğrulaması için Package Repo’yu kontrol ediyor
- Doğrulamadan sonra Kubernetes API’de
Package özel kaynağı oluşturuyor
- Cluster içinde
PackageController ve PackageInfoController reconcile işlemini gerçekleştiriyor
PackageController, Package kaynağını reconcile ediyor ve gerekirse PackageInfo oluşturuyor
PackageInfoController, paket deposundaki paket manifest’ini güncelliyor
- Güncellenen manifest
PackageInfo içine yansıtılıyor
- Ardından
PackageController paketi Kubernetes’e dağıtıyor
- Kubernetes paket durumunu Client’a geri döndürüyor
Desteklenen paketler ve proje bilgileri
- Glasskube halihazırda birçok paketi destekliyor
- Desteklenen ve planlanan paketlerin tam listesi glasskube.dev/packages adresinde görülebiliyor
- İlgili proje olarak Glasskube Apps Operator
glasskube/operator bulunuyor
- Sorunlar, hatalar ve özellik istekleri Discord veya GitHub issue’ları üzerinden alınabiliyor
- Glasskube Apache 2.0 lisansı ile dağıtılıyor
1 yorum
Hacker News yorumları
Doğru yönde atılmış bir adım olabilir, ancak şu anda Kubernetes paket yönetimindeki en büyük sorun paket yöneticisiyle çözülmesi zor görünüyor
Günlük kullanımda en zorlayıcı şey, iç içe YAML katmanlarının üst üste binmesi ve sonucun öngörülemez olması
Örneğin ArgoCD ApplicationSet birden çok Application oluşturuyor; bu Application’lar Helm chart’larını render ediyor ve bu chart’ların içinde Strimzi, Grafana, Vector gibi rastgele operatörlerin kullandığı CRD’ler yer alıyor
YAML’ın sözdizimi zayıf ve template render etme için bir standart da yok; bu yüzden üst düzeyde bir değişiklik yaptığınızda Kubernetes API’ye gerçekte hangi YAML’ın enjekte edileceğini bilmek neredeyse imkânsız
Sonuçta bu her ay deneme yanılmaya, pahalı blue-green dağıtımlara ve yüzlerce dakikalık hata ayıklamaya dönüşüyor
Doğru yönün düzgün bir programlama dili desteği olduğunu düşünüyorum
İdeal olarak Turing-complete olmayan ve sonlanması garanti edilen statik tip sistemi gerekir; tipli Starlark benzeri bir biçim uygun görünüyor
glasskube[bot]’un GitOps pull request’lerine bağlı tüm cluster’larda gerçekten değişecek kaynakların tam diff’ini yorum olarak eklemesini hedefliyoruz
Bu diff, cluster içinde çalışan controller tarafından oluşturuluyor
codecov analizine benziyor, ama kaynak değişikliklerine özel diye düşünebilirsiniz
Paket yönetimine ilginç bir yaklaşım gibi görünüyor ve Homebrew tarzı cluster’lar için fena görünmüyor
Yine de şahsen, depoda tutarlılığı korumak adına helmfile + Renovate + pipeline kombinasyonunu tercih ederim
Örneğin
update alldüğmesi, anlamlı bir cluster’da oldukça ürkütücü hissettiriyorKişisel projeler gibi yerlerde hâlâ harika bir araç
Paket controller’ı eski Helm’deki Tiller’a çok benziyor; bu da birçok şirkette büyük bir güvenlik sorunu olmuş, Helm 3’te kaldırılıp configmap tabanlı istemci tarafı işlemeye geçilmişti. Bu projenin o sorunu nasıl aşacağını merak ediyorum
CLI’da
--dry-runve--output yamlbayraklarıyla yapılandırıp Git’e koymak da mümkünAyrıca Renovate ile paket güncellemelerini destekleyen pull request’ler üzerinde çalışıyoruz: https://github.com/renovatebot/renovate/issues/29322
Helm 3 artık istemci taraflı bir araç olduğu için kendi başına RBAC’i zorunlu kılamıyor
OLM, operatör düzeyinde yetkiler sağlamak için Operator Groups’u (https://olm.operatorframework.io/docs/advanced-tasks/operato...) devreye aldı
Glasskube paketlerine de benzer bir şey getirilebilir; Glasskube’un kendisi hâlâ oldukça güçlü yetkilere ihtiyaç duyacak olsa da paket kapsamı sınırlandırılabilir ve ayrıntılı yetkiler eklenebilir
Geleneksel olarak uygulama paketleri, kurulum öncesi/sonrası adımları içeren sürümü sabitlenmiş değişmez ikililerdir; belirli bir platform ve belirli bağımlılıklar düşünülerek derlenir ve kurulum sırasında yapılandırma son derece sınırlıdır.
Paketlerin iyi çalışmasının nedeni, çok belirli bir ortamı hedefleyecek şekilde tasarlanmaları ve kurulum sırasında değiştirilebilecek kısımların en aza indirilmesidir.
Buna rağmen işletim sistemi paketleri, o dar koşullar içinde bile sürekli olarak muazzam test, geliştirme ve yama çalışması gerektirir.
Şu anda kurduğunuz paketin kolay görünmesi, mevcut platform, mevcut bileşenler ve sürümler için yüzlerce saat harcanmış olabileceği içindir.
Kubernetes’teki “paket” ise aslında bir paket değil; kurulacak ve yapılandırılacak bileşenlere ilişkin bir talimat demetine daha yakındır ve çoğu zaman birden fazla ayrı uygulama demetini içerir.
Bu fark iki şekilde ortaya çıkar: K8s “paketi”nin tanımı çok gevşektir ve bu yüzden değişkenliği yüksektir; her türden insan tarafından her türden yöntemle oluşturulur ve kurulacağı sistemin durumu hakkında her türlü varsayımda bulunur.
Bir Kubernetes “paketi”nin çalışması için birden fazla bağımlılık ve yapılandırma katmanının uyumlu olması gerekir.
K8s API sürümü, K8s bileşenlerinin kurulma ve çalıştırılma biçimi, ACL’ler, çakışabilecek mevcut bileşenlerin olmaması, paketin kurduğu bileşenlerin ve container sürümlerinin sabitlenmesi ve küme içindeki diğer şeylerle uyumluluğu, kullanıcı yapılandırması; bunların hepsinin uyumlu olması gerekir.
Yükseltmeler de kararlı sürüm ağacı ya da rolling release kavramı olmadığı için benzer şekilde karmaşıktır; işletim sistemine rastgele
.deb,.rpm,.dmgdosyaları kurup iyi gitmesini ummaya benzer.Bugün tüm bunları yapan bir şey yok.
Kubernetes paketlemeyi platforma özel ikili paketleme kadar sorunsuz hâle getirmek için bakımcı topluluğunun tamamı ve Homebrew benzeri bir rolling release yaklaşımı ya da kararlı sürüm release branch’leri gerekir.
Sonuçta ArtifactHub veya Homebrew gibi bir projenin tüm paketleri tek bir yöntemle yönetmesi gerekir; bu büyük bir iş ve hiç kârlı görünmüyor.
Yapı, tüm güncellemeleri merkezî olarak depolayıp CI/CD workflow’larıyla test ederek kullanıcıların test edilmiş, sorunsuz yükseltmelerden yararlanmasını sağlamayı amaçlıyor.
Kullanıcılar kendi özel depolarını ve paketlerini de barındırabilir, ancak varsayılan olarak görüş sahibi bir paket kümesini doğrudan sunmak istiyoruz.
Farklı Kubernetes sürümlerine veya ortamlara göre derleme yapmayı da şimdiden düşünüyoruz; daha fazla yapılandırmayı build aşamasına katmak için bir gün buna ihtiyaç olacak.
K8s paket yöneticisinin brew veya apt kadar basitleşip basitleşemeyeceğinden pek emin değilim.
Özellikle hedef ortamların her birinde değerlerin farklı olması ve neredeyse her kullanıcının kendine özgü bir “kar tanesi” ortamına sahip olması büyük etken.
Bu değerleri ayarlamak için REPL tarzı prompt’lar veya web UI kullanmak bana cazip gelmiyor.
Temel acı noktası hâlâ çözülmedi: Helm chart yazmak eziyetli, ortama özel değerleri yönetmek gerekiyor ve chart’lar arasında değerleri birbirine bağlamamayı sağlamasını isterdim.
Platform ekipleri, ekipler ve kümeler genelinde Kubernetes yapılandırmalarını daha standart hâle getirmek için dahili geliştirici platformları kuruyor ve geliştiricilerin yalnızca küçük değişiklikler yapabilmesini sağlamaya çalışıyor.
Deneyimlerime göre bu tür birbirinden farklı yapılandırmaların azaltılması gerekiyor; Glasskube’u en başta yapma nedenimiz de buydu.
Helm chart yazmanın eziyetli olduğuna %100 katılıyorum ve ileride bunu değiştirmeye çalışacağız.
Glasskube paketleri hâlâ yapılandırılabilir, ancak anlamlı varsayılanlar sunar.
Diğer paketlerin yapılandırma değerlerine Glasskube içinden kolayca referans verilebilir; böylece aynı değerleri birden çok kez sağlamanız gerekmez.
Çok sayıda Kubernetes operatörü geliştiriyorum ve Helm ile OLM sorunlarıyla sık sık uğraşıyorum.
Belgelerde “CRD yükseltmelerini Glasskube işler, böylece CR’ler ve operatörler birbirinden sapmaz” deniyor; ancak belgelerde “CRD” aratınca somut bir sonuç çıkmıyor.
Bu, şu anda Helm’de yaşadığımız en büyük acı noktalarından biri; planı paylaşabilir misiniz merak ediyorum.
[1] <https://stackable.tech/en/>
[2] <https://www.youtube.com/watch?v=Q8OSYOgBdCc>
Manifest veya helm-controller üzerinden işlenir.
Belgeler güncellenecek.
Kubernetes’in aşırı basit operatör modeli nedeniyle temelden kısıtlandığını düşünüyorum.
Genel fikir hoşuma gidiyor, ancak tüm modeli “mevcut durum, istenen durum, sonraki eylem”e indirgemek fiilen imkânsız.
Sonunda tüm workflow sonraki eylem mantığının içine giriyor; aynı sistem durumuna bakan çok fazla operatör olduğu için birden fazla bileşenin nasıl etkileşeceğini bilmek zorlaşıyor.
Helm’in sorunu, bu daha büyük sorunun bir alt örneği.
Benzetme yapmak gerekirse, frontend programlamanın DOM’da yaşadığı sorunla aynı.
React gibi bir sanal DOM/reducer paradigması getirmek bu tür sorunların çözümüne büyük ölçüde yardımcı olurdu.
Durum, hedef ve hedefe doğru yaşanan sapmalar vardır; güçlü ve esnek bir araç istiyorsanız bu soyutlama seviyesinin doğru olduğunu düşünüyorum.
Sorun, makinenin fiziksel özellikleri ve yerleşiminin çok büyük fark yaratması; bunları anlamlı biçimde sanallaştırmanın veya simüle etmenin maliyetinin aşırı yüksek olması.
Bu yüzden bunun yerine yapılandırma durumunun fiziksel yapının bir alt kümesi üzerinde çalışıp çalışmadığını doğrularız.
dev,staging,prodortamları bulundurmak; renkli dağıtım, kanarya analizi, kısmi rollout vb. kullanmak bu yaklaşımdır.K8s kullanmak için böyle bir araca ihtiyaç duyuyorsanız muhtemelen başka bir çözüm kullanmanız daha iyi olur.
Kubernetes, arka plan bilgisi olmadan kullanılsın diye yapılmadı ve zordur.
Tam kapsamlı bir PaaS oluşturmadığınız sürece bu karmaşıklıktan kaçmak zordur.
Bu aracın pazarlama yönünün yanlış olduğunu düşünüyorum
Bunun Helm ile pek ilgisi yok
Benim için Helm, çoğunlukla bir paket yöneticisi değil, şablon dili; K8s kümelerine kubeapps, Helm CLI ve ArgoCD üzerinden yapılandırıp kurma biçimi
Bu yaklaşım iyi bir IaC paradigmasını da bozuyor
Çünkü ArgoCD’yi bootstrap ettikten sonra yalnızca Git deposuna referans veren bir yapı daha iyi
Demo,
formdesteği gibi şablon özelliklerinin nasıl kullanılacağını göstermiyor; onun dışındaki şeyleri gösteriyorHelm’de bir sorun olduğu hissi hâlâ var, bu yüzden açıkçası aracın kendisini beğeniyorum; ama mevcut yaklaşımla başarısız olacak gibi görünüyor
Büyük şirketlerin bu araca ihtiyacı yok, bu yüzden yeterli benimsenme elde etmek zor olacak
Kubeapps de Helm de iyi çalışıyor; Helm’in yerini alacağını söylese bile muhtemelen Helm desteğini uzun süre tutacaktır
Helm’in sorunu, chart’lar büyüdükçe karmaşıklaşması
Her şeyin fiilen tek bir
templatesklasörüne girdiği yapı dağınık, YAML şablonlar için uygun değil vevalues.yamlaşırı büyüyorYapılandırma seçenekleriyle ilgili ayrıntıları paket yapılandırma belgelerinde görebilirsiniz: https://glasskube.dev/docs/design/package-config/
Helm’den daha hızlı olması satış argümanı olarak pek çekici değil
Helm’in sorununun hız olduğunu hiç hissetmedim
İlginç görünüyor
Mevcut araç olan ArgoCD ile nasıl örtüştüğünü ya da nasıl karşılaştırıldığını kısaca açıklarsanız anlamama yardımcı olur
Videoyu izledim ve kurduğu araçlardan biri Argo’ydu; yani belli ki farklı bir nişi dolduruyor, ama bunun ne olduğunu hâlâ tam bilmiyorum
Geliştiricilerin kümeye erişmeden şirketin temel uygulamalarının durumuna bakması için sıkça kullanılır
Glasskube, temel uygulamaların bağımlı olduğu paketlere odaklanır
Altyapı bileşenlerinin yaşam döngüsünü yönetir, güncellemeleri test eder ve yükseltme yolları sunar
Glasskube paketlerini GitOps deposuna koyup ArgoCD ile kümeye senkronize edebilirsiniz; geri kalanını PackageController halleder