Kubernetes Mimarisi

Fevzi Sahinler
Coding Wizards
7 min readNov 9, 2022

--

Kubernetes Nedir?

Kubernetes hem declerative yapılandırmayı (beyan temelli) hem de otomasyonu kolaylaştıran, container iş yüklerini ve hizmetleri yönetmek için oluşturulmuş, taşınabilir ve genişletilebilir açık kaynaklı bir container yönetim platformudur.

Kubernetes tamamen modüler bir yapıda tasarlanmıştır. Mümkün oldukça major özellikler ayrı componentlere bölünmüştür. Her modül kendi işini yapar.

Kubernetes Modüler Yapısı

Kubernetes’e nasıl yapılacağını tarif etmiyor (imperative) ne istediğimizi (declarative) söylüyoruz. Bu kavramı anlamamış olabilirsiniz, bunu aşağıda bir örnek üzerinden açıklayacağız.

İmperative and Declarative

Bir dolap yaptırmak istediğimizi düşünelim. Marangoz’a yaptırmak istediğimiz dolabı 2 şekilde anlatacağız.

  1. imperative Yöntem
  • 10x10 4 metre kereste bul.
  • 2 eşit parça kes.
  • 4cm’lik çivileri çak.
  • Parçaları birleştir.
  • Birleştirdikten sonra zımparala.

Buna imperative yöntem denir. Özellikle karmaşık yapılarda bize hem zaman kaybettiriyor, hem de işimizi oldukça zorlaştırıyor.

2. Declarative Yöntem

  • 185x110x45 boyutlarında çift kapılı vernikli bir dolap istiyorum.

Buna da declarative yöntem denir. Marangozun onu nasıl yapacağı, hangi çiviyi kullanacağı, tahtaları nasıl keseceği bizi ilgilendirmiyor. Marangoza sadece ne yapması gerektiğini söylüyoruz ve marangoz isteğimi yerine getiriyor.

İşte kubernetes’in kullanmış olduğu declarative yöntem tam anlamıyla budur. Kubernetes declarative yöntem dışında otomatizasyonu da sağlıyor. Bunu’da Desired State- Current State örneği üzerinden açıklayalım:

Desired State — — — — — — — — — — Current State

(Declare edilen durum) — — — — — — — — — — — — —(Mevcut durum)

  • K8s:latest isimli imajdan yarat. — — — - 10 Container çalışıyor.
  • Sistem geneli 10 container çalışacak.
  • 80 portundan yayın yapacak.
  • Her güncelleme arası 10 saniye bekle. ****

Yapı Declare edilen durumun dışına çıkarsa otomatik olarak düzeltir. Örneğin container sayısı 9'a düştüğü zaman kubernetes otomatik olarak bir container yaratır 10 container’a, yani istenilen duruma geri döner.

Kubernetes Komponentleri

Komponentleri açıklamadan önce anlaşılabilir olması açısından daha farklı bir kurgu üzerinden anlatıp daha sonra komponentleri açıklayacağız.

Bir fabrika hayal edelim. Bu fabrika temelde 2 bölümden oluşuyor. Sol taraf yönetim kısmı ve yönetim ile ilgili tüm birimler burada çalışıyor. Sağ tarafta iste tüm üretim araçları, makineler ve işçiler çalışıyor. Önce sağ tarafa bakacağız.Burada Üretim yapılan makineler var ve

  1. Her makinenin başında bir usta başı (1) duruyor. Her usta başı başında olduğu makineden sorumlu. Makinede ne üretilecekse yönetimden usta başına bildiriliyor ve usta başı o üretilecek şeyi üretecek işçiyi getirip makinede çalıştırmaya başlıyor. Tüm görevi işçileri bu makinelere yerleştirmek ve durumlarını gözlemlemek.
  2. Usta başının yanında lojistikten sorumlu bir görevli (2) duruyor. Bu görevlide o makinelere dışarıdan erişilmesini, işçilerin birbiriyle haberleşebilmelerini, iç ve dış iletişimi sağlıyor.
  3. Şimdi sol tarafa yönetim kısmına geçelim. Fabrikanın girişinde resepsiyon ve güvenlik (3) var. fabrika içinden ve dışından gelen tüm iletişim bu resepsiyon kısmından geçmek zorunda. Hiçbir birim birbirleriyle direkt haberleşemez, mutlaka resepsiyon ve güvenlik kısmından geçmek zorundalar. Buranın ana görevi gelen tüm istekleri almak isteği yapan kişinin istediği şeye yetkisi olup olmadığını kontrol etmek. Eğer yetkisi varsa isteği kayıt altına almak. Burası tüm iletişimin kalbidir.
  4. Bu bölümün hemen arkasında kocaman bir dosya arşivi ve pano (4) duruyor. Resepsiyon ve güvenlik bölümü gelen tüm istekleri, bu istekler sonucu oluşan tüm kayıtları, ne yapılması gerektiği ile ilgili tüm bilgileri arşiv ve panoda saklar. Kısacası fabrika ile ilgili tüm bilgiler, ne üretildiği, mevcutta ne kadar üretim yapıldığı, kaç kişi çalıştığı ,kaç makine olduğu vb tüm bilgiler burada saklanır.
  5. Diğer birim ise üretim planlama birimidir.(5) Üretim planlama temel ve basit bir iş yapıyor (4) nolu arşiv ve panoyu resepsiyon ve güvenliğin izni ile sürekli gözlüyor, eğer bu kayıtlarda yeni bir ürün üretilmesine yönelik bir talimat görürse hemen bu talimatı alıyor ve sonrasında tüm makinelere bakıyor. İçlerinden bu talimata uygun ürün üretebilicek olan özelliklerdeki makineleri seçiyor, bunlardan en uygununu ve ürünü üretmek için yeterli kapasitesi olanı belirliyor. Belirledikten sonra o işe uygun işçinin o makinede konuşlandırılmasını sağlıyor.
  6. Vardiya amirliği (6) son birimimiz. bu departmanda 4 farklı insan çalışıyor. Herbiri aynı işi yapıyor ama hepsinin sorumlu olduğu farklı yerler var, herbirinin bir gözü panoda diğer gözleri sorumlu oldukları yapıları kontrol ediyor örneğin: İşçilerden sorumlu olan sürekli panoyu gözlüyor. Diyelimki panoda 10 işçinin çalışması gerektiğine dair bir bilgi var üretim kısmını gözlüyor ve çalışıp çalışmadığını kontrol ediyor. İşçilerden birisi makinenin başından ayrılırsa hemen tespit ediyor ve düzeltmek için devreye giriyor. Üretimi tekrar 10 işçi çalışacak hale getiriyor. hepsi temelde panoyla mevcut durumun aynı olup olmadığını kontrol edip gerekli adımları atıyorlar.

Control Plane

Kube-apiserver

Kubernetes’in beyni olarak adlandırabiliriz. Yukarıdaki hikayede resepsiyon ve güvenlik (3) olarak anlattığımız api server kubernetes ile alakalı tüm componentlerin ve dış dünyadan kubernetes plattformuyla iletişim kuran tüm servislerin ortak giriş noktasıdır. Api server tüm component ve node bileşenlerinin direk iletişim kurabildiği tek componenttir.

Tüm iletişim api server üzerinden gerçekleşir. Api server kubernetes’de kaynak oluşturma isteklerinin api doğrulamasından sorumludur. Kullanıcılar kubectl komut satırı istemcisi veya rest api çağrıları aracılığıyla, api server ile iletişim kurabilirler. Kısacası kubernetes ile iletişim kurmak için api server’a erişilir, authentication(kimlik doğrulama) ve authorization(yetki) işlemleri tamamlanır, istekler iletilir. Aynı şekilde diğer tüm componentler de iletişimi api server aracılığıyla gerçekleştirir.

Etcd

Tüm cluster verisi, meta-data bilgileri ve kuberneteste oluşturulan tüm objelerin bilgilerinin tutulduğu etcd isimli “key-value” veri deposudur. Kendi örneğimizde pano ve arşiv (4) tarafından temsil edilen etcd, cluster’ın mevcut durumu ile ilgili bilgiyi üzerinde barındırır. Kısacası kubernetes’in çalışması için gerekli tüm veriler etcd üzerinde tutulur. Kube-apiserver hariç diğer kubernetes komponentleri etcd ile direk haberleşemezler, iletişim kurmaları gerektiğinde kube-apiserver aracılığıyla yaparlar.

Kube-scheduler

Örneğimizde üretim planlama (5) olarak bahsettiğimiz kubernetes komponenti kube-scheduler’dır. Kube-scheduler yaratılmak istenen podların gereksinimlerini kontrol ederek o podun en uygun çalışacağı worker node’un hangisi olduğunu tespit eder ve oluşturulmasını sağlar. Podun kaynak isteğini, özel gereksinimlerini (cpu ihtiyacı) gibi çeşitli parametleri göz önünde bulundurur ve bir seçme algoritması sayesinde pod için en uygun node’un hangisi olduğuna karar verir.

Kube-controller-manager

Yönetim kısmında son inceleyeceğimiz komponent kube-controller-manager’dır. Tek bir binary olarak bulunsa da içerisinde birden fazla controller barındırır. Kubernetes’in mevcut durumu istenilen durum ile karşılaştırma temelinde uygulama yönetimi sağlar. Controller Manager altındaki controller’lar kubernetes cluster’ın mevcut durumu ile ondan istenilen durum arasında fark olup olmadığını gözlerler. Api server aracılığıyla etcd ‘de saklanan cluster durumunu izler ve eğer mevcut durum ile istenilen durum arasında fark varsa bu farkı oluşturan kaynakları gerektiği gibi oluşturur günceller veya silerek bu durumu eşitler.

Örneğin siz kubernetes’e App’in 3 pod olarak çalışması istenilen durum olarak bildirdiniz. Kubernetes bunu gerçekleştirmek için app’in koştuğu 3 pod çalıştırmaya başladı. Bir şekilde podlardan birisi dış müdahale ile silindi, controller manager bunu algılayarak yeni bir pod yaratılması sağlar ve istenilen ile mevcut durumu eşitler.

Özetle…

Bu saydığımız 4 component kubernetes’in yönetim kısmını oluşturur. Control plane olarak bilinen yönetim kısmı , master node olarak adlandırılan sistemler üzerinde çalışır. Tüm bu komponentler tek bir linux yüklü sisteme kurulup ordan erişilebileceği gibi yüksek erişilebilirlik sağlanması adına birden fazla sisteme de kurulabilir. Etcd tamamen bu yapıdan ayrı bir yapıda konuşlandırılarak daha yüksek erişilebilirlik hedeflenebilir ama genellikle etcd’de api server’ın koştuğu yerde durur.

3 sunucu üzerinde, 3 api server kurulup diğer komponentler bu sistemlere dağıtılabilir. Bu üzerinde control plane komponentlerinin koştuğu sistemlere cluster altındaki master node deriz. Master node’lar sadece bu sistemleri barındırmak için bulunur ve özellikle production sistemlerde herhangi bir iş yükümüzü bu sistemler üzerinde çalıştırmayız. Bunlarda sadece cluster’ın yönetim alt yapısını koştururuz, iş yüklerimiz ise yukarıdaki hikayede makineler olarak adlandırdığımız worker nodelar üzerinde çalışır. Worker node dediğimiz işin yapıldığı podlarımız yani, containerlarımızın üzerinde çalıştırdığımız esas yerlerdir. Bunlar üzerlerinde container-d yada docker gibi bir container runtime barındıran ve cluster’a dahil edilen sistemlerdir. Her worker node’da 3 temel komponent bulunur.

Worker Nodes

Container Runtine

İlk ve en önemli olan component containerların çalışmasını sağlayacak bir container runtime’dır. Varsayılan olarak bu docker’dır fakat kubernetes docker runtime desteğini kesmiştir ve container-d ye geçmiştir. Container-d docker’dan farklı değildir, hatta docker’da container oluşturma ve çalıştırma alt yapısı olarak container-d kullanır. Özetle her kubernetes worker node’unda containerların çalışması için bir container runtime bulunur.

Kubelet

Bunun yanında bizim örneğimizde usta başı (1) olarak adlandırdığımız kubelet bütün worker node’larda bulunur. Kubelet, api server aracılığıyla etcd’yi kontrol eder ve scheduler tarafından bulunduğu node üzerinde çalışması gereken bir pod belirtildiyse kubelet podu ilgili sistemde yaratır. Container-d’ye haber gönderir ve belirlenen özelliklerde bir container’ın o sistemde çalışmasını sağlar.

K-Proxy

Fabrika örneğimizde lojistik elemanı (2) olarak adlandırılan kube-proxy çok basit şekiyle, oluşturulan podların tcp/udp ve sctp trafik akışlarını yönetir. Ağ kurallarını belirler ve yönetir, kısacası network proxy görevi görür. Bunların dışında DNS hizmeti ya da GUI hizmeti sağlayan çeşitli Add On servisler’de kurulumla entegre edilebilen servislerdir, fakat core componentler olarak adlandırılmaz.

--

--