Kubernetes Nedir ve Neden Önemlidir?
Günümüzün hızlı gelişen yazılım geliştirme ortamında, uygulamalarınızı güvenilir, ölçeklenebilir ve yönetilebilir bir şekilde dağıtmak kritik bir ihtiyaçtır. Kubernetes, bu zorlukları çözmek için tasarlanmış açık kaynak bir konteyner orkestrasyonu platformudur. Google tarafından geliştirilen ve şimdi Cloud Native Computing Foundation tarafından yönetilen Kubernetes, dünyanın en güçlü ve yaygın olarak kullanılan orkestrasyonu platformu haline gelmiştir.
Konteyner teknolojisinin (özellikle Docker) yaygınlaşmasıyla birlikte, yazılım geliştirme ekipleri yüzlerce hatta binlerce konteyneri yönetme ihtiyacı ile karşı karşıya kalmıştır. İşte burada Kubernetes devreye giriyor. Kubernetes, konteynerlerinizi otomatik olarak dağıtmak, ölçeklendirmek ve yönetmek için gerekli araçları sağlar.
"Kubernetes, modern yazılım geliştirmenin omurgasıdır ve 2025'te bulut-native uygulamalar geliştirmek isteyen her şirketin bilmesi gereken bir teknolojidir."
Konteyner Orkestrasyonu Nedir?
Konteyner orkestrasyonu, birden fazla konteynerin otomatik olarak dağıtılması, yönetilmesi ve ölçeklendirilmesi işlemidir. Geleneksel sunucu ortamlarında uygulamaları manuel olarak dağıtmak ve yönetmek zaman alıcı, hata yapılabilir ve ölçeklenebilirlik açısından sınırlıdır.
Konteyner Orkestrasyonunun Ana Görevleri
- Otomatik Dağıtım: Konteynerleriniz otomatik olarak uygun sunuculara yerleştirilir
- Kaynak Optimizasyonu: CPU ve bellek kullanımı en verimli şekilde dağıtılır
- Yüksek Erişilebilirlik: Başarısız konteynerler otomatik olarak yeniden başlatılır
- Ağ Yönetimi: Konteynerler arasındaki haberleşme otomatik olarak yapılandırılır
- Depolama Yönetimi: Kalıcı veriler güvenli bir şekilde yönetilir
- Ölçeklendirme: Talep arttıkça uygulamalar otomatik olarak ölçeklendirilir
Kubernetes'in Temel Mimarisi
Kubernetes, master-worker (veya control plane-node) mimarisine dayanır. Sistemi anlamak için temel bileşenleri bilmek önemlidir.
Control Plane (Kontrol Düzlemi)
Control plane, Kubernetes kümesinin beynini oluşturur. Tüm kararları alır, durumu yönetir ve komutları uygular. Ana bileşenleri şunlardır:
- API Server: Kubernetes'in merkezi iletişim noktası
- etcd: Kümenin tüm durumunu saklayan anahtar-değer veritabanı
- Scheduler: Podları uygun worker düğümlerine yerleştirir
- Controller Manager: Çeşitli kontrolörleri çalıştırır ve sistemi istenen durumda tutmaya çalışır
Worker Düğümleri
Worker düğümleri, konteynerlerin gerçekten çalıştığı makinelerdir. Her worker düğümü şu bileşenleri içerir:
- Kubelet: Düğüm aracısı, kontrol düzleminin komutlarını yerine getirir
- Container Runtime: Docker, containerd veya diğer konteyner çalıştırma ortamları
- kube-proxy: Ağ iletişimini yönetir
Pod Kavramı
Pod, Kubernetes'in en küçük dağıtılabilir birimidir. Bir veya daha fazla konteyneri içerebilir (genellikle bir tane). Podlar kısa ömürlüdür ve Kubernetes tarafından gerektiğinde oluşturulup silinirler.
Kubernetes'in Ana Özellikleri ve Faydaları
Otomatik Ölçeklendirme
Kubernetes, uygulamanızın kaynak kullanımını izler ve otomatik olarak pod sayısını artırıp azaltır. Örneğin, web sitenize trafiğin aniden artması durumunda, Kubernetes otomatik olarak daha fazla pod başlatır. Talep azaldığında da gereksiz podları kapatır. Bu, maliyetleri düşürür ve performansı yüksek tutar.
Kendini İyileştirme ve Yüksek Erişilebilirlik
Bir pod çökerse, Kubernetes otomatik olarak yenisini başlatır. Bir worker düğümü başarısız olursa, o düğümdeki podlar başka düğümlerde yeniden başlatılır. Bu, uygulamanızın kesintisiz hizmet sunmasını sağlar.
Deklaratif Yapılandırma
Kubernetes ile uygulamanızın ne olması gerektiğini belirtirsiniz, Kubernetes ise nasıl sağlanacağını otomatik olarak halleder. YAML dosyaları kullanarak konfigürasyonları tanımlayabilirsiniz.
Güncelleme Stratejileri
Uygulamanız sürümünü güncellemek istediğinizde, Kubernetes bunu sıfır kapalı kalma süresiyle (zero-downtime) gerçekleştirir. Rolling update stratejisi, podları kademeli olarak yeni sürüme günceller.
Portabilite
Kubernetes kullanarak yazılan uygulamalar, herhangi bir bulut sağlayıcısında (AWS, Google Cloud, Azure) veya kendi veri merkezinizde aynı şekilde çalışır. Bu vendor lock-in sorununu ortadan kaldırır.
Kubernetes ile Başlamak: Pratik Adımlar
Adım 1: Ortamı Hazırlamak
Kubernetes'e başlamadan önce, local ortamınızda test etmek için seçenekleriniz vardır:
- Docker Desktop: Windows ve Mac'te Kubernetes desteği içerir
- Minikube: Tek makinede minimal Kubernetes kümesi çalıştırır
- Kind: Docker'ı kullanarak Kubernetes testleri gerçekleştirir
- Managed Services: AWS EKS, Google GKE, Azure AKS gibi yönetilen hizmetler
Başlangıçta, Minikube veya Docker Desktop ile çalışmaya başlamanızı öneririz. Bunlar kurulması kolay ve öğrenme amaçlı yeterlidir.
Adım 2: Kubectl Kurulması
Kubectl, Kubernetes ile iletişim kurmak için kullanılan komut satırı aracıdır. Kubectl yükledikten sonra, kümenizdeki kaynakları yönetebilirsiniz:
- Kubectl'ı resmi web sitesinden indirin ve kurun
- Kurulumun başarılı olduğundan emin olmak için `kubectl version` çalıştırın
- Kümenizdeki düğümleri listelemek için `kubectl get nodes` komutunu kullanın
Adım 3: İlk Aplikasyonunuzu Dağıtın
En basit yöntemle, komut satırı aracılığıyla bir pod oluşturun:
kubectl run my-app --image=nginx:latest --port=80
Bu komut, nginx konteyneri çalıştıran bir pod oluşturur. Kontrol etmek için `kubectl get pods` yazın.
Adım 4: YAML Manifest Dosyalarıyla Çalışmak
Üretim ortamlarında, uygulamaları YAML dosyaları aracılığıyla tanımlamanız gerekir. Örnek bir Deployment manifest dosyası:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0
ports:
- containerPort: 8080
Bu manifest dosyası, "my-app" imajından 3 kopya (replica) pod çalıştıran bir Deployment oluşturur. Dosyayı uygulamak için `kubectl apply -f deployment.yaml` komutunu kullanın.
Kubernetes'te Önemli Kaynaklar
Deployment
Deployment, en yaygın kullanılan Kubernetes kaynağıdır. Stateless uygulamalar için ideal olandır. Pod sayısını istenen düzeyde tutmayı, güncellemeleri yönetmeyi ve geri alma işlemini otomatikleştirir.
Service
Podlar kısa ömürlü olduğundan ve IP adresleri değişebileceğinden, Service kaynağı kullanılarak sabit bir erişim noktası sağlanır. Service türleri:
- ClusterIP: Sadece küme içinde erişilebilir (varsayılan)
- NodePort: Dış ağdan erişim sağlar
- LoadBalancer: Bulut sağlayıcısının load balancer'ını kullanır
- ExternalName: Harici bir hizmeti eşleştirir
ConfigMap ve Secret
ConfigMap, konfigürasyon verilerini saklayan kaynaktır. Secret ise hassas veriler (parolalar, API anahtarları) için kullanılır. Bu kaynakları kullanarak, uygulamanızı çevre değişkenlerine göre uyarlanabilir hale getirirsiniz.
Persistent Volume
Bazı uygulamalar kalıcı depolama gerektirir. Persistent Volume (PV) ve Persistent Volume Claim (PVC) kaynakları, depolama yönetimini basitleştirir.
Kubernetes'te En İyi Uygulamalar
Resource Requests ve Limits Belirleyin
Her konteynere CPU ve bellek talebi (request) ve limitleri belirleyin. Bu, Kubernetes'in pod'ları doğru şekilde yerleştirmesine ve kaynak yönetimini iyileştirmesine yardımcı olur:
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
Health Check'leri Yapılandırın
Liveness ve readiness probe'larını tanımlayın. Liveness probe, pod'un hayatta olup olmadığını kontrol eder. Readiness probe ise pod'un trafiği almaya hazır olup olmadığını belirler.
Namespace'leri Kullanın
Büyük Kubernetes kümelerinde, namespace'leri kullanarak kaynakları izole edin. Farklı projeler veya ekipler için ayrı namespace'ler oluşturun.
Image Versiyonlarını Belirtin
Konteyner imajları için her zaman belirli bir sürüm belirtin. "latest" tag'ı kullanmaktan kaçının, çünkü bu öngörülemez davranışlara neden olabilir.
RBAC (Role-Based Access Control) Uygulayın
Kubernetes kümesine erişim kontrolü sağlamak için RBAC kullanın. Her servis hesabına (service account) yalnızca gerekli izinleri verin.
Kubernetes'teki Yaygın Zorluklar ve Çözümleri
Ağ Sorunları
Kubernetes'teki ağ yapılandırması karmaşık olabilir. Podlar arasında haberleşme sorunları yaşanıyorsa, network policy'leri kontrol edin ve DNS çözümlemesini doğrulayın.