Yükleniyor...

Kubernetes Mimari Tasarımı: Kurumsal Konteyner Orkestrasyonu

Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 9 dk

Bu kapsamlı rehberde, Kubernetes mimari tasarımı, Control Plane bileşenleri, Worker Node yapısı ve kurumsal deployment stratejileri teknik detaylarla incelen...

## Kubernetes Mimari Tasarımı ve Modern Backend Altyapıları **Kubernetes (K8s)**, konteynerize edilmiş uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini otomatize eden açık kaynaklı bir orkestrasyon platformudur. Modern backend mimarilerinde, mikroservislerin karmaşıklığını yönetmek ve yüksek erişilebilirlik sağlamak için standart haline gelmiştir. Bu rehberde, bir Kubernetes kümesinin anatomisini, bileşenler arası iletişimi ve kurumsal seviyede bir mimari kurulumun nasıl olması gerektiğini teknik detaylarıyla ele alacağız. ## Kubernetes Küme Anatomisi ve Temel Kavramlar Bir Kubernetes kümesi (cluster), iki ana bölümden oluşur: **Control Plane** (Kontrol Düzlemi) ve **Worker Nodes** (İşçi Düğümler). Control Plane, kümenin karar mekanizmasıyken, Worker Node'lar uygulamaların fiilen çalıştığı yerlerdir. ### Control Plane Bileşenleri - **kube-apiserver:** Kümenin giriş kapısıdır. Tüm REST komutları buradan geçer. - **etcd:** Kümenin tüm verilerinin tutulduğu, yüksek erişilebilir anahtar-değer deposudur. - **kube-scheduler:** Yeni oluşturulan Pod'ları izler ve onları uygun Node'lara yerleştirir. - **kube-controller-manager:** Kümedeki durum değişimlerini yönetir (örneğin, bir Node çöktüğünde yeni Pod başlatılması). ### Worker Node Bileşenleri - **kubelet:** Her Node'da çalışan ve konteynerlerin Pod içinde istenen durumda olduğundan emin olan ajandır. - **kube-proxy:** Ağ kurallarını yönetir ve servislerin iletişimini sağlar. - **Container Runtime:** Konteynerleri çalıştıran yazılımdır (Docker, containerd, CRI-O). ## Kurulum ve Altyapı Hazırlığı Kurumsal bir Kubernetes mimarisi için genellikle `kubeadm` ile manuel kurulum veya bulut sağlayıcıların (EKS, GKE, AKS) yönetilen servisleri tercih edilir. Aşağıda, temel bir küme konfigürasyonu için gerekli olan bir **Deployment** kaynağının yapısını görebilirsiniz. ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: backend-api labels: app: production spec: replicas: 3 selector: matchLabels: app: backend-api template: metadata: labels: app: backend-api spec: containers: - name: api-container image: my-registry/backend:v1.2.0 ports: - containerPort: 8080 ``` ## Detaylı Kullanım Örnekleri ve Mimari Bileşenler ### 1. Servis Yönetimi (Services) Pod'lar geçicidir; öldüklerinde IP adresleri değişir. **Service** objesi, Pod grubuna sabit bir IP ve DNS adı sağlar. ```yaml apiVersion: v1 kind: Service metadata: name: backend-service spec: selector: app: backend-api ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP ``` ### 2. Dış Dünyaya Erişim: Ingress Uygulamanızı dış dünyaya açmak için bir **Ingress Controller** ve Ingress kuralları tanımlamanız gerekir. ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: main-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: api.sirketiniz.com http: paths: - path: /v1 pathType: Prefix backend: service: name: backend-service port: number: 80 ``` ### 3. Yapılandırma Yönetimi: ConfigMap Uygulama ayarlarını koddan ayırmak için **ConfigMap** kullanılır. ```yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: DB_URL: "jdbc:postgresql://db-service:5432/mydb" DEBUG_LEVEL: "info" ``` ### 4. Hassas Veri Yönetimi: Secrets Şifreler ve API anahtarları gibi veriler **Secret** objelerinde base64 formatında saklanır. ```yaml apiVersion: v1 kind: Secret metadata: name: db-credentials type: Opaque data: password: dXNlci1zaWZyZXNpCg== # base64 encoded ``` ### 5. Kalıcı Veri: PersistentVolumeClaim (PVC) Konteynerler stateless (durumsuz) yapıdadır. Veriyi kalıcı hale getirmek için PVC kullanılır. ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` ### 6. Otomatik Ölçeklendirme: Horizontal Pod Autoscaler (HPA) CPU kullanımı arttığında Pod sayısını otomatik artırmak için HPA tanımlanır. ```yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: backend-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: backend-api minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 ``` ### 7. Kaynak Limitleri (Resource Quotas) Bir namespace'in tüketeceği toplam kaynağı sınırlandırmak kritiktir. ```yaml apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources spec: hard: requests.cpu: "4" requests.memory: 8Gi limits.cpu: "8" limits.memory: 16Gi ``` ### 8. Ağ Politikaları (Network Policies) Pod'lar arası trafiği kısıtlamak güvenlik için zorunludur. ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-allow-db spec: podSelector: matchLabels: app: database ingress: - from: - podSelector: matchLabels: app: backend-api ``` ### 9. Pod Bozulma Bütçesi (Pod Disruption Budget) Bakım sırasında minimum kaç Pod'un ayakta kalacağını belirler. ```yaml apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: backend-pdb spec: minAvailable: 2 selector: matchLabels: app: backend-api ``` ### 10. Node Affinity ve Taints Uygulamaların belirli özelliklere sahip Node'larda çalışmasını sağlar. ```yaml spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd ``` ## Kubernetes Mimarisinde Best Practices 1. **Resource Requests ve Limits Kullanın:** Pod'ların ne kadar kaynak tüketeceğini mutlaka belirtin. Aksi takdirde bir Pod tüm Node kaynağını tüketebilir. 2. **Liveness ve Readiness Probes:** Uygulamanın sağlıklı olup olmadığını anlamak için bu kontrolleri ekleyin. 3. **Immutable Tags:** `:latest` tag'ini kullanmayın. Versiyonlanmış tag'ler (örn: `:v1.2.3`) kullanın. 4. **RBAC (Role-Based Access Control):** Her kullanıcıya ve servise sadece ihtiyacı olan yetkiyi verin. 5. **Multi-AZ Deployment:** Yüksek erişilebilirlik için Node'larınızı farklı kullanılabilirlik bölgelerine dağıtın. ## Sık Yapılan Hatalar - **Root Kullanıcısı Kullanmak:** Konteynerleri root yetkisiyle çalıştırmak büyük bir güvenlik açığıdır. - **Stateless ve Stateful Ayrımı Yapmamak:** Veritabanı gibi stateful uygulamaları yönetirken StatefulSet yerine Deployment kullanmak veri kaybına yol açabilir. - **İzleme ve Loglama Eksikliği:** Prometheus ve Grafana gibi araçlar olmadan Kubernetes yönetmek, karanlıkta araba sürmeye benzer. ## Performans İpuçları - **Küçük İmajlar Kullanın:** Alpine tabanlı imajlar, deployment süresini ve ağ trafiğini azaltır. - **Service Mesh Değerlendirmesi:** Çok karmaşık mikroservis ağlarında Istio veya Linkerd gibi Service Mesh yapılarını kullanarak trafiği optimize edin. - **Pod Topology Spread Constraints:** Pod'ların Node'lar arasında dengeli dağılmasını sağlayarak yükü optimize edin. ## Sık Sorulan Sorular | Soru | Cevap | | :--- | :--- | | Pod nedir? | Kubernetes'teki en küçük, dağıtılabilir nesnedir; bir veya daha fazla konteyneri barındırır. | | ReplicaSet ve Deployment farkı nedir? | Deployment, ReplicaSet'leri yönetir ve rolling update gibi gelişmiş özellikler sunar. | | Helm nedir? | Kubernetes uygulamalarını paketlemek ve yönetmek için kullanılan bir paket yöneticisidir. | | Node nedir? | Kubernetes kümesindeki fiziksel veya sanal bir makinedir. | | Kube-proxy ne işe yarar? | Servis IP'lerine gelen trafiği doğru Pod'lara yönlendiren ağ kurallarını yönetir. | ## Özet ve Sonuç Kubernetes mimari tasarımı, kurumsal uygulamaların sürdürülebilirliği için kritik bir yatırımdır. Doğru yapılandırılmış bir Control Plane ve optimize edilmiş Worker Node'lar, sistemin hataya dayanıklı (fault-tolerant) ve ölçeklenebilir olmasını sağlar. Bu rehberdeki prensipleri uygulayarak, karmaşık backend sistemlerinizi modernize edebilir ve operasyonel yükünüzü minimize edebilirsiniz.