Containerların popülerleşmesi ile beraber teknoloji dünyasında containerlar için bir çok hizmet çıkıyor. Bunun en önemli sebeplerinden bir tanesi Docker ekosisteminin kendisinin de microservice yapısında olmasından kaynaklanıyor. Yani siz containların çalışması için docker engine kullanabilirsiniz ama onların loglanması ve monitor edilmesi için başka bir framework kullanabilirsiniz. Bu hizmetlerin bir çoğu Docker ekosisteminde bulunuyor fakat açık kaynak kod topluluğu birbirinden farklı yeni hizmetler sunmaya devam ediyor.
Kubernetes ilk olarak Google tarafından geliştirilen bir hizmettir. Daha sonrasında open source olarak herkesin kullanımına açılmıştır. Kubernetes servisi temel olarak container ekosisteminde microservice uygulamalarının orkestrasyonu için geliştirilmiş bir üründür. Günümüzün en önemli ve meşhur container yönetim ve orkestrasyon araçlarından bir tanesidir.
Resim-1
Kubernetes cluster’ ın özet görüntüsü yukarıda ki gibidir. Docker swarm da olduğu gibi master ve node şeklinde önemli iki bileşeni vardır.
Masterları Kubernetes clusterının kontrol merkezi olarak düşünebilirsiniz. Tüm cluster’ I yönetmekten, izlemekten, değişiklikler yapmaktan ve oluşan olaylara cevap vermekten sorumludur. Nodelar ise esas işi yapan bileşenlerdir. Yaptıkları işleri, durumlarını masterlara sürekli olarak iletirler.
Kubernetes altyapı olarak sadece çalışan işletim sisteminin Linux olmasını ister, onun haricinde Linux’ un hangi platformda çalıştığı ile ilgilenmez. Kubernetes clusterlarını VMWare, Azure, Amazon, Openstack, Google Cloud vs. gibi istediğiniz birçok platformda çalıştırabilirsiniz.
Masters
Kubernetes Master içerisinde bir çok bileşen vardır fakat bunların hepsi tek sunucu da çalışırlar. Bunları bir den fazla Master kurarak High Available hale getirebilirsiniz.
Genel olarak Master Nodelar üzerinde herhangi bir iş yükü çalıştırılması tercih edilmez. Çalıştırılacak iş yükleri nodular üzerinde çalıştırılırlar.
Kubernetes de Master ile api server (kube-apiserver) ile haberleşiriz. Restful API JSON ile manifest(konfigurasyon) dosyaları kubernetes master’a iletilir. Docker da olduğu gibi Kubernetes de bir cluster store’ a sahiptir(KV). Cluster store da cluster durumu ve configurasyonu saklanır. Veritabanı olarak NoSQL bir yapı olan etcd kullanılır.
Master içerisinde ki bir diper bileşen Controller Managerdır (kube-controller-manager). Bu bileşen kubernetes sistemine verilen manifest dosyası ile desired state dediğimiz istenilen durumu korumak ve tüm konfigurasyonu istenilen durumda tutmaktan sorumludur (node sayıları, Enpointler, dns vs.)
Bir diğer bileşen ise scheduler servisidir(kube-scheduler). Bu servis işlemlerin zamanlaması için kullanılır ve nodelara görevler atar.
Tüm bu bileşenlere işlemleri daha önce de bahsettiğimiz gibi apiserver üzerinden erişiriz. Master ile tek iletişim aracımız apiserver’ımızdır. Biz JSON dosyaları hazırlayarak istediğimiz işlemleri kubectl komutları ile apiserver’ a iletiriz api server master içerisinde yukarıda bahsettiğimiz bileşenlere ilgili görevleri kendisi dağıtır.
Nodes
Nodelar kubernetes ekosisteminde iş yüklerinin çalıştığı yerlerdir. Nodelar da Master da olduğu gibi bir çok bileşenden oluşturlar.
Bu bileşenlerin en önemlisi kubelet‘ dir. Kubelet bir anlamda node’ un kendisidir. Node’ u bir agent olarak da düşünebiliriz. Node kubernetes cluster’a kubelet ile üye olur. Podların başlatılmasından kubelet sorumludur. Ve node içerisinde ki olaylar için master’a bilgilerin iletilmesinden sorumludur.
Bir diğer bileşen ise container engine dir. Container engine container yönetiminden sorumludur. Containerların başlatılması, durdurulması, container imajlarının alınması vs. Kubernetes içerisinde iki container engine desteklenir, rkt ve Docker. Genellikle docker tercih edilir.
Bir diğer bileşen ise kube-proxy bileşenidir. Bu bileşen kubernetes network’ünden sorumludur. Pod IP adreslerini yönetir, load balancingden sorumludur. Kubernetes de pod içerisinde ki tüm kontainerlar tek IP yi paylaşırlar.
Pods
Kubernetes sisteminde ki en atomik computing birimi Podlardır. Bunları sanallaştırma ekosisteminde ki sanal makinalar, docker ekosisteminde ki containerlar olarak düşünebilirsiniz. Nodelar ve Masterlar podları host etmek ve organize etmek için vardır.
Kubernetes’I tanımlarken container orkestrasyon servisi olarak tanımlamıştırk. Kubernetes ekosisteminde containerlar podların içerisinde çalışırlar. Her container bir pod içerisinde çalışmak zorundadır. Bir pod içerisinde birden fazla container da çalışabilir fakat bu çok tercih edilen bir senaryo değildir. Çok özel bir ihtiyaç olamadığı zaman her pod bir container olarak düşünülebilir.
Pod pratikte herhangi bir şey çalıştırmaz. Podlar sadece container orkestrasyonunu kolaylaştırmak için bazı servisleri barındırır. Bunların tamamı containerların daha esnek, performanslı ve high available çalışması içindir.
Yukarıda bahsettiğimiz gibi her pod bir container olarak düşünülebilir. Çünkü dediğimiz gibi en atomic işlem birimlerimiz podlardır. Siz bir servisi scale etmek istiyorsanız yani fazla yükten dolayı gelen istekleri karşılamak için kaynak sayısını arttırmak istiyorsanız pod sayısını arttırırsınız. Pod içerisinde ki container sayısını değil. Unutmayalım bir pod içerisinde bir den fazla container özel mimariler için kullanılıyor.
Resim-2
Podlar yaşam süresi olan bileşenlerdir. Bir Pod da sorun olduğu zaman, replication controller bileşeni manifest dosyasında belirtilen tanıma göre aynı özelliklerde uygun bir node üzerinde bir pod oluşturulur. Bu oluşturulan pod tamamen yeni bir poddur. Dolayısı ile mevcut pod’un yeniden kullanılması söz konusu değildir.
Resim-3
Yukarıda ki resimde anlatıldığı gibi, veritabanı barındıran bir podda sorun oluyor ve pod cluster durumuna göre farklı bir node’da yeniden açılıyor. Bu tamamen yeni bir pod’dur.
Yukarıda anlattığımız resmi incelediğimiz zaman hemen bir sorun gözümüze çarpıyor, yeni oluşturulan pod’un IP adresi farklı. Aynı zamanda bu sadece sorun olduğu durumlarda geçerli bir durumda değildir. Container imaj da bir güncelleme yaptığınızda da bu güncelleme yeni bir pod ile devreye alınr. Veya scale-out ve scale-in durumlarında da aynı durum geçerlidir. Yeni oluşan podlar sürekli yeni IP ler ile oluşacaktır. Bu çok dinamik bir şekilde değişen microservis yapıları için ciddi bir sorun. Bu sorun kubernetes sisteminde çok güzel ve esnek bir servis ile çözüm buluyor.
Services
Yukarıda anlatılan ve yeni pod oluşumlarında sorun yaratan network problem kubernetes de orkestrasyon işlerimizi çok kolaylaştıran servis objeleri ile yapılır. Manifest dosyasında bir servis tanımı yapılır.
Resim-4
Bu load balancing kubernetes de çok kolay, esnek ve hızlı uygulanabilirşekilde çözülmüştür.
Labels
Kubernetes servisleri kendi ile eşleşen ve podlara koyulan etiketler ile load balancing mekanizmasını çalıştırır. Servis ve podlara birden fazla etiket koyulabildiği için dev/test ortamlarında prod ortamına geçişte oldukça basitleştirilmiştir.
Resim-5
Yukarıda gördüğünüz gibi servis kendi etiketleri ile eşleşen podlar arasında load balancing yapmaktadır. Bu etiketleme işlemi versiyonlar arası geçişlerde oldukça esnek bir yapı sunmaktadır.
Kubernetes Management, Images, Services, Pods
Kubernetes orkestrasyon ve pod yönetiminde manifest dosyaları aracılığı ile declarative bir şekilde yönetilir. Manifest dosyları JSON veya YAML dosyalarıdır. Kubernetes üzerinde kuracağınız ortamın tüm konfigurasyonunu bu dosyalarda belirtirsiniz. Replication controller bu dosyaya göre ortamınızı düzenler.
Bu şekilde ortam sürekli istenilen configürasyon da çalışır(desired state).
Resim-6
Yukarıda görüldüğü gibi YAML dosyamızda kubernetes üzerinde yapmak istediğimiz konfigürasyon declarative bir şekilde belirtilmiştir. Kubernetes ortamımız bu şekilde kurulacak ve bu şekilde çalışması için gerekli controller sağlanacak. Yukarıda bahsettiğimiz kubernetes bileşenleri bu konfigürasyonun bu şekilde çalışmasını sağlayacaklar.
Gördüğünüz gibi Kubernetes Container ekosistemine bir çok yenilik, kolaylık ve esneklik getirmekte. Bu anlamda kubernetes şimdiden container ortamları için vazgeçilmez bir yönetim aracı olmuş durumda.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
TAGs: kubernetes, containers, container yönetimi, container management, pods, open source, linux, yaml, json, kubernetes cluster, kubernetes nedir, high available containers, microservice
Çok güzel bir yazı olmuş. Bu mimari ile ilgili henüz çok kısıtlı bilgim var, temel noktaları o kadar güzel anlatmışsınızki artık biraz daha detaya girebilecek bilgiye sahip olduğumu hissedebildim. Teşekkürler.