- Sunucu dağıtımı ve süreç yalıtımı sorunlarının tarihini izleyen bu yazı, FreeBSD jails'in modern konteyner kavramını sektörden 10 yıl önce hayata geçirdiğini vurguluyor
- 2000 yılında FreeBSD 4.0 ile kullanıma sunulan jails,
chroot'u genişleterek dosya sistemi, ağ ve süreçlerin tam yalıtımını çekirdeğe yerleşik bir özellik olarak sağladı
- Linux, 2008'de LXC ve 2013'te Docker ile konteynerlere ulaştı; ancak bu süreçte namespace, cgroups, OCI gibi karmaşık soyutlama katmanları birikti
- Docker'ın iyi çözdüğü şey uygulama paketleme ve dağıtım (shipping) problemiydi; jails yalıtım konusunda güçlü olsa da yerel bir dağıtım standardının olmaması zayıf noktası
- Devam yazısında jail tabanlı altyapı kurma, ZFS snapshot'ları, Ansible provisioning gibi gerçek kullanım yöntemleri ele alınacak
İlk sunucu dağıtımlarının sorunu
- Onlarca yıl önce bir sunucuya bir şey dağıtmanın standart yolu, Total Commander, FileZilla, FAR Manager gibi araçlarla FTP üzerinden dosyaları elle kopyalamaktı; ileri düzey kullanıcılar
scp ya da rsync kullanıyordu ama öz aynıydı
- Tek kişinin çalıştığı projelerde hatalar büyük sorun değildi, ancak onlarca müşteri projesi yönetirken bu ölümcül hale geliyordu
- Tipik bir backend düzeninde, birden fazla web sitesi aynı Apache web sunucusu örneğini paylaşıyor ve aynı yaşam döngüsüne sahip oluyordu; Apache çökerse hepsi çöküyordu
- Trafik aniden arttığında bir site tüm kaynakları tüketirse, aynı sunucudaki diğer siteler sessizce boğuluyordu
- Sistem yöneticileri shell script'lerle otomasyon denedi, ancak sürüm yönetimi ya da geri alma için standart bir yöntem yoktu; bunun yerine proje klasör adlarına artan numara ya da zaman damgası eklemek gibi pratikler kullanılıyordu
Çözülmesi gereken iki temel sorun
- Dağıtım (Deployment): güvenilir aktarım, insan hatasının önlenmesi, sürüm yönetimi ve geri alma mekanizmaları, tüm iş senaryolarını kapsayan genel bir çözüm ihtiyacı
- Süreç yalıtımı (Process Isolation): uygulama ile sistemin birbirini koruması, bir uygulamanın gereksinimlerinin diğerini gizlice bozmasının önlenmesi, bağımlılık çakışmalarının çözülmesi
- Dağıtım sorununu çözme girişimleri zamanla modern CI/CD pipeline'larına, paketleme standartlarına ve sürüm kontrol sistemlerine dönüştü; ancak yalıtım sorununun tarihi görece daha az biliniyor
chroot'tan sanal makinelere
- 1979'da Bell UNIX tarafından tanıtılan
chroot, bir sürece dosya sisteminin yalıtılmış bir görünümünü sağlayarak onu belirli bir alt ağacın dışına erişemez hale getiren ilkel ama faydalı bir fikirdi
- Sınırları: yalnızca dosya sistemi yalıtımı sağlar; ağ, diğer süreçler ve sistem kaynaklarıyla hâlâ etkileşim kurulabilir ve bundan kaçmak da mümkündür
- İlk gerçek kurumsal çözüm sanal makineler (VM) oldu; VMware bunu 1990'ların sonlarında yaygınlaştırdı
- Her uygulamaya tamamen yalıtılmış bir OS ortamı sağladı, ancak her VM tam bir OS içerdiğinden kayda değer bir ek yük ve dakikalarla ölçülen açılış süreleri gibi maliyetler getirdi
FreeBSD Jails'in doğuşu
- 2000 yılında, ne Windows Server ne de Linux'ta, sessiz bir devrim FreeBSD'de yaşandı
- FreeBSD, Linux'tan temelde farklı bir şekilde çalışır: Linux yalnızca çekirdeği sağlarken, GNU userland'i, paket ekosistemi ve dağıtıma özgü tercihler bir araya getirilir; buna karşılık FreeBSD çekirdek, userland, temel araçlar ve kütüphaneleri tek bir tam OS olarak birlikte geliştirir, sürümlendirir ve test eder
- Bu tutarlı temel üzerine kurulan çözüm jails idi; Poul-Henning Kamp ve Robert Watson tarafından tanıtıldı ve FreeBSD 4.0'da (Mart 2000) çekirdeğe yerleşik bir özellik olarak sunuldu
- Her jail kendi dosya sistemi görünümüne, ağ yığınına ve süreç alanına sahiptir; ana sistem görünmez
- Ana çekirdeği paylaştıkları için neredeyse sıfıra yakın ek yük ve neredeyse anında başlatma süresi sağlarlar
- FreeBSD, bugün konteyner dediğimiz şeyin pratik uygulamasını sektörden 10 yıl önce üretim ortamında başarmıştı
Yalıtım teknolojilerinin zaman çizelgesi
- Yalıtım sorununun gerçek evrim yolu şuydu: yalıtımsız paylaşımlı sunucular → ağır ama yalıtılmış sanal makineler → hafif ve yalıtılmış konteynerler
- FreeBSD üçüncü aşamaya 2000 yılında ulaştı; Linux ise 2008'de LXC ile ulaştı, Docker da 2013'te ortaya çıktı
- Docker devrimci diye övülürken, FreeBSD jails zaten 13 yıldır olgunlaşmış ve sahada kanıtlanmış durumdaydı
Linux neden kazandı?
- Teknik üstünlük, ekosistem savaşlarında zaferi garanti etmiyor
- Linux, hızlı karar alma, GPL lisansının viral etkisi ve Red Hat ile IBM'in güçlü kurumsal desteği sayesinde kazandı
- Ardından Google, Facebook ve Amazon büyük ölçekli veri merkezleri için araçlar geliştirerek tüm sektörün yönünü belirledi
- Linux, "ticari lisans alamayanların ücretsiz OS'i" olmaktan çıkıp "sunucular için tek seçenek" haline geldi
Linux konteyner ekosisteminin karmaşıklığı
- Linux mühendisleri, yalıtım ve dağıtım sorunlarını çözmek için önce namespace, cgroups, seccomp gibi çekirdek primitive'lerini geliştirdi; ardından bunların üzerine LXC (2008) → OCI/runc (2015) → Docker/Podman (2013/2018) → Docker Hub gibi karmaşık soyutlama katmanları inşa etti
- Sonuçta, bulut tabanlı ve üreticiye bağımlı altyapılar için aşırı mühendislik ürünü, sızıntılı soyutlamalardan (leaky abstractions) oluşan bir yığın ortaya çıktı
- Günümüzde büyük ölçekli sistemlerde uygulama çalıştırmak için onu Docker ile konteynerleştirmek ve Kubernetes ile orkestre etmek örtük varsayılan haline geldi; bu artık birçok seçenekten biri değil, kendiliğinden kabul edilen tercih olarak sunuluyor
Docker'ın katkısı ve Jails'in zayıf yanı
- Docker'ın iyi çözdüğü konu shipping problemiydi: uygulamayı tüm bağımlılıklarıyla birlikte paketlemek, registry üzerinden dağıtmak ve her makinede aynı şekilde çalıştırmak için genel amaçlı bir standart sundu
- OCI image formatı fiili sektör standardı haline geldi
- Jails, yalıtım sorununu çok iyi çözüyor ancak shipping için yerel bir çözüm sunmuyor; Docker ekosistemine kıyasla jails ekosisteminin daha olgunlaşmamış görünmesinin temel nedeni de bu
- Topluluk da bu boşluğun farkında; bazı araçlar (cbsd, bastille, pot, appjail vb.) modern konteyner ekosistemini taklit etmeye çalışıyor, ayrıca FreeBSD'nin yerel primitive'lerinden yararlanan farklı yaklaşımlar da mevcut
Devam yazısına kısa bakış
- Bir sonraki bölümde FreeBSD tabanlı altyapının sadeliği ve zarafeti, jails'in temelleri ve nasıl çalıştığı, jail yöneticileriyle boilerplate'in nasıl azaltıldığı, Ansible ile provisioning ve dağıtım, ZFS snapshot'larının gücü ve tüm bunları birleştirerek Hypha için sağlam ve ölçeklenebilir bir altyapının nasıl kurulacağı ele alınacak
1 yorum
Hacker News yorumları
Ekosistem savaşı yalnızca teknik üstünlükle kazanılamadı
90'ların ortasında Linux; hızlı karar alma, GPL lisansının yayılmacı etkisi ve Red Hat ile IBM'in kurumsal desteği sayesinde büyüdü
Ben Linux'u 1994'te kurdum ama FreeBSD topluluğu 3.500 dolarlık PC'mi “pek de iyi değil” diye küçümsedi
IDE arayüzünde hata vardı ama Linux birkaç gün içinde bir geçici çözüm çıkardı; BSD tarafı ise sadece SCSI donanımı almamı söyledi
O zamanlar üniversite öğrencisiydim, param yoktu ve sonunda Linux gerçekçi seçenek oldu
Daha sonra FreeBSD'yi yeniden denedim ama o noktada Linux zaten ihtiyacım olan her şeyi yapıyordu
İlgili hata CMD640 wiki maddesinde özetlenmiş
Yine de FreeBSD'nin sistem genelinde tutarlılığı daha yüksek ve ses ya da event API'leri gibi temel bileşenlerin istikrarlı biçimde korunmasını seviyorum
En yeni donanım sürücüsü desteğinde Linux hâlâ daha iyi ama FreeBSD'nin fazla “Linuxlaşmamasını” umuyorum
Aslında modern bir *nix ile iki tarafta da neredeyse her şey yapılabiliyor. Artık mesele performanstan çok tercih ve alışkanlık
BSD ise AT&T davası yüzünden şirketlerin çekindiği bir taraftı; bu arada Linux pazarı ele geçirdi
Bugün de FreeBSD'yi savunan yazılar çıkıyor ama 90'larda şekillenen gidişatı kırmak zor
Yine de donanım desteğinde bugün bile hâlâ iyileştirme alanı olduğunu düşünüyorum
Yazı ilginçti
Linux çekirdeğindeki namespaces, cgroups, seccomp gibi primitive'lerin sonunda karmaşık bir soyutlama ekosistemi oluşturduğu görüşüne katılmıyorum
Linux başarılı olduğu için karmaşıklaştı; başarısız bir tasarım olduğu için değil
Eğer BSD ana akım olsaydı aynı şekilde “aşırı mühendislik” içeren bir ekosistem ortaya çıkardı
Container'lar sonuçta hafif VM'lerden ibaret, bu yüzden doğrudan gerçek VM kullanmanın daha iyi olduğunu düşünüyorum
Docker'ın popüler olmasının nedeni güvenlik izolasyonu değil, yeniden kullanılabilirlik ve ekosistemdi
FreeBSD'nin jail yapısı sade ve zarif ama Linux'taki OCI container'lar kullanımı çok daha kolay
Container'lar çekirdeğin tekil bir özelliği değil; çeşitli namespace'ler, mount'lar ve süreç izolasyonunun birleşiminden oluşan bir illüzyon
Linux'un bu tasarımı bilinçliydi ve cgroups ile seccomp yalnızca container'larda değil, systemd ya da flatpak gibi alanlarda da geniş biçimde kullanılıyor
“Cattle vs pets” felsefesi VM ve orkestrasyon katmanında uygulanabilir
Jail'lerin daha iyi olduğu iddiası bana pratikte inandırıcı gelmiyor
Docker'ın kazanma nedeni teknik izolasyon değil ekosistemdi
Dockerfile, public registry ve compose gibi araçlar sayesinde 30 saniyede çalışır bir ortam kurulabiliyordu
FreeBSD jail teknik olarak çok iyiydi ama giriş eşiği yüksekti
Son dönemde container yığınının karmaşıklığı yüzünden basit jail veya VM'lere dönmek isteyen bir eğilim de görülüyor
Ama mesele rekabet değil; sadece herkesin rolü farklı
FreeBSD'de böyle bir kavram yok ve image sistemi de yetersiz
FreeBSD Docker gibi kullanıcı deneyimi ve ekosisteme yatırım yapsaydı kullanıcı kitlesi birkaç kat artabilirdi
2005 civarında tüm şirket altyapısını FreeBSD üzerinde çalıştırıyorduk
Ama zamanla Linux hem kişisel kullanımda hem işte baskın hâle geldi
Artık Docker da yeterince iyi ve geri dönmek için mantıklı bir neden yok
Ancak çok çekirdekli CPU dönemine geç tepki verdiği için Linux ve Windows'un gerisinde kaldı
Şimdi performansı toparlandı ama sürücü eksikliği ve geliştirici sayısının sınırlı olması nedeniyle hâlâ dezavantajlı
GPU veya CUDA gereken yerlerde Linux, istikrarlı sunucular içinse FreeBSD kullanıyorum
FreeBSD'nin kullanıcı deneyimi daha tutarlı ama pratikte Linux “mutlu yol” hâline geldi
FreeBSD'yi tanıtan yazılar görmek her zaman güzel
FreeBSD 2000'de jail'i kullanıma sundu ama Linux tarafında OpenVZ ve VServer gibi benzer teknolojiler zaten vardı
Sonunda 2000'lerin sonlarında LXC çıkınca “FreeBSD öndeydi” algısı oluştu
Container ve VM'lerin izolasyonu nasıl gerçekleştirdiğini teknik olarak anlatan bir yazı olup olmadığını merak ediyorum
Sadece “aynı çekirdeği paylaştıkları için zayıf” düzeyinde değil, gerçek uygulama ayrıntılarını öğrenmek istiyorum
Son zamanlarda systemd-oomd gibi özellikler yüzünden FreeBSD'ye dönme isteği duyuyorum
Eskiden terminalde birden çok süreç çalıştırıp log bırakarak geliştirme yapardım,
şimdi ise systemd cgroup düzeyinde tüm süreçleri birden öldürdüğü için çalışmalarım kayboluyor
Bu tür geriye dönük uyumsuz sistem değişiklikleri geliştirme akışını bozuyor ve süreç izolasyonu için her seferinde systemd-run ya da Docker kullanmak zorunda kalmak sinir bozucu
Linux'un başarısının anahtarı GPL'nin bulaşıcı etkisi ve ağ etkisiydi
Kullanıcılar Linux'u standart olarak görmeye başlayınca donanım üreticileri de doğal olarak Linux sürücüleri çıkarmaya başladı
Çekirdeğin esnekliği sayesinde açık kaynak sürücü ekosistemi patlayıcı biçimde büyüdü