Kubernetes, Mikroservisler ve Konteynerler
Bütünleşik (Monolithic) Yazılımlar
Yazılım geliştirmenin ilk dönemlerinin "normali"
Büyük tek bir kod ağacı var.
Tüm işlevler birbirine sıkı sıkıya bağlı: Birimiz hepimiz, hepimiz birimiz için
Tek bir bütün servis çalışıyor
Yazılımın büyüklüğü ve yazılımcı sayısı artınca sorunlar artıyor.
Bölelim ve Yönetelim (Mikro/Makro Servisler)
Yazılımı birden fazla parçaya bölelim.
Yazılımlar arasında veri paylaşımı için standartlar (SOAP, REST API vs) belirleyelim.
Yazılımlar bu standartlar dahilinde istedikleri gibi "takılsınlar"
Birbiriyle beraber çalışması gereken yazılım sayısı artınca bu yapı da kendi sorunlarını oluşturdu.
Bölünen Yazılımların Beraber Yönetimi
r1: Kocaman bir donanım alalım, tüm servisler tek bir işletim sistemi üzerinde çalışsın.
r2: Daha çok sayıda daha küçük donanımlar alalım, servisleri ayrı donanımlara bölelim.
r3: Çok sayıda donanım yönetmesi dert oluyor, büyük donanımlara geri dönelim ama sanal makineler kullanalım.
r4: Çok sayıda donanımda çok sayıda sanal makine yönetmek zor oluyor. Bulutlaşalım.
r5: Sırf yazılımları birbirinden izole edeceğim sanal makine hem donanım hem bakım maliyetine yol açıyor. Konteynerleşelim.
Konteyner Nedir?
Bir uygulama ihtiyaç duyacağı tüm parçalar ile beraber bir imaj olarak paketlenir.
İmaj izole bir konteyner içerisinde çalıştırılır.
Linux’un kontrol grupları (cgroups) ve süreç izolasyonu altyapısını kullanır.
Her bir konteyner ana işletim sisteminin temel işlevlerini ortak kullanır.
İmaj sabit ve değişmeyen bir dosyadır.
Soru(n)lar
Konteyner çalışırken oluşturulan dosyalar ne olacak?
Konteyner içine nasıl uygulama kuracağım?
Konteynerin ürettiği loglar ne olacak?
Konteyneri nasıl izleyeceğim? (monitoring)
Konteynerin yedeklenmesi?
Farklı konteynerde çalışan uygulamalar nasıl birbiriyle haberleşecek?
Konteyneri nasıl güncelleyeceğim?
Konteyner çalışırken başka konteynerlere ihtiyaç duyuyorsa?
Aynı imajı bir-iki ayar farklılığı var diye baştan mı oluşturacağım?
ve daha niceleri :)
Konteyner Yönetiminin Gelişimi
2008: LXC, Linux’a cgroups desteğinin gelmesi ile konteyner yönetimi başlar.
2009: Apache Mesos veri merkezi (DC) yönetimi odaklı. VM de yönetebiliyor. Çok ağır siklet. Zor öğreniliyor.
2013: Docker birçok yeniliği getirdi:
Dockerfile ile kolay imaj üretilmesi.
Dockerhub ile merkezi imaj deposu.
Taşınabilir (portable) imajlar.
Geliştirici ortamına kolay kurulum.
2014: Kubernetes, konteyner sayısı arttığında yapılması gerekenleri bir "dağıtım" halinde sunuyor.
Konteynerlerin Avantajları
Konteyner imajı sabittir (immutable). Güvenlik avantajı sağlar.
İmaj her yerde aynı şekilde çalışır. Test ve hata ayıklama kolaylığı sağlar.
Daha az kaynak tüketir.
Aynı konteyner imaj dosyasından n tane konteyner çalıştırılabilir.
Geliştiriciler "self-servis" uygulama çalıştırabilir. Sürekli sistem yöneticisinin kapısını çalmazlar.
Konteynerlerin Verimli Kullanımı için Ne Gerekli?
El değmeden sıfırdan otomatik kurulabilen yazılım parçaları
"Stateless" çalışan yazılım parçaları
Geliştirme, test etme ve işletmenin farklı kişiler tarafından yapılması
Yazılım yaşam döngüsü (SDLC) süreçlerinin oturmuş olması
Ne Zaman Ne Kullanmalı?
Fiziksel makine? Sanal makine?
Sanal makine? Konteyner?
Docker? Kubernetes? Başka bir araç?