berk@bayram
Tüm yazılar

Kubernetes 101: Pod'dan Deployment'a

22 Nisan 20262 dk okuma

Vodafone'da IoT platformunun servis sahibiyken K8s cluster'larını günlük olarak yönetmek zorunda kaldım. Docker'la container çalıştırmayı öğrenmek bir şey, yüzlerce container'ı production'da ayakta tutmak başka bir şey. Kubernetes tam olarak bu ölçeklenme problemini çözüyor.

Neden Kubernetes?

Elinizde 3 container varsa docker run yeterli. Ama 50 mikroservisiniz, otomatik ölçekleme, self-healing ve rolling update ihtiyacınız varsa manuel yönetim imkansızlaşır. Kubernetes bunların hepsini deklaratif bir şekilde tanımlamanızı sağlar.

Temel Yapı Taşları

Pod

Kubernetes'te en küçük dağıtılabilir birim. Genelde tek bir container içerir (bazen yardımcı bir sidecar container ile birlikte).

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp
      image: myapp:1.0
      ports:
        - containerPort: 8080

Pod'lar tek başına kullanılmaz — çünkü bir pod öldüğünde kendini yeniden oluşturmaz. Bunun için Deployment kullanılır.

Deployment

Pod'ların istenen sayıda (replica) ve güncel halde çalışmasını garanti eder.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:1.0
kubectl apply -f deployment.yaml
kubectl get pods
kubectl rollout status deployment/myapp
kubectl scale deployment/myapp --replicas=5

Service

Pod'lar sürekli oluşup silindiği için IP adresleri değişkendir. Service, pod'lara sabit bir isim ve IP üzerinden erişim sağlar.

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP

ConfigMap ve Secret

Konfigürasyonu image'dan ayırmak için:

kubectl create configmap app-config --from-literal=LOG_LEVEL=info
kubectl create secret generic db-secret --from-literal=password=changeme

Günlük Kullanılan Komutlar

kubectl get pods -n production          # namespace'teki pod'ları listele
kubectl describe pod <pod-name>         # detaylı durum ve eventler
kubectl logs -f <pod-name>              # canlı log takibi
kubectl exec -it <pod-name> -- sh       # pod içine gir
kubectl top pods                        # CPU/memory kullanımı

Kapanış

Bu yazı sadece buzdağının görünen kısmı. Helm chart'lar, ingress controller'lar, autoscaling (HPA) ve service mesh gibi konular ayrı yazıları hak ediyor — zamanla onlara da değineceğim.