Kubernetes'e Giris: Pod, Deployment ve Service Kavramları

Kubernetes'e Giris: Pod, Deployment ve Service Kavramları

Kubernetes (k8s), container'ları otomatik olarak dağıtan, ölçeklendiren ve yöneten açık kaynak bir orkestrasyon platformudur. CNCF'in 2025 anketine göre üretim ortamında Kubernetes kullanan kuruluşların oranı %84'e ulaştı. Bu rehberde Kubernetes'in temel yapı taşlarını - Pod, Deployment, Service, Re

Kubernetes (k8s), container'ları otomatik olarak dağıtan, ölçeklendiren ve yöneten açık kaynak bir orkestrasyon platformudur. CNCF'in 2025 anketine göre üretim ortamında Kubernetes kullanan kuruluşların oranı %84'e ulaştı. Bu rehberde Kubernetes'in temel yapı taşlarını - Pod, Deployment, Service, ReplicaSet ve Namespace - gerçek YAML örnekleriyle ele alıyoruz.

Kubernetes Nedir ve Neden Kullanılır?

Kubernetes, Google'ın Borg sisteminden esinlenerek geliştirilmiş ve 2014'te açık kaynak olarak yayınlanmıştır. Temel amacı container'ların yaşam döngüsünü yönetmektir: hangi node'da çalışacağı, kaç kopya olacağı, sağlık durumu, ağ erişimi ve güncelleme stratejisi gibi konuları deklaratif YAML dosyalarıyla tanımlarsınız, Kubernetes geri kalanını halleder.

Docker tek bir makinede container çalıştırır; Kubernetes ise onlarca veya yüzlerce makineyi tek bir cluster olarak yönetir. Uygulamanız çökerse otomatik yeniden başlatır, trafik artarsa yatay ölçekleme yapar, güncelleme sırasında sıfır kesinti sağlar.

💡 Ön Koşul: Bu rehberi takip etmek için Docker temellerini bilmeniz ve kubectl CLI aracının kurulu olması yeterlidir. Yerel ortamda denemek için Minikube veya kind kullanabilirsiniz.

Kubernetes Mimarisi: Control Plane ve Worker Node

Bir Kubernetes cluster'ı iki ana bileşenden oluşur: Control Plane (yönetim katmanı) ve Worker Node'lar (iş yükü katmanı).

Bileşen Katman Görevi
kube-apiserver Control Plane Tüm API isteklerini karşılar, cluster'ın giriş noktası
etcd Control Plane Cluster durumunu saklayan key-value veritabanı
kube-scheduler Control Plane Pod'ları uygun node'lara atar
kubelet Worker Node Pod'ları node üzerinde çalıştırır ve izler
kube-proxy Worker Node Ağ kurallarını yönetir, Service trafiğini yönlendirir

Pod: Kubernetes'in En Küçük Birimi

Pod, Kubernetes'te dağıtılabilir en küçük birimdir. Bir Pod içinde bir veya birden fazla container aynı ağ namespace'ini ve depolama alanını paylaşır. Pratikte çoğu Pod tek bir container barındırır; sidecar pattern gibi durumlarda birden fazla container kullanılır.

pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25-alpine
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "100m"
      limits:
        memory: "128Mi"
        cpu: "250m"

⚠️ Önemli: Üretim ortamında Pod'ları doğrudan oluşturmayın. Pod silindiğinde yeniden oluşturulmaz. Bunun yerine Deployment veya StatefulSet kullanın - bu kaynaklar Pod'ların yaşam döngüsünü otomatik yönetir.

Deployment: Uygulama Dağıtımı ve Güncelleme

Deployment, Pod'ların istenen sayıda çalışmasını garanti eder. Bir Pod çökerse otomatik yeniden oluşturur, güncelleme sırasında rolling update stratejisi ile sıfır kesinti sağlar. Arka planda ReplicaSet nesnelerini yönetir.

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: myapp:v1.2.0
        ports:
        - containerPort: 3000
        readinessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 10

Deployment güncellemesi sırasında maxSurge: 1 aynı anda en fazla 1 fazla Pod oluşturulmasını, maxUnavailable: 0 ise hiçbir Pod'un kullanılamaz hale gelmemesini sağlar. Bu sayede güncelleme sırasında trafik kesintisi yaşanmaz.

terminal
# Deployment olustur
kubectl apply -f deployment.yaml

# Deployment durumunu kontrol et
kubectl rollout status deployment/web-app

# Image guncelle (rolling update baslar)
kubectl set image deployment/web-app web-app=myapp:v1.3.0

# Guncellemeyi geri al
kubectl rollout undo deployment/web-app

# Replica sayisini degistir
kubectl scale deployment/web-app --replicas=5

Service: Pod'lara Sabit Ağ Erişimi

Pod'lar geçici IP adresleri alır ve yeniden oluşturulduğunda IP değişir. Service, Pod'ların önüne sabit bir ağ adresi koyarak bu sorunu çözer. Label selector ile eşleşen Pod'lara trafiği otomatik dağıtır.

Service Türü Erişim Kullanım Senaryosu
ClusterIP Yalnızca cluster içi Mikroservisler arası iletişim
NodePort Node IP:Port üzerinden dış erişim Geliştirme ve test ortamı
LoadBalancer Bulut sağlayıcı load balancer Üretim ortamı dış trafik
ExternalName DNS CNAME yönlendirme Dış servislere erişim
service.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-app-service
spec:
  type: ClusterIP
  selector:
    app: web-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

Bu Service tanımı, app: web-app label'ına sahip tüm Pod'lara gelen trafiği port 80'den alıp Pod'ların 3000 portuna yönlendirir. Cluster içindeki diğer Pod'lar web-app-service:80 adresiyle bu servise erişebilir.

Namespace ile Kaynak İzolasyonu

Namespace, tek bir cluster'ı mantıksal bölümlere ayırır. Farklı ekipler, ortamlar (dev/staging/prod) veya projeler için ayrı namespace'ler oluşturarak kaynak kotaları ve erişim kontrolü uygulayabilirsiniz.

terminal
# Namespace olustur
kubectl create namespace production
kubectl create namespace staging

# Belirli namespace'e deploy et
kubectl apply -f deployment.yaml -n production

# Namespace'deki kaynaklari listele
kubectl get pods -n production

# Kaynak kotasi tanimla
kubectl apply -f - <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: staging-quota
  namespace: staging
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "20"
EOF

kubectl Temel Komutları

kubectl, Kubernetes cluster'ıyla etkileşim kurmak için kullanılan CLI aracıdır. Günlük operasyonlarda en sık kullanacağınız komutlar:

terminal
# Cluster bilgisi
kubectl cluster-info
kubectl get nodes

# Kaynaklari listeleme
kubectl get pods,svc,deploy -o wide

# Pod detayi ve loglar
kubectl describe pod nginx-pod
kubectl logs -f web-app-7d9f8b6c4-x2k9p

# Pod icine baglanma
kubectl exec -it web-app-7d9f8b6c4-x2k9p -- /bin/sh

# Port forwarding (yerel test)
kubectl port-forward svc/web-app-service 8080:80

# YAML ciktisi alma
kubectl get deploy web-app -o yaml

Üretim Ortamı Kontrol Listesi

  • Resource Limits Tanımlayın Her container için CPU ve memory requests/limits belirleyin. Limitsiz Pod'lar node kaynaklarını tüketebilir.
  • Liveness ve Readiness Probe Ekleyin Liveness probe çökmüş container'ları yeniden başlatır, readiness probe hazır olmayan Pod'lara trafik gitmesini engeller.
  • En Az 2 Replica Kullanın Tek replica ile node arızasında servis kesintisi yaşarsınız. Üretimde minimum 2, kritik servisler için 3+ replica kullanın.
  • Image Tag'lerinde latest Kullanmayın Sabit sürüm tag'leri (v1.2.0) kullanın. latest tag'i hangi sürümün çalıştığını takip etmeyi imkansız kılar.

Kubernetes otomatik ölçekleme için HPA (Horizontal Pod Autoscaling) rehberimizi, uygulama dağıtımını standardize etmek için Helm Chart rehberimizi inceleyin. Container güvenliği için Docker Image Güvenlik rehberimize göz atın. Kubernetes resmi dokümantasyonu ve CNCF yıllık anketi ek kaynak olarak faydalıdır.

Sıkça Sorulan Sorular

Kubernetes öğrenmek için Docker bilmek zorunlu mu?

Evet, Kubernetes container'ları yönetir ve temel birim olan Pod bir veya daha fazla container barındırır. Docker image oluşturma, Dockerfile yazma ve container yaşam döngüsünü anlamak Kubernetes'e geçiş için ön koşuldur.

Küçük projeler için Kubernetes gerekli mi?

Tek bir uygulama ve düşük trafik için Docker Compose yeterlidir. Kubernetes, birden fazla servisin koordinasyonu, otomatik ölçekleme ve yüksek erişilebilirlik gerektiğinde değer katar. 3-5+ mikroservis varsa değerlendirin.

Minikube ile kind arasındaki fark nedir?

Minikube tek node'lu bir VM veya container içinde cluster oluşturur ve dashboard gibi eklentiler sunar. kind (Kubernetes in Docker) Docker container'ları içinde multi-node cluster oluşturur ve CI/CD ortamlarında daha hızlı çalışır.

Pod ile container aynı şey mi?

Hayır. Pod, Kubernetes'in en küçük dağıtım birimidir ve bir veya birden fazla container barındırabilir. Aynı Pod içindeki container'lar aynı IP adresini ve volume'ları paylaşır. Çoğu durumda bir Pod tek container içerir.

Kubernetes cluster'ı için minimum kaç sunucu gerekir?

Üretim ortamı için minimum 3 node önerilir: 1 control plane + 2 worker node. Yüksek erişilebilirlik için 3 control plane + 3 worker node kullanın. Geliştirme ortamında Minikube ile tek node yeterlidir.

Sonuç

Kubernetes'in temel yapı taşları olan Pod, Deployment ve Service kavramlarını öğrendiniz. Pod container'ları barındırır, Deployment Pod'ların yaşam döngüsünü yönetir, Service ise sabit ağ erişimi sağlar. Namespace ile kaynakları izole edebilir, kubectl ile cluster'ınızı yönetebilirsiniz. Bir sonraki adım olarak yerel ortamda Minikube kurarak bu YAML dosyalarını uygulayın.

Kubernetes Altyapınız İçin Güçlü Sunucular

Hosted Cloud bulut sunucuları ile Kubernetes cluster'ınızı yüksek performans ve düşük gecikme ile çalıştırın.

Bulut Sunucu Planlarını İncele →
A

Ahmet Yılmaz

Kıdemli Altyapı Mühendisi

10 yılı aşkın bulut altyapısı ve DevOps deneyimiyle Hosted Cloud'un teknik ekibinde yer almaktadır. Kubernetes, Terraform ve yüksek erişilebilirlik mimarileri üzerine uzmanlaşmıştır.

Yorumlar yakında