Konteynerler, sanal makinelerin erişemediği bir çeviklik ve esneklik düzeyi sunarlar. Bu teknoloji, uygulamalara ihtiyaç duyduklarında daha fazla bilgi işlem ve bellek kaynağı kullanma imkanı tanıyarak, ölçeklenebilirliği artırır. Özellikle, kaynakların dinamik olarak ayarlanabilmesi, uygulamaların tanımlanan sınırlar içerisinde gerektiğinde daha fazla kaynak tüketmesine olanak sağlar.
Bunun yanı sıra, konteynerler, uygulamaların hem genel hem de özel bulut ortamlarında paylaşılmasını ve dağıtılmasını basitleştirir. Bu, operasyon ve geliştirme ekiplerine, çoklu platform dağıtımlarının karmaşıklığını azaltma fırsatı verir ve tutarlı bir çalışma ortamı sağlar. Ayrıca, konteyner teknolojisi, geliştirme, test, hazırlık ve üretim aşamalarında kullanılabilen ve “bir kez yaz, her yere dağıt” yaklaşımını güçlendiren ortak yapı taşları sunar.
Konteynerlerin sanallaştırma teknolojileriyle kıyaslandığında, DevOps‘un temel prensipleri olan esneklik, tutarlılık ve uygulamaların hızlı bir şekilde devreye alınması konularında önemli avantajlar sağladığı görülmektedir. Bu teknoloji, modern yazılım geliştirme ve dağıtım süreçlerinde kritik bir rol oynayarak, işletmelerin daha hızlı ve etkin bir şekilde yenilik yapmalarını destekler. Bu özellikleriyle, konteynerler günümüzün dinamik IT ortamlarında vazgeçilmez bir araç haline gelmiştir.
Key Factor | Virtualization | Containerization |
Teknoloji | Bir fiziksel makinede birden çok işletim sistemi bulunur ve birden çok makine olarak görünür. | Aynı işletim sistemine ve aynı makineye sahip bir ana bilgisayar ortamında geliştirilen uygulama, birden çok farklı ortamda kusursuz bir şekilde yürütülür. |
Start-up Time | Daha Uzun | Daha Kısa |
Çalışma Hızı | VM’ler, ana sunucunun kendi işletim sisteminde sanal bir kopyası olduğundan, VM’ler kaynak ağırlıklıdır, bu nedenle daha yavaştır. | Container’lar sanallaştırma ortamlarına göre daha hızlı çalışırlar |
Kapladığı Alan | Daha Fazla | Daha Az |
Sanallaştırma Katmanı | Donanım | Yazılım (OS) |
Uygulama Maliyeti | Yüksek | Düşük |
Faydaları | Sistem ekibi | Sistem ekibi ve Geliştirme Ekibi |
Docker ise açık kaynak kodlu bir teknoloji olarak 2013 yılında mart ayında piyasaya sürüldü. Başlangıçta Docker’ın varsayılan yürütme ortamı Linux Konteynerleri (LXC) olarak belirlenmişti. Ancak, teknolojinin gelişimiyle birlikte Docker, 2014 yılında 0.9 sürümünü yayınladığında, önemli bir değişikliğe gitmiştir. Bu sürümde, LXC yerine Docker’ın kendi oluşturduğu, Go programlama dili ile yazılmış olan libcontainer adlı bileşen kullanılmaya başlanmıştır. Bu değişim, Docker’ın kendi teknolojisini daha iyi kontrol etmesine ve optimize etmesine olanak tanımıştır.
Docker‘ın gelişimi, 2017 yılında bir diğer önemli aşamaya ulaştı. Bu yıl içerisinde, Docker, daha fazla açık kaynak araştırma ve geliştirme çalışmasına katkıda bulunmak amacıyla Moby Projesi’ni başlattı. Bu proje, Docker’ın altında yatan teknolojiler üzerindeki çalışmaları daha geniş bir geliştirici topluluğuyla paylaşmayı ve bu teknolojilerin gelişimini teşvik etmeyi amaçlamaktadır. Bu adım, Docker’ın açık kaynak topluluğu içindeki etkisini ve katkısını güçlendirmiş ve konteyner teknolojisinin daha geniş bir kitle tarafından benimsenmesini sağlamıştır. Docker‘ın bu yolculuğu, modern yazılım geliştirme pratiklerinde konteyner kullanımının yaygınlaşmasında önemli bir rol oynamıştır.
Neden Docker?
- Üretkenlik ve çeviklik
Docker, yazılım geliştirme ve yayımlama pratiklerinde devrim yaratan bir araçtır, zira operasyonel sürekliliği sağlar ve bu sayede yapım ve bakım süreçlerini hızlandırır. Bu teknoloji, farklı geliştirme, test ve üretim ortamları arasında tutarlı bir deneyim sunarak sistem entegrasyonunu kolaylaştırır ve hata olasılığını düşürür. Docker, ayrıca, bileşenlerin bağımsız olarak dağıtılmasını mümkün kılar, bu da karmaşık sistemlerin daha verimli bir şekilde güncellenmesine ve yönetilmesine olanak tanır.
Docker ile bileşenlerin izolasyonu, test süreçlerini basitleştirir ve farklı çalışma zamanı sürümlerini destekleyerek, çeşitli teknolojilerin ve sürümlerin bir arada kullanılmasını sağlar. Bu, kompleks sistemlerin daha sorunsuz çalışmasına katkıda bulunur. Docker, standart bir derleme hattı ve dağıtım mekanizması sağlayarak, yazılım geliştirme süreçlerini daha belirgin ve yönetilebilir hale getirir.
Docker’ın kaynakların kendiliğinden hizmet olarak sunulması özelliği, ekiplere gerektiğinde kaynaklara erişim imkanı verir ve bu kaynakları hızla devreye sokmalarına olanak tanır. Bu durum, kontrolün dağıtımıyla ekip özerkliğini artırır ve bileşenlerin kapsamını ve sahipliğini daha etkin bir şekilde yönetmeyi mümkün kılar. Docker‘ın teknoloji seçiminde sağladığı özgürlük, ekiplere ihtiyaçlarına uygun en iyi araçları ve dilleri seçme esnekliği sunar. Bu özellikler, Docker‘ın yazılım geliştirme ve dağıtımında nasıl bir üretkenlik ve çeviklik artışı sağladığını açıkça ortaya koyar.
- Gelişmiş esneklik
Docker, esneklik yönünden oldukça gelişmiş özelliklere sahip olup, bu da bir dizi avantaj sunmaktadır. Öncelikle, Docker konteynerlerının hızlıca yeniden başlatılabilir olması, yüksek kullanılabilirlik konfigürasyonlarındaki sistemleri çabucak eski durumlarına döndürme yeteneğini güçlendirir. Bu özellik, beklenmedik kesinti ve hatalara karşı sistemlerin dayanıklılığını artırır ve kesintisiz hizmet sunumu sağlar.
Docker, ayrıca güvenli ve izole dağıtım imkanı sunarak, mevcut bileşenlerin istikrarsızlaşma riskini azaltır. Bu, özellikle büyük ve kompleks sistemlerde yeni güncellemelerin ve özelliklerin sorunsuz bir şekilde entegre edilmesine olanak tanır. Tek kullanımlık bileşenler, basit yüksek kullanılabilirlik ve ölçeklendirme için hızlı başlatma/durdurma işlemlerini mümkün kılar, bu da dinamik ve talebe bağlı uygulama ortamları için büyük bir avantaj sağlar.
Docker‘ın amaca yönelik ayrık topoloji oluşturma kabiliyeti, farklı uygulama ihtiyaçlarına esnek bir şekilde yanıt verir. Bu topolojiler, her uygulamanın özel gereksinimlerine göre uyarlanabilir, böylece en uygun yapılandırma elde edilir. Dahası, Docker‘ın çoğaltma prensibi ve yerleşik yeniden devreye alma mekanizmaları, sistemlerin otomatik olarak kendilerini onarmalarını ve kesintisiz çalışmalarını sağlar.
Docker, sıralı yükseltmeler, canary relases ve A/B testleri gibi yöntemlerle detaylı dağıtım imkanı sunar. Bu, yeni özelliklerin ve güncellemelerin tüm sistem üzerindeki olumsuz etkileri minimize ederek dikkatlice uygulanmasını sağlar. Docker’ın bu gelişmiş esneklik özellikleri, modern yazılım geliştirme ve dağıtım ihtiyaçlarına uyum sağlamakta ve teknolojinin hızla değişen dünyasında rekabet avantajı sunmaktadır.
- Ölçeklenebilirlik ve optimizasyon
Docker, özellikle ölçeklenebilirlik ve optimizasyon konularında sağladığı özelliklerle sektörde öne çıkıyor. Bu platform, standart konteyner tabanlı dağıtımlarla birlikte yük dengeleme, yüksek kullanılabilirlik, esnek ölçeklendirme, devamlı güncellemeler ve geri alımlar gibi önemli işlevleri başarıyla yerine getiriyor. Bu işlevler, uygulamaların performansını iyileştirirken aynı zamanda sistemlerin genel kararlılığını da güçlendiriyor. Bunun yanı sıra, Docker‘ın günlük kayıt, izleme ve kaynak kullanımı ölçümleme yetenekleri, uygulama ve sistemlerin genel görünürlüğünü artırıyor, bu da uç nokta yönetimi ve bileşenler arası güvenlik yönetimini kolaylaştırıyor.
Docker, tüm uygulamalar ve çalışma zamanı ortamları için tek bir altyapı platformu sağlıyor. Bu özellik, çeşitli projeler ve ortamlar arası transferi basitleştiriyor, ekiplerin farklı çalışma ortamlarına kolayca uyum sağlamasına olanak tanıyor. Bu durum, DevOps süreçlerinde gereken becerilerin daha hızlı ve kolay bir şekilde kazanılmasına yardımcı oluyor.
Docker‘ın sunduğu başka bir önemli özellik ise, farklı ortamlar arasındaki tutarlılığı iyileştirmesi. Bu, sistemlerin test, geliştirme ve üretim ortamları arasında tutarlı bir şekilde çalışmasını sağlıyor, bu da geçiş süreçlerini daha sorunsuz hale getiriyor. Ayrıca, Docker’ın derleme, dağıtım ve topoloji yönetimi süreçlerini otomatize etme yeteneği, iş yüklerini azaltıyor ve süreçleri daha etkin hale getiriyor.
Docker‘ın sağladığı ölçeklenebilirlik ve optimizasyon özellikleri, modern yazılım geliştirme ve yönetim süreçlerini destekliyor, bu da ekiplere daha hızlı, güvenilir ve etkin bir çalışma ortamı sunuyor. Docker’ın bu avantajları, yazılım endüstrisindeki popülerliğinin ve yaygın kullanımının ana sebeplerinden birkaçıdır.
- Operasyonel tutarlılık
Docker, operasyonel tutarlılık açısından bir dizi kritik yarar sunar. Öncelikle, Docker’ın her bir işlevin ayrıntılı ölçeklendirilmesi yeteneği, sistem yöneticilerine ve geliştiricilere, ihtiyaca göre uygulama bileşenlerinin ve hizmetlerin boyutlandırılmasında esneklik sağlar. Bu, özellikle değişken trafik yoğunluğu veya yük artışı gibi durumlarda, hızlı ve etkili bir şekilde tepki verme kabiliyeti açısından hayati önem taşır.
Docker, maksimum bileşen ve kaynak yoğunluğunun elde edilmesine imkan tanıyarak, altyapı kaynaklarının daha verimli kullanılmasını sağlar. Bu, daha az donanım kaynağı kullanarak daha fazla uygulama ve hizmetin çalıştırılabilmesi anlamına gelir, böylece hem maliyet tasarrufu hem de sistem verimliliği artışı sağlanır.
Sanal makinelerle kıyaslandığında, Docker konteynerlerinin izolasyon için gereken genel giderlerinin daha düşük olduğu görülür. Konteynerler, tam bir işletim sistemi gereksinimi olmadan hafif ve hızlı bir şekilde çalışır, bu da sistem kaynaklarının daha verimli kullanılmasına ve aynı donanım üzerinde daha fazla uygulama veya hizmetin barındırılmasına olanak tanır.
Docker, CPU, bellek ve kalıcı depolama birimleri gibi kaynakların dinamik ve esnek bir şekilde sağlanmasını kolaylaştırır. Bu, uygulama ve hizmetlerin değişen ihtiyaçlara hızla uyum sağlamasını ve böylece performans ile kullanılabilirliğin en üst düzeyde tutulmasını sağlar. Bu yetenekler, Docker‘ın operasyonel tutarlılık alanındaki önemli faydalarını oluşturur ve Docker‘ın modern yazılım geliştirme ve işletim süreçlerinde neden bu kadar yaygın olarak kullanıldığını açıklar.
- Bileşen bazında taşınabilirlik
Docker, bileşen taşınabilirliği açısından önemli katkılarda bulunur. Konteynerler, belirli bir bulut altyapısındaki çeşitli düğümler arasında dinamik olarak yeniden dağıtılabilir özelliğe sahiptir. Bu özellik, yük dengelemeyi ve kaynak yönetimini esnek bir şekilde yapmayı mümkün kılar. Örneğin, bir uygulamanın talebi arttığında, Docker konteynerleri, yükü daha az olan düğümlere otomatik olarak taşınabilir, bu da sistem performansını optimize eder ve kaynak kullanımını verimli hale getirir.
Docker‘ın bir başka önemli yönü, imajların herhangi bir konteyner ortamında oluşturulup çalıştırılabilmesidir. Bu, geliştiricilere büyük bir esneklik sunar, zira Docker imajları platformdan bağımsız olarak hazırlanabilir ve farklı ortamlarda problemsiz bir şekilde çalışabilir. Bu durum, uygulama geliştirme sürecini hızlandırır ve farklı ortamlar arasında sorunsuz bir geçiş imkanı sağlar.
Docker, çoklu bulut senaryolarını destekler. Bu, işletmelerin ve geliştiricilerin uygulamalarını tek bir bulut sağlayıcısına bağlı kalmaksızın birden fazla bulut ortamında çalıştırabilmesine olanak tanır. Bu özellik, felaket kurtarma ve yüksek kullanılabilirlik stratejileri için önemlidir ve işletmelerin bulut altyapılarından daha etkin bir şekilde yararlanmalarını sağlar. Docker‘ın bileşen bazında taşınabilirlik yetenekleri, bulut tabanlı uygulama geliştirme ve yönetiminde önemli bir rol oynar.
Orkestrasyon Araçları ve Güvenlik
Modern bulut altyapıları ve konteynerleştirme çözümlerinde, orkestrasyon araçları ve güvenlik önemli bir rol oynamaktadır. Kubernetes ve Openshift gibi orkestrasyon araçları, Amazon, Azure, Google ve IBM gibi büyük bulut sağlayıcıları ile entegre çalışarak, karmaşık uygulama dağıtımlarını yönetmekte ve otomatize etmektedir. Bu tür araçlar, bulut ortamlarında uygulama dağıtımını ve yönetimini kolaylaştırırken, aynı zamanda güvenlik ve verimlilik sağlamak için kritik öneme sahiptir. Bu bağlamda, rol bazlı erişim kontrolü (RBAC) uygulaması, sistemdeki farklı kullanıcı ve grupların yetkilerini düzenleyerek, kaynaklara erişimi kontrol altında tutmaktadır. RBAC, yetkisiz erişimleri önlemek ve kaynakların sadece yetkili kişiler tarafından kullanılmasını sağlamak için hayati bir mekanizmadır. Ayrıca, 3. parti kimlik doğrulama API‘ları kullanarak, sisteme erişimde ekstra bir güvenlik katmanı sağlanmaktadır. Bu, kullanıcı kimliklerinin ve erişim haklarının güvenli bir şekilde yönetilmesine olanak tanır.
Ağ izolasyonu, özellikle birden fazla node üzerinde çalışan uygulamalar için önemlidir. Bu izolasyon, her node’un ağ trafiğini diğerlerinden ayrı tutarak, potansiyel güvenlik tehditlerine karşı koruma sağlar. Ayrıca, ağ trafiğinin izlenmesi ve gerektiğinde sınırlanması, anormal trafik davranışlarını tespit etmek ve önlemek için kritik önem taşır.
Güvenlik güncellemelerinin düzenli olarak takip edilmesi ve uygulanması, sistemin güvenliğini korumanın en önemli yollarından biridir. Bu güncellemeler, sistemdeki güvenlik açıklarını kapatır ve olası siber saldırılara karşı koruma sağlar. Son olarak, audit loglarının aktif edilmesi, sistem üzerinde gerçekleşen tüm işlemlerin kaydedilmesini ve izlenmesini sağlar. Bu loglar, olası güvenlik ihlallerinin tespit edilmesinde ve sistem üzerindeki etkinliklerin denetlenmesinde büyük önem taşır. Bu güvenlik önlemleri ve uygulamaları, modern bulut altyapılarının ve konteynerleştirme sistemlerinin güvenli bir şekilde işletilmesini sağlar ve bu sistemlerin güvenilirliğini artırır.
Kubernetes Mimarisi
Docker, konteyner teknolojisinin geliştirilmesi ve dağıtılması için kullanılan açık kaynaklı bir platformdur ve konteynerların varsayılan dosya biçimi olarak kabul edilir. Konteynerlerle eş anlamlı hale gelen bu platform, konteynerları oluşturma ve çalıştırma işlevselliğine sahiptir. Öte yandan, Kubernetes bir konteyner düzenleme platformu olarak öne çıkar ve konteynerların planlanması, ölçeklenmesi ve yönetilmesinde merkezi bir rol oynar.
Docker ve Kubernetes’in bir arada kullanımı, geliştirme deneyimini zenginleştirir ve ölçeklenebilir uygulamaların oluşturulmasını kolaylaştırır. Bu ikilinin entegrasyonu, ekiplerin bulut tabanlı yerel mimarileri veya mikro hizmetleri daha verimli bir şekilde geliştirmelerine olanak tanır. Docker’ın konteyner oluşturma ve çalıştırma yetenekleri ile Kubernetes’in konteyner düzenleme ve yönetim kabiliyetleri birleştiğinde, modern yazılım geliştirme süreçlerinde önemli bir artı güç yaratır. Bu, geliştiricilere daha hızlı, esnek ve güvenilir uygulama dağıtımı konusunda güçlü bir altyapı sunar. Bu özellikler, Docker ve Kubernetes’in yazılım geliştirme ekosisteminde neden bu kadar yaygın olarak tercih edildiğini ve bu teknolojilerin birlikte nasıl daha etkili hale geldiğini açıklar.
Kubernetes Cluster
Master ve Client node’larını kapsayan genel isimdir. Bir cluster içerisinde genelde bir adet master/controller node birden fazla worker/minion node bulunur.
Master (Controller)
Kubernetes’ın yüklendiği ve worker node’ların yönetildiği merkezi node dur. Cluster içerisindeki node’ları monitor edip ve mevcut durumda hakkında bilgiler toplar. Sağlıklı ve beklenen şekilde çalışmasını sağlar bunun için aşağıdaki componentlere ihtiyaç duyar.
- API Server
- Etcd
- Controler
- Scheduler
Worker (Minion)
Container’ların çalıştığı fiziksel veya sanal makinedir. Sağlıklı çalışması için aşağıdaki componentlere ihtiyaç duyar.
- Kubelet
- Kube-proxt
- Container runtime
Pods
Kubernetes, container’ların mevcut halde çalışmasına izin vermez bunun yerine container’leri Pod içerisinde encapsulated ederek çalıştırır. Pod bir veya daha fazla container’ın kendi içinde barındırabilir fakat genelde bir Pod bir Container’a sahip olur.
Eğer bir Pod içerisinde birden fazla container varsa bunlar farklı Node’larda barınmaz, tüm Container’lar en uygun Node içerisinde çalışır. Her pod unique IP adresine sahiptir böylece bir Pod üzerinde açılan Port başka bir Pod üzerinde açılan aynı port ile çakışmaz.
Kubernetes Components
API Server
API server Kubernetes’ın frontend’i olarak düşünülebilir. Diğer tüm Component lerin doğrudan iletişim kurduğu tek Component dir. Ana görevi dışarıdan yapılan API isteklerini authentication, authorization ve admission controller üzerinden geçirerek beklenenin gerçekleşmesinde yardımcı olur. (Pod, Deployment, Deamon, Namespace oluşturma silme güncelle vs.)
Etcd Key store
Clustor içerisindeki tüm verilerin kalıcı olacak şekilde depolandığı bir database dir. Veriler key-value formatında tutulmaktadır. Sadece kubernetes API tarafından erişilebilir ve oluşturulan objelerin içeriği bakımından içinde hassas veriler tutabilir.
Scheduler
Yeni oluşturulan ve herhangi bir Node’a atanmayan Pod’ları takip edip bunları en müsait olan Node’a atamasından sorumludur. Clustor içerisinde Pod için gereksinimleri karşılayan her Node «Fesaible Node» olarak adlandırılmaktadır. Node gereksinimleri karşılamadığı durumda Pod «unscheduled» halinde kalacaktır.
Pod atama işlemi öncesi Node üzerinde kaynakların müsaitlik durumuna göre en uygun Node bulunur ve bu bilgi API Server’a iletilir.
Controller Manager
Kubernetes içerisinde sanki bir döngüdeymiş gibi API Server aracılığıyla Etcd clustor, node, pod vs gibi objelerin bilgilerini elde eder ve beklenen, mevcut durumları kontrol eder. Eğer beklenen durum mevcut durumla aynı değilse; mevcut durumunu beklenen durum yapmak için harekete geçer. Kendi içinde birden fazla farklı obje için controller’ı mevcuttur.
- Node Controller : Olası bir Node down olduğunda bu durumun farkına varmak, haber vermek ve tekrar ayağa kaldırmaktan sorumludur.
- Job Controller : Tek sefer çalışacak olan Job’ları izler ve görevlerini yapmaları için Pod’lar oluşturur.
Kubelet
Clusterdaki her Node çalışan bir agent dır. API Server’den gelen bilgileri alarak ilgili node üzerinde beklenen objelerin oluşmasında yardımcı olur.
Kube-proxy
Clustor içerisindeki network iletişiminden sorumludur.
Controllers Runtime
Konteynerler çalıştırmak için kullanılan yazılımdır. (Docker , CRI-O)
Pod oluşturma isteğinin kubernetes içerisindeki döngüsü
- Bir Nginx pod’u kubernetes de ayağa kaldırmak için YAML dosyası hazırlanır ve kubectl ile süreç başlatılır.
- API Server gelen isteği belirli kontrollerden geçirdikten sonra kabul eder ve gerekli bilgileri Etcd içerisine yazar.
- Etcd bilgileri kayıt eder ve sonucu tekrar API Server’a döner.
- API Server oluşturacağı Pod için en uygun Node’u bulmak için Schedular’a sorar.
- Scheduler çalışmasını yapar ve en uygun Node bilgisini API Server’a iletir.
- API Server aldığı en uygun Node bilgisin Etcd’ye iletir.
- Etcd kayıt işlemini yapar ve sonucu API Server’a döner.
- API Server elde ettiği bilgiyi ilgili Node’un Kubelet’ine iletir.
- Kubelet aldığı bilgiler doğrultusunda ilgili Pod’un Node üzerinde ayağa kalkmasını sağlar ve son durumu API Server’a iletir.
- API server Pod oluştu bilgisini Etcd’ye iletir.
- Etcd aldığı bilgiyi kayıt eder ve sonucu API Server’a iletir.
- API Server sonucu kubectl iletir ve işlem biter.
Konteynerlerle birlikte Kubernetes’in kullanımı, geliştirme ve işletme ekipler arası işbirliğini artırır ve sürekli entegrasyon ile sürekli teslimat (CI/CD) süreçlerine fayda sağlar. Bu şekilde, yazılım geliştirme sürecinin hızlanır ve geliştiriciler yenilikleri daha hızlı gerçekleştirir, aynı zamanda yazılımları daha sık ve daha güvenli bir biçimde sektöre kazandırır.
Böylece, konteyner ve Kubernetes teknolojileri, yazılım geliştirmenin daha etkin, esnek ve güvenli olmasını sağlar. Özellikle bulut bazlı ve dağıtık sistemlerdeki yazılım geliştirme ve yönetim süreçlerinde önemli bir dönüşüm yaratan bu teknolojiler, günümüzün sürekli değişen teknoloji dünyasında elzem araçlar haline gelmiştir.