Tek sunucuya çok sunucu sığdırmanın diğer yolu: Konteyner tabanlı sanallaştırma

Daha verimli kaynak yönetimi, çok hızlı yaratılıp başlatılabilen “hafif” ve küçük sanal makinalar, basit yönetim. Konteyner tabanlı sanallaştırmaya hoşgeldiniz. Bu sefer çok fazla teknik ayrıntıya girmeyeceğim, söz. 🙂

Konteyner sanallaştırmasında LXC kullanıyorum ben. Kolayıma o gelmişti, tamamen bu yüzden. BSD tarafında Jails var, Solaris’te Solaris Containers vardı en son, bir de LXD çıktı. Bu makalede tabii LXC’yi göreceksiniz.

Esasen yeni bir fikir falan değil bu, uzun yıllardır yapılıyordu. Türkiye’de bilgi işlemciler de sadece Windows çalıştığından pek duymadınız. Çok basit haliyle, işletim sisteminin çekirdeğinin, çalıştıracağı programlara(1) bir tür “kimlik” verebildiğini düşünün. Bu kimlikle programların ayrı sanal makinalardan geldiğini anlayabiliyor olsun.

Şimdi bilgisayarınızdaki bir klasörü “sanal makina” ilan edin ve uygun dosyaları koyduğunuzu varsayın. Bir de bunun ayarlarını konteyner sanallaştırma sistemine söyleyecek basit bir ayar dosyası. Ta-daaa! Aşağıda bu makaleyi yazdığım bilgisayarımda bulunan sanal makinaları görüyorsunuz.

Şunlar da bahsettiğim “sanal makina klasörleri”:

Burada 3 tane sanal makina var aslında (girdilerden bir tanesinde yanlış tuşa basmışım ama belli ki acelem varmış umursamamışım 🙂 ). django0, webserver0 ve openproject. Sonraki komutta basitçe django0 adlı sanal makinanın içine bakmışım. Oradaki iki girdi önemli:

  • rootfs dizini: Bu dizin (klasör) sanal makinanın kendi dosyalarını barındırıyor.
  • config dosyası: Bu dosya da sanal makinanın ayarlarını tutuyor; ethernet kartının MAC adresi, IP adresi gibi.

Daha fazla detay beklediğinizi biliyorum ama cidden aslında hemen hemen bu kadar basit. İnanmıyorsanız rootfs dizininin içeriğine bakalım:

Bilgisayara kurduğunuz herhangi bir Linux sistemde de bu dosyaları görecektiniz.

Peki bu bize ne sağlıyor?

Son derece hızlı sanal makina yaratma olanağı

Sanal makina dediği bir grup dosyanın indirilip bir klasöre atılması ve birkaç ufak tefek işlemden ibaret. Ayrıca bu dosyalar önbellekte tutuluyor, yani bir sanal makina tipini bir kere kurduysanız aynısından bir tane daha yapmak çok kısa sürüyor. Ben sanal makinalarımda da Debian kullanıyorum, aynı şablonla yeni bir sanal makina yaratma işlemini 2011 model bir Thinkpad X220’de az önce sizin için kaydettim:

Küçük, hafif sanal makinalar

Bütün bir işletim sistemini kurmuyorsunuz demiş miydim? Az önce kurduğum sanal makinanın bulunduğu klasörün boyutuna bakın.

Kaynak yönetimi kolaylığı

KVM gibi tam kapsamlı bir sanal makinayı oluştururken disk, bellek ve işlemci ayırmak, bunları optimize etmek gibi yükleriniz de oluyor. LXC’de sizin sanal makinanız konak işletim sisteminizin çekirdeği için herhangi bir programdan (hemen hemen) farksız. Dolayısıyla kullanacağı kaynakları doğrudan yönetiyor.

Bu kolaylık aslında sanal makina yoğunluğunu artırmanız için bir fırsat da sağlıyor. Kaç GB belleği kime ayırdım, acaba az mı çok mu geldi diye pek kafa yormuyorsunuz. Tam kapsamlı sanal makinalarda örneğin 16GB belleği üç sanal makinaya paylaştırdınız, hepsine 8’er GB verdiniz diyelim (hatırlayın, yapabiliyorsunuz). Bunlardan birinin daha fazlasına ihtiyaç duyduğu anlarda performans sorunları yaşayabilirsiniz. Bu sunucuları LXC olarak yapmış olsaydınız Linux çekirdeği zaten yönetecek ve muhtemelen pek önemli bir bellek sıkıntısı da yaşamayacaktı. Yine sanal makinaların komutlarının hangi işlemci çekirdeğinde işlendiği gibi mevzular performansı etkiliyor, LXC’de bunu da düşünmüyorsunuz.

Kaynak verimliliği ve performans

“Ooo bu uçar kaçar o zaman?” demeden önce size zaten KVM’nin de gerçek bir kurulumdan sadece %2-3 yavaş olduğu bilgisini vereyim. 🙂 LXC de ancak üstünde çalıştığı konak işletim sisteminin hızında olur.

Ama önceki başlıkta söylediğim, konak işletim sisteminin çekirdeği açısından sanal makinaların birer programdan ibaret olması çekirdeğe kaynak paylaşımında başka teknik güzellikler de sağlıyor. Birbirine benzeyen üç tane LXC sanal makinası bellekte de muhtemelen benzer şeyler tutuyor. Konak işletim sistemi çekirdeğiniz de bunların üçünden ayrı ayrı gelen benzer veriyi bellekte üç ayrı yerde tutmak yerine aynı yerden üçüne de hizmet veriyor(2).

Aşağıda kişisel Wikim için Mediawiki kurulumumu taşıyan webserver0 adlı sanal makinamın bellek kullanımını bayt cinsinden görüyorsunuz. 160MB gibi bir değere tekabül ediyor.

Tek tek sanal makina performansına baktığınızda KVM gibi tam sanallaştırma canlısından %2-3 kadar yavaş demiştim ama toplam sistem yükünde biraz daha fazlası olacaktır. KVM ile o sanal makinaların yönetiminden sorumlu hipervizör sisteme bir miktar ek yük getirecek. Ayrıca sanal makinaların komutlarının dönüştürülüp işlenmesi de.

Tüm bunların ışığında, LXC gibi konteyner tabanlı sanallaştırmayla, aynı sunucu üstünde daha fazla sayıda sanal makina çalıştırabileceğinizi rahatlıkla söyleyebilirim.

Eksileri ve kişisel tercihim

Kime sorsanız aynısını söyler: Eğer kontrollü bir ortamınız yoksa güvenlikle ilgili unprivileged containers, SELinux, AppArmor gibi anahtar kelimeleri öğrenmeniz gerekebilir. Bu anlamda KVM türü tam sanallaştırmanın avantajı sanal makinaların kendi bellek alanlarının daha iyi sınırlandırılmasıdır. LXC’de konuk makinadan konak makinaya ulaşmak veya tam tersi daha kolay. Dolayısıyla çok kontrollü bir ortam dışında yeni makinayı “basıp geçmemek” gerekiyor. Bu saydıklarım çok zor şeyler de değiller, o yüzden LXC kullanmamak için bir sebep olarak da saymam mümkün değil.

Windows camiasından gelenler için kötü haber: Linux’ta LXC ile Windows sanal makina yaratamıyorsunuz. Dedim ya, sanal makinalar da konak makinanın işletim sistemi çekirdeğini kullanan, kendileri “çekirdeksiz” makinalar. 🙂

Ortak çekirdek kullanımının uzak ihtimal olsa da bir diğer tehlikesi bir kernel (çekirdek) hatasının tüm makinaları etkileyecek olması. Gerçi böyle bir durum KVM’de konak makinanın çekirdeği için de aynı şekilde olmamakla birlikte geçerli.

Benim kullanım senaryom şu şekilde:

  • Epeyce “izole” diyebileceğim, birbirlerine bulaşacak pek bir şey çalıştırmayan LXC makinaları kullanıyorum.
  • Uzun vadeli kullanmak istediğim web sunucusu gibi uygulamaları tamamen LXC’ye aktarmış durumdayım. Bunların ZFS görüntülerini düzenli alıp yedekliyorum. Böylece ana sistemimin çökmesi veya kaybolması gibi durumlarda yeni bir kuruluma kısa sürede bunları aktarabiliyorum.
  • Linux’ta çalışacak yeni uygulama testlerimi yine LXC’de gerçekleştiriyorum. Bunlar için yeri geliyor kullan-at LXC makinaları oluşturuyorum.
  • Masaüstü sanallaştırmasında KVM devam. Ekran kartını  ve belirli USB portlarını sanal makinaya geçirdikten sonra pek bir şeye kafa yormadan yapmak kolayıma geliyor. Elbette Windows sanallaştırmasında mecburen KVM kullanıyorum.
  • Haliyle, Windows tabanlı veya Linux da olsa grafik masaüstü ortamı isteyen uygulama testlerim için KVM elimin altında. LXC’ye göre bir miktar daha uğraştırıyor ve sanal makina sayısı artınca performans kaybı yaşatıyor ama ihtiyaçlarımı karşılıyor.

Notlar

  1. “Programlar” değil de, kod parçası diyelim aslında onlara. LXC’de konak işletim sisteminin bakış açısından sanal konteyner’ların tıpkı birer program gibi işlem gördüğünden hareketle basitleştirdim onu.
  2. Bunun benzerini ve başka teknolojileri KVM de kullanıyor aslında. LXC’de bu iş daha basit sadece.
  3. Dikkatli olanlarınız “privileged”, ayrıcalıklı konteyner’lar kullandığımı farketmiş olabilir. Evet kişisel makinamda üşeniyorum. 🙂

 

 

 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir