Gece yarısı trafik aniden üç katına çıkarsa, elle yeni sunucu açıp yapılandırma yapan bir ekip o yükün altında kalır ve kullanıcılarını kaybeder. Kubernetes'in çözdüğü problem tam olarak budur: konteynerlerin ne zaman çoğalacağına, hangi sunucuda çalışacağına ve bir şey çöktüğünde ne yapılacağına otomatik karar veren bir sistemdir. Bu yazıda Kubernetes'in temel kavramlarını, gerçek bir YAML dosyası üzerinden nasıl çalıştığını ve ne zaman gerçekten gerekli olduğunu ele alıyorum.
Kubernetes tam olarak ne yapar?
Kubernetes (kısaca K8s), konteynerleştirilmiş uygulamaların dağıtımını, ölçeklendirilmesini ve arıza kurtarmasını otomatikleştiren açık kaynaklı bir orkestrasyon platformudur. Konteyner, bir uygulamayı ve tüm bağımlılıklarını tek bir taşınabilir pakette birleştiren Docker gibi bir teknolojidir. Tek bir konteyner çalıştırmak kolaydır. Ama yüzlerce konteyneri, hangisinin hangi sunucuda çalıştığını ve arızalandığında nasıl yeniden başlatılacağını elle takip etmek pratikte imkânsız hâle gelir.
Kubernetes bu takibi sizin yerinize yapar. Ona "bu uygulamanın üç kopyası sürekli çalışsın" dediğinizde, bir kopya çökerse otomatik olarak yenisini başlatır. Trafik arttığında kopya sayısını artırır, azaldığında düşürür. Bu otomasyon, Google'ın kendi iç sistemi Borg'dan ilham alınarak geliştirildi ve 2014'te açık kaynak olarak yayınlandı; bugün Cloud Native Computing Foundation çatısı altında geliştiriliyor.
Bu geçmiş, Kubernetes'in neden bu kadar olgun bir sistem olduğunu açıklar. Google, kendi veri merkezlerinde milyonlarca konteyneri yönetirken öğrendiği dersleri Kubernetes'in tasarımına aktardı. Bu yüzden proje, sıfırdan yazılmış deneysel bir araçtan çok, gerçek üretim ortamlarında sınanmış bir mimariyi temel alıyor.
Temel yapı taşları neler?
Kubernetes'i anlamak için dört temel kavramı bilmek yeterlidir. Pod, en küçük dağıtım birimidir; genellikle tek bir konteyner içerir ve Kubernetes konteynerleri doğrudan değil, pod'lar aracılığıyla yönetir. Node, pod'ların çalıştığı fiziksel veya sanal sunucudur. Birden fazla node bir araya gelip cluster'ı (küme) oluşturur. Bu kavramların resmi tanımlarını Kubernetes'in kendi belgelerinden ayrıntılı okuyabilirsiniz.

Deployment, kaç pod kopyasının çalışacağını ve nasıl güncelleneceğini tanımlar. Service ise pod'lara sabit bir erişim noktası sağlar. Pod'lar arıza durumunda yeniden oluşturulduğunda IP adresleri değişebilir; Service bu değişkenliği kullanıcıdan gizler. Gerçek bir örnek, bu kavramları çok daha net oturtur:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-uygulama
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
Bu dosya, nginx:1.25 imajından üç kopya (replicas: 3) çalıştırılmasını tanımlar. kubectl apply -f deployment.yaml komutuyla bu tanımı cluster'a gönderdiğinizde, Kubernetes üç pod oluşturur ve bu üç kopyayı sürekli çalışır durumda tutar.
Buradaki kritik nokta "sürekli" kelimesidir. Bir pod'u elle silseniz bile, Deployment kontrolcüsü hedeflenen kopya sayısına (3) geri dönmek için otomatik olarak yeni bir pod oluşturur. Bu, imperatif ("şunu şimdi yap") değil deklaratif ("dünyanın böyle olmasını istiyorum") bir yönetim modelidir. Kubernetes sürekli olarak mevcut durumu istenen durumla karşılaştırır ve farkı kapatmaya çalışır.
Kubernetes neden bu kadar tercih ediliyor?
Otomatik ölçeklendirme, en somut faydalardan biridir. Horizontal Pod Autoscaler, CPU kullanımına göre pod sayısını otomatik ayarlar:

kubectl autoscale deployment web-uygulama --min=3 --max=10 --cpu-percent=70
Bu komut, CPU kullanımı yüzde 70'i geçtiğinde pod sayısını otomatik artırır, yük düşünce azaltır; manuel müdahale gerekmez. Kendini iyileştirme (self-healing) özelliği de aynı derecede değerlidir: bir pod çökerse veya sağlık kontrolünden geçemezse, Kubernetes onu otomatik olarak yeniden başlatır veya sağlıklı bir node'a taşır.
Kademeli dağıtım (rolling update), güncellemeleri güvenli hâle getirir. Yeni bir imaj sürümü dağıtırken Kubernetes, eski pod'ları teker teker yenileriyle değiştirir. Bir sorun tespit edilirse otomatik olarak önceki sürüme geri döner. Bu, tüm sistemi aynı anda durdurup güncellemek yerine kesintisiz bir geçiş sağlar.
Yük dengeleme de listedeki güçlü özelliklerden biridir. Service kaynağı, gelen trafiği çalışan pod'lar arasında otomatik olarak dağıtır; bir pod yoğun çalışırken diğerleri boşta kalmaz. Depolama orkestrasyonu ise, veritabanı gibi durum tutan (stateful) uygulamalar için disk kaynaklarını pod'ların yaşam döngüsünden bağımsız biçimde yönetmenizi sağlar.
Gizli bilgi yönetimi (Secret) ve yapılandırma yönetimi (ConfigMap), bir diğer pratik faydadır. Veritabanı şifreleri veya API anahtarları gibi hassas bilgileri doğrudan kod içine gömmek yerine, Kubernetes'in Secret kaynağında saklayıp pod'lara ortam değişkeni olarak enjekte edebilirsiniz. Bu ayrım, aynı imajı farklı ortamlarda (geliştirme, test, üretim) farklı yapılandırmalarla çalıştırmayı kolaylaştırır.
Kubernetes her projede gerekli mi?
Hayır, ve bu noktayı net konuşmak gerekir. Kubernetes'in gerçek değeri, çok sayıda konteyner, mikroservis mimarisi ve yüksek erişilebilirlik gereksinimi olan sistemlerde ortaya çıkar. Aşağıdaki tablo, ne zaman Kubernetes'e, ne zaman daha basit bir çözüme yönelmeniz gerektiğini özetliyor:
| Senaryo | Önerilen yaklaşım |
|---|---|
| Tek konteynerli küçük uygulama | Docker Compose veya basit bir VPS |
| Birkaç mikroservis, orta trafik | Yönetilen konteyner hizmeti (ECS, Cloud Run) |
| Onlarca mikroservis, yüksek trafik | Kubernetes (yönetilen: EKS, GKE, AKS) |
| Yüksek erişilebilirlik zorunlu | Kubernetes |
Küçük bir kişisel proje veya MVP için Kubernetes kurmak, sağladığı faydadan çok daha fazla operasyonel yük getirir. Öğrenme eğrisi diktir, YAML dosyaları hızla karmaşıklaşır ve tek başınıza bir cluster'ı yönetmek zaman alır. Bu durumda Docker Compose veya bir PaaS (Heroku, Railway gibi) çok daha pratiktir.
Birçok kuruluş, bu karmaşıklığı azaltmak için yönetilen Kubernetes hizmetlerini (Amazon EKS, Google GKE, Azure AKS) tercih eder. Bu hizmetler, cluster'ın kontrol düzlemini (control plane) sizin yerinize işletir; siz yalnızca uygulamalarınızı dağıtmaya odaklanırsınız. Bu, Kubernetes'in gücünden yararlanırken altyapı yönetiminin en zahmetli kısmını bulut sağlayıcısına devretmenin bir yoludur.
Docker ile Kubernetes arasındaki fark ne?
Bu iki teknoloji sık karıştırılır ama farklı katmanlarda çalışır. Docker, bir uygulamayı imaj hâline getirip konteyner olarak çalıştıran araçtır; docker build ile bir imaj oluşturur, docker run ile çalıştırırsınız. Kubernetes ise bu konteynerlerin çok sayıda kopyasını, birden fazla sunucuda, otomatik biçimde yönetir.

Basit bir benzetmeyle: Docker, tek bir kamyonu nasıl paketleyip yola çıkaracağınızı belirler; Kubernetes ise yüzlerce kamyondan oluşan bir filoyu, hangi kamyonun hangi rotada gideceğini ve biri arızalanınca ne olacağını otomatik yöneten bir lojistik sistemidir. İkisi rakip değildir, birbirini tamamlayan katmanlardır; önce Docker ile konteynerleştirir, sonra Kubernetes ile orkestre edersiniz.
Kubernetes'in kendisi, hangi konteyner çalışma zamanının (container runtime) kullanılacağı konusunda esnektir; Docker'ın yanı sıra containerd veya CRI-O gibi alternatifler de desteklenir. Bu detay günlük kullanımda pek fark edilmez, ama "Kubernetes Docker'ın yerini mi alıyor" sorusunun cevabını netleştirir: hayır, farklı bir katmanda çalışır.
Öğrenmeye nereden başlamalı?
Doğrudan production cluster'ı kurmaya çalışmak, çoğu kişinin caydığı noktadır. Minikube veya kind (Kubernetes in Docker) gibi araçlar, kendi bilgisayarınızda tek komutla küçük bir Kubernetes cluster'ı ayağa kaldırır:
minikube start
kubectl get nodes
Bu iki komutla çalışan bir cluster'ınız olur. Buraya basit bir nginx deployment'ı uygulayıp kubectl get pods ile durumu izlemek, teorik kavramları somut hâle getirir. Temel kavramları (pod, deployment, service) bu şekilde elle deneyimledikten sonra, Helm gibi paket yöneticilerine ve daha gelişmiş ağ yapılandırmalarına geçmek çok daha kolay olur.
- Önce konteynerleri (Docker temelleri) öğrenin, Kubernetes'i değil
- Minikube veya kind ile yerel bir cluster kurup pod, deployment, service kavramlarını elle deneyin
- Basit bir uygulamayı (örneğin nginx) dağıtıp kasıtlı olarak bir pod'u silin, ne olduğunu izleyin
- Helm ile paket yönetimini, ardından ConfigMap ve Secret ile yapılandırma yönetimini öğrenin
- Gerçek bir projeye, önce staging ortamında, kademeli olarak geçin
Kubernetes'in resmi dokümantasyonu (kubernetes.io), her kavram için etkileşimli bir öğretici (interactive tutorial) sunar; tarayıcı üzerinden gerçek bir terminal açılır ve kurulum derdi olmadan pratik yapabilirsiniz. Öğrenme sürecinde en büyük fark, teoriyi okumak yerine kubectl komutlarını gerçekten çalıştırmaktan gelir. Bir pod'u kasıtlı olarak silip Kubernetes'in onu nasıl yeniden oluşturduğunu izlemek, herhangi bir makaleden daha çok şey öğretir. Linux kategorisindeki diğer yazılar konteyner ve sunucu yönetimi konusunda tamamlayıcı bilgiler sunar.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.