🛠️ 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.