🛠️ Gerçek Hayatta Kubernetes — Hands-On
Gerçek Hayatta Kubernetes — Hands-On: Bu bölüm seni gerçek bir senaryodan geçirir — bir Spring Boot REST API'sini sıfırdan Kubernetes'e deploy etmek — tıpkı bir uçuş simülatörünü
Bu bölüm seni gerçek bir senaryodan geçirir — bir Spring Boot REST API'sini sıfırdan Kubernetes'e deploy etmek — tıpkı bir uçuş simülatörünün bir pilotu kokpit hakkında bir slayt sunumu yerine gerçek bir kokpitten geçirmesi gibi. Her komutu adım adım takip et; sonunda çalışan, scale edilebilir, production-grade bir deployment'ın olacak, sadece teori değil. Peki YAML'ı okuyup anladığına güvenmek yerine neden elle komut çalıştırmakta ısrar ediyoruz? Çünkü Kubernetes hataları meşhur şekilde dolaylıdır — bir Service'in selector'ındaki bir yazım hatası "yanlış selector" diye bir hata fırlatmaz, sadece pod'larına sessizce sıfır trafik yönlendirir, ve bunu ancak gerçekten `kubectl get endpoints` çalıştırıp boş bir liste görerek fark edersin. Bu, Java'nın `equals`/`hashCode` sözleşmesi hakkında okumak ile `hashCode`'u override etmeyi unutarak bir `HashMap` lookup'ını gerçekten bozmak arasındaki farkla aynıdır — teori birebir aynıdır ama sessiz hata modunu ancak çalıştırmak ortaya çıkarır. Gerçek bir QA rolünde, bu tam debug yolu (deploy et → service'e erişilemiyor → endpoint'leri kontrol et → selector'ı kontrol et) ilk production incident'ında yapacağın şeydir, bu yüzden şimdi bunu bilinçli olarak pratik etmek tam olarak bu bölümün amacıdır.
Senaryo: Spring Boot Uygulamasını K8s'e Deploy Et
Adım 1-2: Spring Boot app ve Dockerfile
İki FROM Satırı: Multi-Stage Build Neden Daha Küçük İmaj Üretir?
builder JDK ile derler
İlk `FROM eclipse-temurin:17-jdk-alpine AS builder` aşaması, TAM JDK'nın gerektiği JAR derlemesini yapar.
Bağımlılıklar ÖNCE cache'lenir
`mvnw dependency:resolve`, `src` kopyalanmadan ÖNCE çalışır — pom.xml değişmediği sürece Docker bu katmanı YENİDEN indirmez.
-DskipTests TEKRARI önler
Testler image inşası sırasında TEKRAR çalıştırılmaz — CI bunları zaten önceki bir aşamada koşmuştur.
runtime sadece JAR'ı kopyalar
İkinci `FROM ... AS runtime` aşaması Maven'i HİÇ görmez — sadece bitmiş `app.jar`'ı ince bir JRE image'ine kopyalar.
ENTRYPOINT kubelet'in çalıştıracağı komuttur
`java -jar app.jar`, container START olduğunda kubelet'in container runtime'a çalıştırttığı GERÇEK komuttur.