Ana içeriğe geç

Container Orchestration

Container orchestration, container’ların ölçeklenmesi, dağıtımı ve yönetimini otomatikleştirir; yanlış yapılandırma kaynak israfına ve servis kesintilerine yol açar.


1. Resource Limitleri Belirlememek

Yanlış Kullanım: Container’lara sınırsız kaynak tanımlamak.

spec:
  containers:
    - name: myapp
      image: myapp:v1
      # Resource limitleri yok
      # Bir pod tüm node kaynaklarını tüketebilir

İdeal Kullanım: Request ve limit değerlerini tanımlayın.

spec:
  containers:
    - name: myapp
      image: myapp:v1
      resources:
        requests:
          cpu: "250m"
          memory: "256Mi"
        limits:
          cpu: "500m"
          memory: "512Mi"

2. Horizontal Pod Autoscaler Kullanmamak

Yanlış Kullanım: Sabit replica sayısı ile çalışmak.

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3  # Yük artsa da azalsa da 3 pod

İdeal Kullanım: HPA ile otomatik ölçekleme yapın.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

3. ConfigMap ve Secret Kullanmamak

Yanlış Kullanım: Konfigürasyonu container image’ine gömmek.

COPY appsettings.Production.json /app/appsettings.json
# Konfigürasyon değişikliği için yeniden image build gerekir

İdeal Kullanım: ConfigMap ve Secret ile konfigürasyonu dışarıdan yönetin.

apiVersion: v1
kind: ConfigMap
metadata:
  name: myapp-config
data:
  appsettings.json: |
    {
      "Logging": { "LogLevel": { "Default": "Information" } },
      "AllowedHosts": "*"
    }

---
apiVersion: v1
kind: Secret
metadata:
  name: myapp-secrets
type: Opaque
stringData:
  ConnectionStrings__Default: "Server=db;Database=myapp;Password=secret"

---
spec:
  containers:
    - name: myapp
      envFrom:
        - secretRef:
            name: myapp-secrets
      volumeMounts:
        - name: config
          mountPath: /app/appsettings.Production.json
          subPath: appsettings.json
  volumes:
    - name: config
      configMap:
        name: myapp-config

4. Pod Disruption Budget Tanımlamamak

Yanlış Kullanım: Node bakımında tüm pod’ların aynı anda evict edilmesi.

# PDB yok
# kubectl drain node-1 çalıştırıldığında tüm pod'lar aynı anda silinebilir

İdeal Kullanım: PDB ile minimum availability garantisi verin.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: myapp

5. Namespace İzolasyonu Yapmamak

Yanlış Kullanım: Tüm servisleri default namespace’te çalıştırmak.

# Tüm servisler default namespace'te
# İzolasyon yok, resource quota yok, güvenlik kontrolü zor
kubectl get pods  # Yüzlerce pod karışık

İdeal Kullanım: Ortam ve takım bazlı namespace izolasyonu yapın.

apiVersion: v1
kind: Namespace
metadata:
  name: production

---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: production-quota
  namespace: production
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    pods: "50"

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress