Kubernates Nedir? Part 2

Kubernetes nedir ve neden böyle bir ortama ihtiyaç duyarız?

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’in kelimesi Yunancadan geliyor ve anlamı dümenci (helmsman) veya pilot olarak karşımıza çıkıyor. Çoğu kaynaklarda kubernetesi k8s olarak yazıldığını görebilirsiniz. Bunun sebebi k ve s harflerinin arasında 8 tane harf olmasıdır.

Bulut teknolojilerinin kullanımının yaygınlaşması ile birlikte konteyner kavramı hayatımıza girdi ve önemli hale gelmeye başladı.Bundan üç yada dört sene önce sanal makine devrimini konuşuyorken artık sanal makinelerin üzerinde koşan kontainer devrimini konuşuyoruz.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’in her bileşeni ayrı bir makale oluşturulabilecek derinliğe sahip olduğu için bu yazıdaki amaç yazıyı okuyan kişilerin Kubernetes hakkında high-level olarak bilgi sahibi olmasıdır. Kubernetes’den bahsetmeden önce üzerine inşa edildiği Containerization teknolojisine kısaca değinmek faydalı olacaktır.

Containerization (Konteynırlaştırma) Nedir?

Konteynırlama, bir uygulamanın, farklı yazılım ve geliştirme ortamlarında etkin ve hatasız bir şekilde çalışması için gereken tüm ilgili yapılandırma dosyaları, kütüphaneleri ve bağımlılıkları ile birlikte paketlenmesini içerir.

 En popüler konteynerizasyon ekosistemleri Docker ve Kubernet’lerdir.

Containers versus Virtual Machines

Konteynerlama mimarisi genellikle Sanal Makinelerle (VM) karşılaştırılır, çünkü ikisi de birden fazla yazılımın kapalı ortamlarda çalışmasına izin verir. Containerization sözlük anlamı olarak “Full Machine Virtualization”a alternatif olarak ortaya çıkmış, machine virtualization’a nazaran daha lightweight bir çözüm sağlayan, uygulamaların containerlar içerisine bağımlı oldukları kütüphaneler ile enkapsüle edilip, izole bir şekilde çalışmasını sağlayan bir teknolojidir. Konteynerlar, uygulama katmanının bir soyutlamasıdır (yani, her bir konteynerın farklı bir yazılım uygulamasını simüle ettiği anlamına gelir). Her bir konteyner yalıtılmış işlemler gerçekleştirse de, birden fazla konteyner ortak bir İşletim Sistemini paylaşır. VM’ler, donanım katmanının bir soyutlamasıdır (yani her VM, yazılımı çalıştırabilecek fiziksel bir makineyi taklit eder). VM teknolojisi, birçok sunucunun (her biri VM olarak adlandırılır) eşdeğerini çalıştırmak için bir fiziksel sunucu kullanabilir. Bu nedenle, birden fazla VM bir fiziksel makinede çalışırken, her VM’nin bir İşletim Sistemi, uygulamaları ve ilgili dosyaları, kütüphaneleri ve bağımlılıkları kendi kopyası vardır. Yazılımları kapalı ortamlarda çalıştırmak, genellikle farklı sanal makinelerde çalışan yazılımlara göre daha az alan ve bellek kullanır; çünkü ikincisi, her Sanal Makinede çalıştırmak için İşletim Sisteminin ayrı bir kopyasını gerektirir.

Docker Nedir?

Docker, yazılımları kitaplıklar, sistem araçları, kod ve çalışma zamanı dahil olmak üzere yazılımların çalışması için gerekli her şeyi içeren container adlı standartlaştırılmış birimler halinde paketler. Docker’ı kullanarak her ortama hızla uygulama dağıtıp uygulamaları ölçeklendirebilir ve kodunuzun çalışacağından emin olabilirsiniz.Yazılım geliştiriciler ve sistemciler için geliştirilen açık kaynaklı bir sanallaştırma platformudur. Docker ile Linux, Windows ve MacOSX üzerinde Linux ve Windows sanal containerler (makineler) çalıştırabilirsiniz. Bu platform sayesinde web sistemlerinin kurulumunu, testini ve dağıtımını kolaylıkla gerçekleştirebilirsiniz. En önemli özelliği belki de “Benim bilgisayarımda çalışıyordu, sunucuda neden çalışmadı acaba?” sorununu ortadan kaldırıyor olması.

Docker’ın sanallaştırma yapısı, bilinen sanal makinelerden (VirtualBox, Vmware vb) farklı olarak bir Hypervisor katmanına sahip değildir. Bunun yerine Docker Engine üzerinden Dockerfile adı verilen talimat dosyaların, konak işletim sistemine erişmekte ve sistem araçlarını paylaşımlı kullanmaktadır. Böylece klasik VM’lere göre daha az sistem kaynağı tüketmektedir.

Kıyas türü VM   Docker
OS  Tam işletim sistemi  Küçültülmüş işletim sistemi imajı
Izolasyon  Yüksek Daha düşük
Çalışır hale gelmesi Dakikalar Saniyeler
Versiyonlama Yok Yüksek
Kolay paylaşılabilirlik Düşük Yüksek

Docker’in Docker Daemon ve Docker Client olmak üzere başlıca iki bileşeni vardır. Komut satırından yazdığımız docker build, docker run gibi methodlar REST çağrısı olarak Docker Daemon’a iletilir. Docker Daemon da aldığı bu istekleri ilgili host makina üzerinde gerçekleştirir ve client’a cevabı döner.

Docker üzerinde çalıştırılan containerlar aynı linux kernel’ini paylaşır. Örnek olarak, Ubuntu 18.04 dağıtımı üzerinde çalışan bir container ile CentOS 7.6 dağıtımı üzerinde çalışan bir container ayağa kaldırdığımızı varsayalım. Her iki container’a giriş yapıp kernel versiyonlarını kontrol ettiğimiz zaman Docker Engine’in üzerinde çalıştığı host makinanın kernel versiyonuyla aynı olduğunu görürüz.

Kubernetes Master

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.

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.

Leave a comment

Your email address will not be published. Required fields are marked *