Kubernetes 101: Pod'dan Deployment'a
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.