Kubernetes Nedir ve Nasıl Çalışır?
Kubernetes, 2014 yılında Google tarafından başlatılan ve şimdi CNCF tarafından sürdürülen, açık kaynaklı bir container yönetim platformudur. Kubernetes ile container tabanlı uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini kolaylaştırırsınız.
Kubernetes nedir? sorusunun cevabına geçmeden önce birden fazla container içine çalışan bir uygulama olduğunu varsayalım. Bu uygulamada güncelleme yapacağınız zaman tüm container'ları tek tek güncellemeli ve bir sorun olduğunda ilgili container'ları manual olarak düzeltmelisiniz. Ayrıca takibini de manual yapmanız gerekir.
Düşük sayılı container'larda bu işlemleri yapmak belki kolay olabilir fakat yüzlerce container olduğunda nasıl başa çıkacaksınız? İşte tam burada container orchestration devreye giriyor.
1. Container Orchestration Nedir?
Container orchestration, containerların provizyonunu, dağıtımını, ağ oluşturmasını, ölçeklendirmesini, kullanılabilirliğini ve yaşam döngüsü yönetimini otomatikleştirir. Böylece manual işlemler yapmanıza gerek kalmaz.
Bazı container orchestration araçları şunlardır:
- Kubernetes
- Docker Swarm
- Apache Mesos
- Azure Kubernetes Service (AKS)
- Amazon Elastic Container Service (EKS)
- Google Kubernetes Engine (GKE)
Günümüzde en ünlü container orchestration aracı Kubernetes'dir.
2. Kubernetes Nedir?
Kubernetes, dümenci veya pilot anlamına gelen Yunanca bir kelimedir. K8s, “ubernete” harflerinin “8” rakamı ile değiştirilmesiyle elde edilen bir kısaltmadır. Kısa bir okunuş ve yazım için genellikle kısaltması kullanılır.
Kubernetes, container uygulamalarının dağıtımını, ölçeklendirmesini ve yönetimini otomatikleştirmek için açık kaynaklı bir container orchestration aracıdır. Yani, container uygulamaların dağıtılması ve ölçeklendirilmesiyle ilgili manuel süreçleri ortadan kaldırarak operasyonları otomatikleştirir.
K8s; on-premise, hibrit veya bulut altyapılarında tam yetenekleriyle beraber sorunsuz kullanılabilir. Günümüzde Huawei Cloud, AWS, GCP, Azure gibi birçok cloud provider tarafından Kubernetes altyapısı sunulmaktadır.
VMWare 2023 raporuna göre Kubernetes için en çok kullanılan cloud providerlar tablodaki gibidir:
3. Docker ve Kubernetes Farkı
Birçok programcı, Docker ve Kubernetes'in aynı şey olduğunu düşünür, ancak değildirler. Her ikisi de container'ları yönetmek birlikte kullanılsa da aralarında pek çok fark vardır.
Docker, bir uygulamayı ve bağımlılıklarını container adı verilen bağımsız tek bir birimde paketler. Container'lar birbirinden ve ana işletim sisteminden yalıtılmıştır, bu da onları uygulamaları farklı ortamlarda tutarlı ve öngörülebilir bir şekilde dağıtmak için ideal bir çözüm haline getirir.
Örneğin, Docker'ı kullanarak Java tabanlı bir uygulamanızı ve bağımlılıklarını tek bir paket haline getirerek her yerde aynı ve tutarlı bir şekilde çalışmasını sağlayabilirsiniz.
Öte yandan Kubernetes, container'lı uygulamaların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştirmek için açık kaynaklı bir platformdur. Docker container'larını da dahil olmak üzere container'ları dağıtmak, ölçeklendirmek ve yönetmek için bir dizi API ve araç sağlar.
Özetle, Docker container'ları sağlar ve Kubernetes bu container'ların orkestrasyonunu ve yönetimini sağlar. Docker ve Kubernetes'in birleşimi, kuruluşların uygulamalarını bir üretim ortamında daha etkin ve verimli bir şekilde yönetmesine ve ölçeklendirmesine olanak tanır.
4. Kubernetes Ne Sağlar?
- Kendi Kendini Onarma - Kubernetes, çalışma sırasında başarısız olan container'ları otomatik olarak yeniden başlatabilir. Ayrıca bir node'un kendisi ölürse, o node üzerinde olan container'ları başka kullanılabilir node'lara otomatik olarak taşır.
- Otomatik Rollout ve Rollback - Uygulamanızı yeni versiyona güncellerken, tüm instance'ları aynı anda öldürmediğinden emin olmak için uygulama sağlığını izlerken bir yandan da uygulamanızda veya yapılandırmasında değişiklikleri aşamalı olarak kullanıma sunar ve bir şeyler ters giderse Kubernetes değişikliği sizin için geri alır.
- Discovery ve Load Balancing - Kubernet'ler, bir IP adresi veya domain'e sahip bir container'ı expose edebilir ve performansı korumak için gerektiği şekilde ağ trafiğini container'lar arasında dağıtabilir.
- Yatay Ölçeklendirme - K8s, basit bir komutla, bir kullanıcı arayüzüyle veya CPU kullanımına göre otomatik olarak gereksinimlere göre uygulamayı ölçeklendirebilir ve küçültebilir.
- Depolama Yönetimi - İster yerel depolama, ister GCP veya AWS gibi bir genel bulut sağlayıcısı veya NFS, iSCSI, Gluster vb. bir ağ depolama sistemi olsun, seçtiğiniz depolama sistemini otomatik olarak container'larınızla kullanabilirsiniz.
5. Kubernetes Mimarisi
Bir Kubernetes cluster, en az bir control plane (master) node ve bir veya daha fazla worker node'dan oluşur. Tüm bu node'lar fiziksel, sanal veya cloud instance'lardan oluşabilir.
🔆 Node
- Node, Kubernetes'teki en küçük donanım birimidir.
- Kümenizdeki tek bir makinenin temsilidir.
- Her Node, control plane tarafından yönetilir.
- Bir Node, birden fazla Pod'a sahip olabilir ve control plane, kümedeki Node'lar boyunca pod'ların dağıtımını otomatik olarak yapar.
🔆 Pod
- Pod'lar, bir Kubernetes kümesindeki oluşturulabilen en küçük birimdir.
- Bir veya daha fazla container'dan oluşan bir Pod oluşturulabilir. Ancak zorunlu olmamakla birlikte, bir Pod genellikle bir container içerir.
- Bir Pod'daki tüm uygulamalar aynı kaynakları ve yerel ağı paylaşarak bir Pod'daki uygulamalar arasındaki iletişimi kolaylaştırır.
🔆 Control Plane
- Control plane aynı zamanda master node olarak da bilinir.
- K8s kümesinini yönetmekten sorumludur.
- Tüm yönetimsel işler için giriş noktasıdır.
- Kümede birden fazla control plane olabilir fakat bunlardan sadece biri lider olacaktır.
- Control plane, bir API aracılığıyla bir CLI veya kullanıcı arayüzünden komut alır.
Control Plane Bileşenleri
👉 kube-apiserver
- API Server, Kubernetes kümesine bir REST arabirimi sunar.
- Control Plane için giriş noktasıdır.
- Tüm küme bileşenlerinin durumunu izler ve aralarındaki etkileşimi yönetir.
👉 Etcd
- Etcd, tutarlı, dağıtılmış ve yüksek düzeyde kullanılabilir bir key/value deposudur.
- Tüm Kubernetes küme verilerini (küme durumu ve yapılandırma) depolayan kalıcı bir depolamadır.
- Control plane'in bir parçası olabilir veya harici olarak yapılandırılabilir.
👉 kube-scheduler
- Çeşitli Node'lara iş atamaktan sorumludur.
- Pod'ları worker node'lara atar.
- Api-server'ı, atanmış bir node olmadan yeni oluşturulan pod'lar için izler ve üzerinde çalışacakları sağlıklı bir node seçer. Uygun node yoksa, pod'lar sağlıklı bir node olana kadar bekleme durumuna alınır.
👉 kube-controller-manager
- Tüm controller'ların controller'ıdır :)
- Yönettiği nesnelerin istenilen durumunu ve mevcut durumunu API server üzerinden izler ve her zaman mevcut durumun istenen durum ile aynı olduğundan emin olur.
- Bazı controller türleri şunlardır; Node controller, Job controller, Endpoints controller, Service Account & Token controllers
👉 Cloud Controller Manager
- Bir bulut ortamında çalışırken kümenizdeki temel bulut teknolojileriyle entegre olmasını sağlar.
Aşağıdaki denetleyicilerin bulut sağlayıcı bağımlılıkları olabilir:
Worker Node Bileşenleri
👉 kubelet
- Kümedeki her node'da çalışır.
- Bir Kubelet, tüm pod'ların çalışır durumda ve sağlıklı olduğundan emin olmak için bir pod'un durumunu izler ve control plane'e birkaç saniyede bir mesaj gönderir.
- Atanacak görevler için API Server'ı izler.
- Control plane'den talimat alır ve sonucunu rapor verir.
👉 kube-proxy
- Bir service nesnesinden bir node'a gelen trafiği doğru pod'lara yönlendiren ağ bileşenidir.
- Bir kümedeki her node'da çalışan ve IP çevirisini ve yönlendirmesini yöneten bir ağ proxy'sidir.
- Node'ları ağ kurallarını yönetir. Bu ağ kuralları, kümenin içinden veya dışından pod'larla ağ iletişimine izin verir.
- Her pod'un benzersiz bir IP adresi almasını sağlar ve bir pod'daki tüm container'ların tek bir IP'yi paylaşmasını mümkün kılar.
👉 Container runtime
- Container runtime, container'ların çalıştırılmasından sorumludur.
- Container'ları çalıştırmak için her çalışan node'un bir pod container runtime implementasyonu vardır.
- Image'leri bir image registry'den çeker ve container'ları çalıştırıp durdurur.
- Kubernetes; containerd, CRI-O gibi birkaç container runtime'ı destekler.
Sıradaki yazı ile eğitim serisine devam edebilirsiniz.