Giriş
Kubernetes dünyasına yeni adım atan bir birey olarak, tam yığın bir uygulamayı dağıtmak çok karmaşık görünebilir. Bu kapsamlı rehberde, bir Laravel + React uygulamasını (BookMyShow) Windows üzerinde Minikube kullanarak Kubernetes’te nasıl dağıtacağınızı gösteriyorum. Bu rehberin sonunda sadece nasıl dağıtacağınızı değil, her adımın neden önemli olduğunu da anlayacaksınız.
Kubernetes Nedir ve Neden Kullanılır?
Kubernetes (genellikle K8s olarak kısaltılır), açık kaynak bir konteyner orkestrasyon platformudur. Bunu, aşağıdaki görevleri otomatik olarak gerçekleştiren zeki bir yönetici olarak düşünün:
- Otomatik olarak konteynerleri dağıtır ve yönetir
- Uygulamaları talebe göre ölçeklendirir
- Hizmet keşfi ve yük dengeleme işlemlerini yönetir
- Başarısız konteynerleri yeniden başlatarak kendini onarır
Minikube, makinenizde yerel bir Kubernetes kümesi oluşturan hafif bir Kubernetes uygulamasıdır; bu, öğrenim ve geliştirme için mükemmeldir.
Ön Gereksinimler
Başlamadan önce, Windows bilgisayarınızda aşağıdakilerin kurulu olduğundan emin olun:
- Docker Desktop – Konteynerleştirme becerileri sağlar
- Minikube – Yerel Kubernetes kümesi
- kubectl – Kubernetes ile etkileşimde bulunan komut satırı aracı
Kurulumları Doğrulama
PowerShell’i açın ve aşağıdaki komutlarla kurulumları doğrulayın:
# Docker'ı kontrol et
docker --version
# Minikube'u kontrol et
minikube version
# kubectl'i kontrol et
kubectl version --client
Mimariyi Anlamak
Uygulamamız birden fazla bileşenden oluşmaktadır:
Temel Kubernetes Kavramları Açıklaması
- Pods
A Pod, Kubernetes’teki en küçük dağıtılabilir birimdir. Bir veya daha fazla konteyneri sarar. Bizim durumumuzda, ayrı pod’larımız var:
# 1. Laravel uygulaması
# 2. MySQL veritabanı
# 3. Redis önbellek
# 4. phpMyAdmin Deployments
Deployments, pod’larınız için istenen durumu tanımlar. Belirtilen sayıda pod kopyasının çalışmasını sağlar ve güncellemeleri yönetir.Services
Service, pod’lara erişmek için sabit bir ağ ucu sağlar. Pod’lar yeniden başlatılsa ve yeni IP adresleri alsa bile, hizmet sabit kalır.Persistent Volumes
Persistent Volumes (PV), pod yaşam döngülerinden bağımsız olarak kalıcı depolama sağlar. Verilerin pod yeniden başlatmalarını aşması gereken veritabanları için gereklidir.Secrets
Secrets, şifreler ve API anahtarları gibi hassas bilgileri güvenli bir şekilde saklar.Init Containers
Init Containers, ana uygulama konteyneri başlamadan önce çalıştırılır. Bağımlılıkların yüklenmesi gibi kurulum görevleri için mükemmeldir.
Aşama Aşama Dağıtım Rehberi
Adım 1: Minikube’u Başlat
Öncelikle, Docker Desktop’ın çalıştığından emin olun ve ardından Minikube’u başlatın:
minikube start
Burada neler oluyor?
- Minikube, sanal bir makine oluşturur
- Kubernetes bileşenlerini yükler
- Tek düğümlü bir küme kurar
Adım 2: Docker Ortamını Yapılandırma
Minikube için Docker görüntüleri oluştururken, Docker Desktop’ın yerine Minikube’un Docker daemon’unu kullanmamız gerekiyor:
minikube -p minikube docker-env --shell powershell | Invoke-Expression
Bunun önemi nedir? Yerel Docker kullanarak bir görüntü oluşturduğunuzda, Minikube bunu göremez çünkü kendi sanal makinesinde çalışır. Bu komut, terminalinizi Minikube’un Docker daemon’unu kullanacak şekilde yapılandırır, böylece oluşturduğunuz görüntüler Minikube’a doğrudan erişilebilir.
Adım 3: Uygulama Görüntünüzü Oluşturun
docker build -t sail-8.5/app:latest .
Dockerfile’ınızı anlamak: Dockerfile’ınız genellikle:
- Gerekli uzantılara sahip bir PHP imajından başlar
- Composer bağımlılıklarını yükler
- Uygulama kodunu kopyalar
- İzinleri ayarlar
- Web sunucusunu yapılandırır
Adım 4: Doğru Sırayla Dağıtım Yapın
Kubernetes kaynakları belirli bir sırada dağıtılmalıdır:
# 1. Önce Secrets (diğer hizmetler için gereklidir)
kubectl apply -f k8s\secrets.yaml
# 2. Depolama alanları
kubectl apply -f k8s\persistent-volumes.yaml
# 3. Veritabanı ve destekleyici hizmetler
kubectl apply -f k8s\mysql-deployment.yaml
kubectl apply -f k8s\redis-deployment.yaml
kubectl apply -f k8s\phpmyadmin-deployment.yaml
# 4. Veritabanının hazır olmasını bekleyin
kubectl wait --for=condition=ready pod -l tier=database --timeout=120s
# 5. Nihayet uygulamayı dağıtın
kubectl apply -f k8s\deployment.yaml
kubectl apply -f k8s\service.yaml
# 6. Uygulamanın hazır olmasını bekleyin
kubectl wait --for=condition=ready pod -l tier=frontend --timeout=120s
Bu sıranın önemi nedir?
Secrets, hizmetlerin bunları referans almadan önce mevcut olmalıdır.
Veritabanları, uygulamalar bağlantı kurmaya çalışmadan önce hazır olmalıdır.
kubectl wait komutu, her katmanın tamamen işletime hazır olmasını sağlar.
Adım 5: Veritabanını Başlatın
Pod’lar çalıştıktan sonra, veritabanınızı başlatın:
# Pod adını dinamik olarak alın
$podName = kubectl get pods -l tier=frontend -o jsonpath="{.items[0].metadata.name}"
# Migrations'ı çalıştırın
kubectl exec -it $podName -- php artisan migrate
# Örnek verilerle veritabanını doldurun
kubectl exec -it $podName -- php artisan db:seed
kubectl exec’in anlamı: Bu komut, çalışan bir konteynerin içinde bir komut çalıştırır; bu, bir sunucuya SSH ile bağlanmaya benzer. -it bayrakları, şunu ifade eder:
-i: stdin’i açık tutar (etkileşimli)
-t: bir sanal TTY (terminal) ayarlar
Adım 6: Geliştirme Sunucusunu Başlatın
Laravel + React uygulamaları için Vite kullanıyorsanız, Vite geliştirme sunucusunu başlatmalısınız:
kubectl exec -it $podName -- npm run dev -- --host 0.0.0.0
Neden –host 0.0.0.0? Varsayılan olarak, Vite localhost’a bağlanır, bu yalnızca konteynerin içinden erişilebilir. 0.0.0.0 kullanmak, dışarıdan erişilebilir olmasını sağlar.
Adım 7: CORS’u Port Yönlendirmesi ile Yönetme
Modern web geliştirme sık sık CORS (Cross-Origin Resource Sharing) zorlukları ile karşılaşır. Çözüm budur:
Start-Job -Name "port-5173" -ScriptBlock {
kubectl port-forward $using:podName 5173:5173
}
Port yönlendirmesi nedir? Port-yönlendirme, yerel makineniz ile bir pod arasında bir tünel oluşturur. Tarayıcınız localhost:5173 adresine bir istek yaptığında, bu istek pod’un 5173 portuna yönlendirilir.
Adım 8: Uygulamanıza Erişim Sağlayın
# Uygulama URL'sini alın
minikube service bookmyshow-service --url
# phpMyAdmin URL'sini alın
minikube service phpmyadmin-service --url
Minikube Hizmetlerini Anlamak: Minikube, hizmetleri NodePort aracılığıyla dışa açar; bu, Minikube VM’sindeki bir portu hizmetinize eşler. –url bayrağı, erişilebilir URL’yi döndürür.
Kubernetes Yapılandırma Dosyalarını Anlamak
secrets.yaml – Hassas Verileri Güvenli Hale Getirmek
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: cGFzc3dvcmQ= # base64 kodlu
Temel Noktalar:
- Secrets base64 kodludur (şifrelenmiş değildir!)
- Üretimde, Sealed Secrets veya harici gizli yöneticiler gibi araçlar kullanın
- Gerçek gizli bilgileri versiyon kontrolüne asla eklemeyin
deployment.yaml – Uygulama Planı
Dağıtım dosyası şunları içerir:
Init Containers:
initContainers:
- name: init-permissions
# Dosya izinlerini ayarlar
- name: npm-install
# Node bağımlılıklarını yükler
Neden Init Containers? Ana konteyner başlamadan önce sıralı bir şekilde çalışırlar, şu görevler için mükemmeldir:
- İzinleri ayarlamak
- Bağımlılıkları yüklemek
- Veritabanı migrations’larını çalıştırmak
- Yapılandırmayı indirmek
Ana Konteyner:
containers:
- name: app
image: sail-8.5/app:latest
imagePullPolicy: Never # Yerel görüntüyü kullan
imagePullPolicy: Never, Kubernetes’e bir kayıt defterinden çekmemesini, bunun yerine oluşturduğunuz yerel görüntüyü kullanmasını söyler.
Volume Mounts:
volumeMounts:
- name: app-storage
mountPath: /var/www/html/storage
- name: node-modules
mountPath: /var/www/html/node_modules
Volume’lar, veri kaybını önler. Biz:
- Önemli veriler için PersistentVolumeClaim (depolama)
- Geçici veriler için emptyDir (önbellek, node_modules)
service.yaml – Ağ Erişimi
apiVersion: v1
kind: Service
metadata:
name: bookmyshow-service
spec:
type: NodePort
selector:
app: bookmyshow
ports:
- port: 80
targetPort: 80
nodePort: 30080
Hizmet Türleri:
- ClusterIP (varsayılan): Sadece küme içinde erişilebilir
- NodePort: Her düğümün IP’sinde sabit bir port üzerinden erişilebilir
- LoadBalancer: Bulut sağlayıcısı yük dengeleyici (Minikube’da mevcut değil)
Temel kubectl Komutları
Kaynakları Görüntüleme
# Tüm kaynakları görüntüle
kubectl get all
# Belirli kaynakları görüntüle
kubectl get pods
kubectl get deployments
kubectl get services
# Ayrıntılı bilgi
kubectl describe pod
kubectl get pods -o wide # IP adreslerini ve düğümleri gösterir
Log’lar ve Hata Ayıklama
# Log'ları görüntüle (son log'lar)
kubectl logs
# Log'ları akış modunda (follow mode)
kubectl logs -f
# Belirli bir label'a sahip tüm pod'ların log'ları
kubectl logs -l tier=frontend -f
# Önceki konteynerin log'larını görüntüle (çökmüşse)
kubectl logs --previous
Komutları Çalıştırma
# Komut çalıştır
kubectl exec -- ls -la
# Etkileşimli shell
kubectl exec -it -- bash
# Belirli bir konteynerda komut çalıştır (birden çok konteynerli pod'lar için)
kubectl exec -it -c -- bash
Kaynakları Yönetme
# Değişiklikleri uygula
kubectl apply -f
# Kaynakları sil
kubectl delete -f
kubectl delete pod
# Dağıtımı zorla yeniden başlat
kubectl rollout restart deployment
# Yeniden başlatma durumunu kontrol et
kubectl rollout status deployment
Geliştirme Ortamını Başlatma
Bilgisayarınızı kapattıktan veya yeniden başlattıktan sonra, hızlı başlangıç rutininiz:
# 1. Minikube'u başlat
minikube start
# 2. Pod'ların hazır olmasını bekleyin (Minikube duraklatıldığında sürdürülür)
kubectl wait --for=condition=ready pod -l tier=frontend --timeout=120s
# 3. Pod adını alın
$podName = kubectl get pods -l tier=frontend -o jsonpath="{.items[0].metadata.name}"
# 4. Vite dev sunucusunu arka planda başlat
Start-Job -Name "vite-dev" -ScriptBlock {
kubectl exec -it $using:podName -- npm run dev -- --host 0.0.0.0
}
# 5. CORS için port yönlendirin
Start-Job -Name "port-5173" -ScriptBlock {
kubectl port-forward $using:podName 5173:5173
}
# 6. Uygulama URL'lerini alın
minikube service bookmyshow-service --url
minikube service phpmyadmin-service --url
Yaygın Sorunlar ve Çözümleri
Sorun 1: Görüntü Çekme Hataları
Hata: ErrImagePull veya ImagePullBackOff
Çözüm:
# Minikube'un Docker'ını kullanarak yeniden oluştur
minikube -p minikube docker-env --shell powershell | Invoke-Expression
docker build -t sail-8.5/app:latest .
kubectl delete pod -l tier=frontend
Neden? Kubernetes, bir kayıt defterinden çekmeyi dener, ancak bu görüntü yalnızca Minikube’un yerelinde mevcuttur.
Sorun 2: CORS Hataları
Hata: CORS isteği başarılı olmadı
Çözüm:
# Vite dev sunucusunun portunu yönlendirin
Start-Job -ScriptBlock { kubectl port-forward $using:podName 5173:5173 }
Neden? Tarayıcınız, pod içindeki Vite dev sunucusuna doğrudan erişemez, port yönlendirmesi olmadan.
Sorun 3: Port Zaten Kullanımda
Hata: Port 5173 zaten kullanımda
Çözüm:
# Mevcut işlemi kapatın
kubectl exec -it $podName -- pkill -f "vite"
# Veya pod'u yeniden başlatın
kubectl delete pod -l tier=frontend
Sorun 4: Veritabanı Bağlantısı Başarısız
Çözüm:
# MySQL pod'unun çalıştığını kontrol edin
kubectl get pods -l tier=database
# MySQL log'larını kontrol edin
kubectl logs -l tier=database
# Servisin mevcut olup olmadığını doğrulayın
kubectl get service mysql-service
Hata Ayıklama İpuçları:
- Hizmetler DNS adlarını kullanır (örneğin, mysql-service)
- Çevresel değişkenlerin doğru olduğunu kontrol edin
- Secrets’in dağıtımlardan önce oluşturulduğundan emin olun
En İyi Uygulamalar
- Etiketleri Tutarlı Kullanın
Etiketler, kaynakları düzenlemek ve seçmekte yardımcı olur:
labels:
app: bookmyshow
tier: frontend
environment: development
- Kaynak Sınırlarını Ayarlayın
Kaynak tükenmesini önleyin:
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
- Sağlık Kontrolleri Kullanın
Yaşama ve hazır olma denetimleri ekleyin:
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 10
periodSeconds: 5
- Kaynaklarınızı Namespace ile Ayırın
Daha büyük projeler için, namespace’ler kullanın:
# Namespace oluştur
kubectl create namespace bookmyshow
# Namespace'e dağıtım yap
kubectl apply -f deployment.yaml -n bookmyshow
# Varsayılan namespace ayarla
kubectl config set-context --current --namespace=bookmyshow
- Konfigürasyon için ConfigMaps Kullanın
Yapılandırmayı koddan ayırın:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "local"
LOG_LEVEL: "debug"
İzleme ve Görünürlük
Kaynak Kullanımını Görüntüleme
# Pod kaynak kullanımı
kubectl top pods
# Düğüm kaynak kullanımı
kubectl top nodes
# Olaylar için detaylı bilgi
kubectl describe pod
Kubernetes Dashboard’a Erişim
# Dashboard'u başlat
minikube dashboard
Bu, tüm küme kaynaklarını görsel olarak gösteren bir web UI açar.
Temizlik
Kısmi Temizleme (Küme Koruma)
# Tüm uygulama kaynaklarını sil
kubectl delete -f k8s\service.yaml
kubectl delete -f k8s\deployment.yaml
kubectl delete -f k8s\phpmyadmin-deployment.yaml
kubectl delete -f k8s\redis-deployment.yaml
kubectl delete -f k8s\mysql-deployment.yaml
kubectl delete -f k8s\persistent-volumes.yaml
kubectl delete -f k8s\secrets.yaml
# Minikube'u durdur (küme durumunu korur)
minikube stop
Tam Temizlik
# Tüm kümeyi sil
minikube delete
# Bu, her şeyi kaldırır: tüm pod'lar, hizmetler, volume'ler
PowerShell Arka Plan İşlerini Anlamak
PowerShell işlerini, işlemlerin arka planda çalışmasına izin verir:
# Arka planda bir iş başlat
Start-Job -Name "my-job" -ScriptBlock {
# Uzun süren komut
}
# İşleri listele
Get-Job
# İş çıktılarını görüntüle
Receive-Job -Name "my-job"
# Durdur ve kaldır
Stop-Job -Name "my-job"
Remove-Job -Name "my-job"
Ne zaman işler kullanılmalı:
Port-yönlendirmesi (aktif kalması gerekir)
Geliştirme sunucularını çalıştırma
Terminalinizi bloke eden herhangi bir uzun süreli işlem
Gelecek İncelenecek Gelişmiş Konular
Helm Charts
Kubernetes için paket yöneticisi—K8s için npm gibi.Ingress Kontrolörleri
Gelişmiş yönlendirme ve yük dengeleme.StatefulSets
Veritabanları gibi belirli pod kimlik gereksinimleri olan durum bilgisi içeren uygulamalar için.Horizontal Pod Autoscaling
CPU/memory kullanımına dayalı olarak pod’ları otomatik olarak ölçeklendirir.CI/CD Entegrasyonu
GitHub Actions, Jenkins veya GitLab CI ile dağıtımı otomatikleştirin.
Sonuç
Tebrikler! Minikube kullanarak Kubernetes’te tam yığın bir Laravel + React uygulamasını başarıyla dağıttınız. Artık şunları anlıyorsunuz:
- Temel Kubernetes kavramları (Pods, Deployments, Services)
- Kubectl’yi etkili bir şekilde nasıl kullanacağınızı
- Yaygın sorunları nasıl çözeceğinizi
- Kubernetes ile günlük geliştirme iş akışını
- Konteyner orkestrasyonu için en iyi uygulamalar
Kubernetes’in zorlu bir öğrenme eğrisi vardır, ancak bu tür pratiklerle, hızla yetkin hale geleceksiniz. Burada öğrendiğiniz beceriler, sadece Minikube ile yerel geliştirme için değil, aynı zamanda Bulut’taki üretim Kubernetes kümeleri (AWS EKS, Google GKE, Azure AKS) için de geçerlidir.
Ek Kaynaklar
Bu rehber, BookMyShow uygulamasını Windows üzerinde Docker Desktop ve Minikube ile dağıtma üzerine kuruludur. Üretim dağıtımları için ek güvenlik önlemleri, izleme çözümleri ve bulut yerel hizmetleri düşünün.
Kaynak: Orijinal Makale



