Containerization ve Virtual Machine Teknolojileri
CONTAINERIZATION ve VIRTUAL MACHINE TEKNOLOJILERI
Yazdığınız kod bilgisayarınızda sorunsuzca çalışmaktadır. Fakat, başkasının bilgisayarında çalışmayabilir. Bunun nedeni, sizin bilgisayarınızda bulunan kodun çalışmasını sağlayan Java versiyonu, gerekli kütüphaneler, yardımcı programlar, ram&işlemci farklılığı gibi ortam ve konfigurasyonun birebir aynısı karşı tarafta yoktur.
Bir makinemiz olduğunu varsayalım. Bu makine üzerinde kurulu ilk uygulamamız çalışmak için java 8, pyhton 2.7 ve tomcat 6’ya ihtiyaç duyuyor olsun. İkinci uygulamamızı ayağa kaldırmamız gerektiğinde o da nodeJs 10, python 2.8 ve redis 4 ‘e ihtiyaç duyuyor olsun. Bu noktada python versiyonlarının birbiriyle conflict çıkarmaması için ekstra dikkat etmemiz gerek. Bir de resimdeki gibi 3. bir uygulama geldiğinde artık sistemde 3 ayrı python, 2 ayrı java ve redis versiyonu olacak ve sistem bakımı zor bir zombi sistemi var.
VİRTUAL MACHİNE (SANALLAŞTIRMA)
Yukarıda anlattığım sebeple yazılım dünyasında programların birbirlerinden izole çalışmasını kolaylaştırmak için bir çok sistem tasarlanmıştır. Bunlara en büyük çözümlerden biri virtual machine yani sanallaştırma teknolojileri oldu.
Sanal makina aslında bir bilgisayar sisteminin emulasyonudur. Donanımda birçok ayrı bilgisayar gibi gözüken sistemlerin aslında bir bilgisayar olarak çalıştırılmasına olanak sağlar. Her sanal makine kendi temek işletim sistemine ihtiyaç duyar ve donanım sanallaştırılır. Bununla beraber, ihtiyaç duyulan çeşitli kütüphaneler de bunun içindedir. Sanal makinenin işletim sistemi ana makinenin işletim sisteminden tamamen ayrıdır. Ana makinede windows çalışırken sanal makinede linux çalışabilir. Ancak, sanal makine tüm işletim sistemi ve buna bağlı programları içine aldığı için hızlıca onlarca gb büyüklüğüne ulaşabilir ve başlatması uzun sürer. Daha fazla kaynak gerektirir ve maliyetlidir. Her sanal makine kendine tahsis edilmiş sistem kaynaklarını kullanır. Yani ne kadar sanal makineniz varsa bunlara yetecek sistem ve kaynağınız olmalı ve sanal makinelerde kullanılan her bir işletim sisteminin ayrı ayrı güncellemeleri ve güvenlik yamalarının yapılması gerekir.
Vmware vSphere, KVM, Virtualbox, Microsoft Hyper-V Yaygın olarak kullanılan hypervisor’lerdendir.
Örneğin, amazon bünyesindeki yüksek donanımlı serverları sanal makinelere bölmektedir. Siz amazondan bir makine istediğinizde size biz sanal makine ayırır. Tabiki eğer dedicated seçmediyseniz. Seçtiyseniz bu durumda size tamamen bir server ayrılır.
Peki bu sanal makinalar nasıl çalışıyor? bunların ana makinayla bir bağlantısı olması gerekmiyor mu? İşte bu bağlantının adı hypervisordur yani sanal makinaları çalıştıran yazılım veya donanım. Donanım ile sanal makina arasında bulunur.
CONTAINERIZATION
Containerization teknolojisi sanal makinalara alternatif olarak çıkmıştır. Docker, konteyner teknolojisi oluşturarak uygulama oluşturmayı, dağıtmayı ve çalıştırmayı kolaylaştıran bir araçtır ve hem ürünün hem de şirketin ismidir.
Konteyner kodu ve tüm bağımlılıklarını paketleyen standart bir yazılım birimidir. Bu sayede uygulama bir bilgisayar ortamından diğerine hızlı bir şekilde paylaşılır ve çalışır. Bilgisayarı sanal bir makine gibi sanallaştırmak yerine yalnızca işletim sistemini sanallaştırır yani docker containerin içinde misafir işletim sistemi yok. Konteynerler fiziksel bir sunucunun ve ana işletim sisteminin üzerine oturur. Her konteyner ana bilgisayar işletim sistemi çekirdeğini ve kütüphaneleri paylaşır ve işletim sistemi kodunu çoğaltma ihtiyacını önemli ölçüde azaltır.
Docker konteynerlerin ana bilgisayar sistemiyle çalışmasına olanak sağlayan araç ise Container engine dir. En bilinenleri Linux container ve Windows server container enginedir.
CONTAINER TEKNOLOJILERI NEYE ÇÖZÜM GETIRDI?
Konteyner teknolojilerinin çözdüğü sorunu daha iyi anlayabilmek için bir örnek üzerinden ilerleyelim. Diyelim ki elimde 10 tane uygulamam var. Her uygulama da 1 core cpu, 1 gb ram ve 10 gb disk tüketiyor olsun. Totalde uygulamalar için ihtiyacım 10 core cpu, 10 gb ram ve 100 gb disk alanı olacaktır. Böyle bir sistemi ele alarak konteyner teknolojisinin çözdüğü sorunu anlamaya çalışalım.
İlk Senaryo ; Eski usül yöntem
10 tane makina satın almamız gerekir. Piyasadaki en küçük makina da 4 core cpu 4 gb ram ve 120 gb diske sahiptir. Bu şekilde makinalardan 10 tane, bir tane de yedekte duracak şekilde 11 tane makina satın almamız gerekir. Hepsine linux kurduğumuzu varsayalım. Kurulu linux işletim sistemi de kendi işlerini yapabilmek için 1 core cpu 1 gb ram ve 10 gb disk alanı kullanıyor olsun. Ardından java uygulamasının çalışması için gerekenleri ve uygulamaları tüm makinalara kurduğumuzu varsayalım. Ortamda yönetmem ve bakım yapmam gereken 11 tane makina var. Bu durumda her makinada da 2 core işlemci 2 gb ram ve 100 gb disk alanı boş kalıyor. Makinaların yarıdan fazla gücü atıl durmda.
İkinci Senaryo ; Virtualization
Bu sefer aynı makinelerden 6 adet aldım. Üstüne sanallaştırma katmanını ekleyip ve bağlantıları kurduğumu varsayalım. Linux işletim sistemi de kendi işlerini yapabilmek için 1 core cpu, 1 gb ram ve 10 gb disk alanı kullanıyordu. Uygulama da Her uygulama 1 core cpu(işlemci) 1 gb ram ve 10 gb disk tüketiyordu. Yani ben bu durumda bir fiziksel sunucuya iki tane sanal makina kurabilirim. Bu durumda iki sanal makinada 2 adet işletim sistemi toplamda 2 core cpu, 2 gb ram ve 20 gb disk alanı tüketecek. Bu şekilde toplamda 5 fiziksel sunucu üzerinde 10 sanal makina çalıştırabilirim. Yedek makinayla beraber, 6 adet bakım yapmam ve izlemem gereken makina var ve ortada atıl kapasite yok. Sanallaştırmanın çözdüğü problem tam olarak buydu. Atıl kapasite ve makinaların maintenance maliyeti.. Bir makinayı sıfırdan kurup işletim sistemi yükleyip uygulama çalıştırmak 5 gün sürüyorsa bir sanal makinesi çalıştırmak işletim sistemi kurmak 10 dakika sürüyor.
Üçüncü Senaryo ; Containerization
Bu sefer 4 adetmakine alıyorum işletim sistemi kurup docker engine yüklüyorum. İşletim sistemine gidenleri düşünce 1 adet makinada 3 core cpu 3 gb ram ve 110 gb disk kalmış olsun. Yani her makinada 3 konteyner çalıştırabilirim. Tüm yükü toplam 4 makinada halledebilir ve sadece 4 makina bakımın ve işletim sisteminin yönetimini yapmam gerekir. Conteyner’in çözdüğü sorun da buydu. İşletim sistemi yükünü üzerimizden attık. İşletim sistemini değil uygulamayı sanallaştırdık ve konteyner bunu çok daha küçük bir maliyetle yapar. Konteynerler sanala makinelere kıyasla çok daha hızlı çalışır ve ayağa kalkar. Çünkü zaten başlatılmış bir işletim istemi üzerinde çalışır ve saniyeler içinde çalışmaya başlar. En öneml ifark da bir saanl makineyi paketleyip başka bir yerde çalıştırmak mümkün olsa da çok daha maliyetlidir ve ayar gerektirir. Konteyner imajini docker engine üzerinde olan tüm makinalarda çok kolaydır.
Container ve Virtual Machine Arasındaki Farklar
Virtual Machine Teknolojisi
- Donanım düzeyinde sanallaştırma yapar.
- Donanımla VM arasında donanımı VMlere paylaştıran hypervisor vardır.
- Her VMin kendi işletim sistemi vardır ve ana hostun donanımını paylaşırlar.
- Container’a göre çok daha fazla size ve resource kullanır ve ağırdırlar başlaması dakikalar alır.
- Tamamen izole birbirlerinden ve sistemden izole bir yapıları vardır.
Containerization Teknolojisi
- İşletim sistemi düzeyinde sanallaştırma yapar.
- Direkt host işletim sistemi üzerinde çalışır. Tüm konteynerler ana bilgisayar işletim sistemini paylaşır.
- Çok daha lightweight ve mbler boyutunda hafiftir.
- Vmlerin de içerisinde containerlar olabilir.
- Az kaynak kullanır ve başlaması saniyeler alır.
- işletim sistemi seviyesinde process düzeyinde bir izolasyon sağlar.