Appearance
Kubernetes: İlk Bakışta Anla (Uygulama Odaklı)
Kubernetes (k8s), container çalışan uygulamaları otomatik olarak çalıştıran, ölçekleyen ve güncelleyen bir orkestrasyon platformudur. Kısaca: "Sunucularla değil, uygulamayla uğraş" prensibidir.
1. Kubernetes Ne İşe Yarar?
- Uygulama çökerse yeniden başlatır (self-healing).
- Trafik artınca yeni pod açar (auto-scaling).
- Sürüm güncellemesini kesintisiz yapar (rolling update).
- Servisleri sabit bir DNS/IP ile sunar.
- Konfigürasyon ve secret'ları imajdan ayırır.
2. En Temel Kavramlar (Özet)
- Cluster: Birden fazla makinenin (node) toplamı.
- Control Plane: Cluster'ı yöneten beyin (API server, scheduler, controller manager).
- Node: Uygulamanın koştuğu makine.
- Namespace: Mantıksal ortam ayırma (dev, test, prod gibi).
- Pod: Kubernetes'in en küçük çalıştırılabilir birimi (1+ container).
- Deployment: Pod'ları yönetir, ölçekler, günceller.
- Service: Pod'lara sabit erişim sağlar (IP/DNS).
- Ingress: HTTP/HTTPS trafiğini Service'lere yönlendirir.
- ConfigMap / Secret: Konfigürasyon ve gizli veriler.
- Volume / PVC: Kalıcı veri saklama.
- StatefulSet: Stateful uygulamalar (DB gibi) için.
- HPA: CPU/bellek bazlı otomatik ölçekleme.
3. Basit Akış: "Koddan Üretime"
- Uygulamanı container imajına çevir (
Dockerfile). - İmajı registry'ye push et.
- Deployment ile pod'ları ayağa kaldır.
- Service ile sabit IP/DNS ver.
- Ingress ile dış dünyaya aç.
- Güncelleme geldiğinde yeni imajla rollout yap.
4. İlk Uygulama: Basit Web Uygulaması
Aşağıdaki örnek şunları gösterir:
- ConfigMap ile içerik yönetimi
- Secret ile gizli değer
- Deployment + Service + Ingress
yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
---
apiVersion: v1
kind: ConfigMap
metadata:
name: web-config
namespace: demo
labels:
app: web
tier: frontend
data:
index.html: |
<h1>Merhaba Kubernetes!</h1>
<p>Bu sayfa ConfigMap'ten geliyor.</p>
---
apiVersion: v1
kind: Secret
metadata:
name: web-secret
namespace: demo
stringData:
API_KEY: super-secret
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: demo
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25.4
ports:
- containerPort: 80
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: web-secret
key: API_KEY
volumeMounts:
- name: web-content
mountPath: /usr/share/nginx/html
resources:
requests:
cpu: "50m"
memory: "64Mi"
limits:
cpu: "250m"
memory: "256Mi"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 10
volumes:
- name: web-content
configMap:
name: web-config
---
apiVersion: v1
kind: Service
metadata:
name: web
namespace: demo
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
namespace: demo
spec:
rules:
- host: demo.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80Uygulamayı çalıştırmak için:
bash
kubectl apply -f app.yamlKontrol komutları:
bash
kubectl get pods -n demo
kubectl get svc -n demo
kubectl get ingress -n demo
kubectl describe deploy web -n demo
kubectl logs deploy/web -n demoNotlar:
- Ingress çalışması için Ingress Controller kurulu olmalı.
- Lokal kullanımda
kubectl port-forward svc/web 8080:80 -n demoile test edebilirsin.
5. Güncelleme, Ölçekleme, Geri Alma
Güncelleme (yeni imaj):
bash
kubectl set image deployment/web nginx=nginx:1.26.0 -n demo
kubectl rollout status deployment/web -n demoÖlçekleme:
bash
kubectl scale deployment/web --replicas=4 -n demoRollback:
bash
kubectl rollout undo deployment/web -n demo6. Ne Zaman Ne Kullanılır?
- Deployment: Web/API gibi stateless uygulamalar.
- StatefulSet + PVC: Veritabanı, queue gibi stateful işler.
- DaemonSet: Her node'da çalışan agent'lar (log, monitoring).
- Job/CronJob: Tek seferlik veya periyodik işler.
7. En Sık Hatalar ve Çözümler
- Pod Pending: Node'da kaynak yok ya da PVC bağlanamadı.
- ImagePullBackOff: İmaj adı yanlış veya registry erişimi yok.
- CrashLoopBackOff: Uygulama sürekli çöküyor (loglara bak).
Hızlı kontrol:
bash
kubectl describe pod <pod-adi> -n demo
kubectl logs <pod-adi> -n demo8. Kısaca Özet
Kubernetes, uygulamanın kaç kopya çalışacağını, nasıl güncelleneceğini ve nasıl erişileceğini senin yerine yönetir. Sen sadece istenen durumu tanımlarsın.