Kubernetes Temelleri
Mimarisi & Çalişma Mantığı & Terminolojisi
Merhabalar,
Bu yazımızda Kubernetes ne olduğunu, mimarisi ,çalışma şekli ,neden ihtiyaç duyduğumuz ve terminolojisinden kısa ve öz olarak inceliycez.
1- Kubernetes Nedir
Kubernetes kelimesi yunancadan gelir. Çoğu kaynaklarda k8s diye yazılır. Bunun nedenide k ile s harfi arasında 8 tane harf olduğu içindir. Kubernetes Google tarafından GO dilinde yazılmıştır. Kubernetes deploy, container yönetimi ve ölçeklendirmesi için geliştirilmiş açık kaynaklı (Open source ) orchestrasyon teknolojidir. Kubernetes, büyük ve hızlı büyüyen bir ekosisteme sahiptir. Kısaca kubernetes birden fazla container’ın yönetiminden sorumludur.
2- Kubernetes Mimarisi
Kubernetes master ve worker node’lardan oluşur.
2.1 Master Nodelar : Kendi içerisinde 4 ana bölümden oluşur.
- Kube-APISERVER
- Cluster-STORE(Etcd)
- Kube-controller-manager
- Kube-Schedular
2.1.1 Kube-APISERVER: Master ve worker sunucusundan gelen tüm REST isteklerin yönetilmesinden sorumludur. Kubernetes Server-Client mimarisi üzerinde çalışır. Kubernetes, API Server ile REST bir servis sağlar ve client ile yapılan istekleri dinler. kubectl ile yaptığımız işlemler ile API Server’ındaki endpointleri çağırmış oluruz.
Kube-APISERVER, kubernetes in beynidir.
Kube-APISERVER kubernetes cluster mekanizmasının ortasında yer almaktadır. Yani Master node ile worker node nun iletişiminden sorumludur. Bütün işlemler ApiServer üzerinden sağlanır.
2.1.2 Cluster-STORE(etcd ): Tüm cluster verisinin saklandığı yerdir. Coreos tarafında yaratılmış open source distributed,tutarlı ve izlenebilir bir key- value store (nosql database) diyebiliriz. Cluster durumu, ağ iletişimi etcd ağaçlarında key-value olarak depolar. Ekleme ve değiştirme noktası bulmak yerine veriler daima sonuna eklenir. Bir değerin değiştirme işlemi, eş zamanlı olarak yapılan talepler kube-apiserver üzerinden yapılır ve istek boyunca seri halde etcd veritabanına eklenir.
2.1.3 Kube-Controller-Manager: Master üzerinde Controller sınıflarını çalıştıran bileşendir. Temel olarak bir controller dur. Kubernetes sistemine verilen manifest dosyası ile desired state dediğimiz istenilen durumu korumak ve tüm konfigürasyonu istenilen durumda tutmaktan sorumludur.(node sayıları, endpointler, dns)
Başlıca kullanılan controllerlar aşağıda listelenmiştir.
- Node Controller: Node’ların ayakta olup olmadığını kontrol eder.
- Replication Controller: Pod’ların olması gereken replica sayısına gelmesini sağlar.
- Endpoints Controller: Pod ve services’lerin endpoint’lerini yaratır.
- Service Account & Token Controllers: Yeni namespaceler için default accounts ve API Access token’ları yaratır.
2.1.4 Kube-Schedular: Master ve worker üzerinde çalışan ve yeni yaratılan pod’ların atanacağı node’ları karar veren bileşendir. Kubelet i tetikler ve ilgili pod ve içindeki container oluşturulur. Node’lara yük atamasından sorumludur. Kısacası yeni bir pod oluşturulması isteğine karşı kube-API SERVER’ı izler.
2.2 Worker Nodelar : Kendi içerisinde 3 ana bölümden oluşur.
- kubelet (node-agent)
- container-engine (container yöneticisi)
- kube-proxy
2.2.1 Kubelet: Node üzerindeki kubernetes ajanıdır. Kubernetes’ın tüm nodelarda bulunan agentıdır. Tüm iletişim bu agent üzerinden gerçekleşir. Kube API SERVER dan gelecek isteklere karşı kube API SERVER izler. İlgili docker servisi daha doğrusu container engine konuşarak POD’u ayağa kaldırır .En önemli özelliği ; Sürekli olarak node da çalışan containerların ayakta olup-olmadığını kontrol eder ve sürekliliği sağlar.
2.2.2 Container-Engine:Container yönetimini yapar. Containerların başlatılması, durdurulması, container image’larının alınması gibi işlemlerden sorumludur. Kubernetes içerisinde desteklenen container engine vardır. Bunlar rkt, docker, cri-o ve containerd dir. Default olarak dockerdır ama kubernetes 1.25 versiyonundan sonra docker desteğini çektiği için şuan containerd ve ya başka bir container engine kurmanız gerekir.
2.2.3 Kube- Proxy : Kubernetes network’u diyebiliriz. Pod’lara IP adresi kube proxy sayesinde atanır. Kube proxy ; servisin altındaki podlara load balancer özelliği sağlar. Kubernetes de pod içerisinde ki tüm containerlar tek IP (unique) atarlar. Userspace, iptables ve IPVS (IP Virtual Server) olarak üç modu vardır. kube proxy default mod olarak iptables kullanır.
3- Kubernetes Çözdüğü Noktalar
- Tüm alt yapıyı tek bir bütün olarak görmemize/yönetmemize olanak sağlıyor.
- Container’larda health check yaparak kontrollü çalışmasını sağlıyor.
- Pod fail olması durumunda yeni bir pod ayağa kaldırıyor.
- Maintenance yada failing durumlarında HA(High Availability) şeklinde bir node üzerindeki uygulamaları bir diğerine kesintisiz şekilde taşınmasını sağlıyor.
- Conteinerların belirlenen kriterlerde auto-scale edilmesini sağlıyor
- Yeni versiyonların herhangi bir kesinti olmadan deploy edilmesini sağlıyor.
- Service discover gibi bir özellik ile ne-nerde bilmemize olanak sağlıyor.
- Key/Value Store yani konfigürasyonları containerler dışında store edilmesini sağlıyor.
- Containerlerin izole bir networkte haberleşmesini sağlıyor.
4- Kubernetes Çalışma Biçimi
- Develepordan pod oluşturma isteği alındığında bu istek kubectl üzerinden api-servera iletilir.
- Api-server aldığı bu isteği etcd’ye yazar.
- Etcd bilginin yazıldığına dair bilgiyi api-server’a iletir.
- Api-server yeni pod oluşturulacağına dair bilgiyi schedulera iletir.
- Scheduler podun hangi node üzerinde oluşacağına dair karar verir ve bilgiyi api-server’a iletir.
- Api-server bu bilgiyi etcd’ye yazar.
- Etcd bilginin yazıldığına dair api-server’a geri dönüş yapar.
- Api-server ilgili node üzerindeki kubelet’i tetikleyerek bilgilendirir.
- Kubelet ilgili container engine ile kube-apiserver aracılığı ile iletişime geçerek ilgili container’ın pod içerisinde oluşmasını sağlar.
- Kubelet pod oluşturulduğunu ve durumuna dair bilgiyi api-server’a iletir.
- Api-server bilgiyi etcd’ye yazar.
5- Kubernetes neden kullanılmalı
Genellikle farklı makinelere dağıtılmış birçok container içeriklerinden kapsayıcılı uygulamaların çalışır halde tutulması karmaşık bir iş olabilir. Kubernetes bu container zamanlayıp dağıtmanız ve bunları istediğiniz duruma uygun şekilde ölçeklendirip yaşam döngülerini yönetmeniz için bir yöntem sunar. Container temelli uygulamalarınızı taşınabilir, ölçeklenebilir ve genişletilebilir bir yöntemle uygulamak için Kubernetes yararlanırız.
Kubernetes bize şunları sağlar;
- Hizmet keşfi ve yük dengeleme: Kubernetes, DNS adını veya kendi IP adresini kullanarak bir container’a ulaşmayı sağlar. Bir container giden trafik yüksekse Kubernetes, dağıtımın kararlı olması için ağ trafiğini yükleyebilir ve dağıtabilir.
- Depolama düzenleme: Kubernetes, yerel depolamalar, genel bulut sağlayıcıları ve benzeri seçtiğiniz bir depolama sistemini otomatik olarak bağlamanıza olanak tanır.
- Otomatik kullanıma sunma ve geri alma işlemleri: Kubernetes kullanarak konuşlandırılmış container’larimiz için istenen durumu tanımlayabilir ve gerçek durumu kontrollü bir hızda istenen duruma değiştirebilir. Örneğin, dağıtımınız için yeni container oluşturmak, mevcut container’ı kaldırmak ve tüm kaynaklarını yeni container’a almak için Kubernetes otomatikleştirme bilirsiniz.
- Otomatik kutulama (bin packing): Kubernetes’e, container’ı çalıştırmak için kullanabileceği bir dizi sunucu (node) sağlarsınız. Kubernetes her bir container ne kadar CPU ve bellek (RAM) ihtiyacı olduğunu söylersiniz. Kubernetes, kaynaklarından en iyi şekilde yararlanmak için sunuculara container sığdırabilir.
- Kendi kendini düzeltebilir: Kubernetes, başarısız olan container’ı yeniden başlatır, container değiştirir, kullanıcı tanımlı durum kontrolünüze yanıt vermeyen container sonlandırır ve hizmet vermeye hazır olana kadar istemcilere tanıtmaz.
- Gizlilik ve konfigürasyon yönetimi: Kubernetes, şifreler, OAuth tokenları ve SSH anahtarları gibi hassas bilgileri depolamanıza ve yönetmenize olanak tanır. Gizli şifreleri ve uygulama ayarlarını konteyner görüntülerinizi (images) yeniden oluşturmadan ve ayarları & şifreleri açığa çıkarmadan dağıtabilir ve güncelleyebilirsiniz.
6- Kubernetes neden önemli
Büyük kurumsal uygulamalar çok sayıda container içerebilir. Bu tür bir mimari hızla karmaşık hale gelebilir. Kubernetes container’ların kullanılabilirliğini ve verimli bir şekilde devreye alınmasını sağlamak için ekosistemi yönetir ve bilgi işlem ve depolamayı buna göre ayarlar. Bu arada geliştirme herhangi bir zamanda her şeyin nerede olduğunu görebilir.
Kubernetes kuruluşların yeni uygulamaların devreye alınmasını kolaylaştırmasına, container ve kaynak yönetimini sorunsuz hale getirmesine, yükseltme risklerini azaltmasına ve kapalı kalma süresini ortadan kaldırmasına yardımcı olabilir. Uygulama bileşenlerini tek tek veya grup olarak ölçekleyebilir ve taşınabilir, bulut tabanlı uygulamaları destekleyebilir.
Avantajları;
- Maliyet tasarrufu: Kubernetes kümeleri bakım ihtiyacının az olmasıyla bilinir. Ekiplerin kendi container otomasyon komutlarını yazmasına gerek yoktur. Ortak bir altyapıdan yararlanabilirler. Eldeki donanımları daha etkin şekilde kullanarak donanım maliyetlerini düşürebilirler.
- Daha kısa sürede pazara sunma: Kubernetes, DevOps için mükemmeldir. İyi bir container yönetiminde devreye alma işlemi yazılım çalıştığı sürece neredeyse sorunsuzdur.
- BT esnekliği: Modern bir kuruluşta yazılımlar, özel ve ortak altyapılarda çalışır. Altyapıların sayısı önemli değildir. Bir container yönetimi çözümü kullanılması, ekiplerin performanstan ödün vermek ya da uygulamaları taşımak için önemli ayarlamalar yapmak zorunda olmayacağı anlamına gelir. Yazılımları işin gerektirdiği her yerde çalıştırabilirler.
Kubernetes’in bir diğer avantajı da yatay ölçeklemedir. Değişen performans talepleri bu sayede karşılanabilir.
7- Terminoloji
7.1 Pod :
Container‘ların çalışma alanı diyebilir. En küçük atanabilir birimdir. Kendilerine has IP’leri vardır. Bir pod içerisinde birden fazla container çalışabilir. Kubernetes tarafında çalışma şekli gereği yeni bir deploy isteği geldiğinde pod’un yeni versiyonu oluşturulur ve çalıştığı görüldüğünde diğer pod versiyonu kapatılır. Dolayısıyla pod içerisinde birden fazla konteyner olduğu durumda diğer uygulamalar container’ları etkilendiğinden bir pod içerisinde bir konteyner tavsiye edilir. Pod öldüğünde tekrar geri kalkmaz aynı image’dan onun yerine yeni bir pod ortaya çıkar ve yeni bir ip adresi alır.
Fiziksel makinelerin üzerinde Virtual Machine(VM) kurmuştuk, bu VM lerin üzerine de containerkonumlandırmıştık, şimdi bu 2 sinin arasına bir katman daha koyuyoruz buna da pod diyoruz.
Özelikleri;
- Container yada Containerlerden oluşur.
- Kubernetes içindeki en küçük yapı taşıdır.
- İçindeki containerler tek bir network namespace kullanırlar.
- Podlar ölümlüdür, ölür ve bir başka pod ayağa kalkar ve işi devir alır.
- Podların IP leri unique dir.
Not: Containerlar birbirleri ile çok ilişikli çalışmıyor ise aynı pod içerisinde konumlandırmak çokta mantıklı değildir. Best practice olarak ayrı podlarda olması gerekiyor.
7.2 Deployment :
Uygulamalarınızı K8s’e deploy ve update etmek için şuan en meşhur ve tavsiye edilen yöntemdir. Replication controllerin yerine geçmesi amacı ile çıkartıldı. İşlemleri yine kendisi gibi yeni olan replicaset’ler aracılığı ile yapar. Rollout changes gibi özellikleri vardır.
Özellikleri;
- Replicaset’in süpervizörüdür.
- Uygulama ve versiyon güncellemelerinin yapıldığı yerdir.
7.3 Service:
Service, podların mantıksal olarak gruplayıp servis olarak dışarıya sunmamızı sağlayan objedir.Buradaki mantıksal gruplama ise Kubernetes’in sunduğu Labels & Selectors ile mümkündür. Podları etiketleyip service olarak tanımlarken seçiciler kullanarak gruplayabiliriz. Recreate, RollingUpdate,Blue-green,A/B ve Canary deployment, pod scaling gibi işlemleri service sayesinde kesintisiz olarak yapabiliyoruz.Bir service NodePort, LoadBalancer, ClusterIP veya externalName yöntemleri ile expose edilebilir.
Servis tiplerini detaylı olarak başka bir yazıda inceliycez.
7.4 Replica Set:
Bir pod dan kaç tane olacağını replicaset ile belirtiyoruz.İstediğiniz anda bir pod’u kesintisiz bir şekilde scale edebilir yada azaltabiliriz.
Replication Controller’ler ile neredeyse aynı işi yapar. Belli sayıda pod’un her zaman çalıştığını kontrol eder. Ufak tefek syntax ve görev farklılıkları vardır aralarında.
7.5 Namespaces:
K8s gerçek cluster üzerinde bir kaç sanal cluster barındırabilir, bu sanal cluster ların her birine namespace denir. Genellikle çok büyük K8s yapılarında ihtiyaç duyulur.
Namespace girerek aslında ortamlarımızı birbirinden izole edebiliyoruz.
7.6 Kubectl:
K8s deki cli dir.
7.7 Kubeadm;
Kubernetes kümeleri (cluster) oluşturmak ve yönetmek için kubeadm aracını kullanabilirsiniz. Kullanıcı dostu bir şekilde minimum uygulanabilir, güvenli bir küme kurmak ve çalıştırmak için gerekli eylemleri gerçekleştirir.
Detaylı olarak K8s kurulumunda bahsediyor olacağım.
7.8 DaemonSet
DaemonSet objesi ile bütün Kubernetes workerlarında bir pod olarak çalışacak uygulama ayağa kaldırılabilir. Buradaki kritik nokta her bir Kubernetes master + workerında sadece replica sayısı kadar podun çalıştırılmalıdır. Genelde loglama için kullanılır.
7.9 ConfigMap;
Configmap, uygulamalarımızda kullandığımız konfigürasyonların dışarıda bir noktaya konularak tek noktadan kolayca yönetilmesine olanak sağlayan bir kubernetes objesidir.
7.10 StatefulSet;
Database ve log gibi state tutma ihtiyacı duyan uygulamalar için Kubernetes’de StatefulSet kullanılması önerilir. Biliyoruz ki Kubernetes’de persist etmek istediğimiz veriyi PersistentVolume şeklinde tutuyoruz. Persist ettiğimiz veri ile Pod ayrı node’a schedule olursa veri pod tarafından erişilemez duruma gelir. Clustered olarak çalışan bir uygulama göz önüne alındığında ise bu çok olası bir durumdur. Bu durumun engellenmesi için de StatefulSet kullanırız.
7.11 Volume;
Container disk’leri geçicidir.Herhangi bir sebepten dolayı pod’un yaşam döngüsü bitmesi ardından diskte bulunan her şey kaybolur. Kubernetes volume’leri için pod tarafından erişilebilen ve yeniden başlatmalarda verisini kaybetmeyen klasörler diyebiliriz.
7.12 Persistent Volume;
Containerlar üzerinde olan dosyalar bir yere persist edilmediği için containerin açıp kapanması sonrasında veri kaybedilir. Bu sebepten dolayı containera yazılan verilerin bir yere persist edilmesi gerekir. Örneğin; Bir Pod crash olursa, yeni bir Pod kubelet tarafından tekrar ayağa kaldırılır ama container içerisine yazılan veriyi kaybetmiş oluruz. Bu soruna çözüm olarak Kubernetes PersistentVolume (PV) objesini kullanmaktadır. PersistentVolume’lar ise PersistentVolumeClaim (PVC)’ler aracılığı ile kullanılabilmektedir.
Bu yazımızında sonu geldik. Araştırmalarım ve sektör de karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur.Yazımı okuduğunuz için teşekkürler. Herkese iyi çalışmalar :)
Referanslar :