Implantação do Kotlin no Kubernetes: guia básico
O desenvolvimento moderno é impensável sem conteinerização e orquestração. O Kubernetes (K8s) tornou-se o padrão para gerenciar microsserviços, e o Kotlin é uma das linguagens mais populares para criar aplicações backend confiáveis. Neste guia, percorreremos o caminho desde uma simples aplicação Kotlin até sua implantação completa em um cluster Kubernetes. Você aprenderá como empacotar o código em uma imagem Docker, escrever manifestos e configurar o acesso ao serviço.
1. Preparação da aplicação Kotlin
Como exemplo, usaremos uma API REST simples em Ktor — um framework leve para Kotlin. Vamos criar o arquivo Main.kt:
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.http.*import io.ktor.server.response.*
fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello from Kotlin on K8s!", ContentType.Text.Plain) } get("/health") { call.respondText("OK", ContentType.Text.Plain) } } }.start(wait = true)}Este código inicia um servidor na porta 8080 com dois endpoints: raiz e health check. Certifique-se de que as dependências do Ktor e Netty estejam incluídas no build.gradle.kts.
2. Construção da imagem Docker
Para implantar no Kubernetes, a aplicação deve ser empacotada em um contêiner. Vamos criar um Dockerfile na raiz do projeto:
FROM gradle:8.5-jdk21 AS buildWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon
FROM openjdk:21-jdk-slimWORKDIR /appCOPY --from=build /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]A construção é feita em duas etapas: primeiro a compilação com Gradle, depois a cópia do arquivo JAR para uma imagem limpa. Construa a imagem com o comando:
docker build -t my-kotlin-app:1.0 .Para publicar em um registry (por exemplo, Docker Hub), execute:
docker tag my-kotlin-app:1.0 yourusername/my-kotlin-app:1.0docker push yourusername/my-kotlin-app:1.03. Manifestos Kubernetes
Agora vamos criar os arquivos YAML para implantação no cluster. Começamos com deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: kotlin-appspec: replicas: 2 selector: matchLabels: app: kotlin-app template: metadata: labels: app: kotlin-app spec: containers: - name: kotlin-app image: yourusername/my-kotlin-app:1.0 ports: - containerPort: 8080 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 3 periodSeconds: 5Este manifesto cria duas réplicas da aplicação e adiciona verificações de liveness e readiness. Em seguida, service.yaml:
apiVersion: v1kind: Servicemetadata: name: kotlin-app-svcspec: selector: app: kotlin-app ports: - port: 80 targetPort: 8080 type: ClusterIPO serviço direciona o tráfego da porta 80 para a porta 8080 do contêiner. Se precisar de acesso externo, altere o tipo para NodePort ou LoadBalancer.
4. Configuração do Ingress e implantação
Para rotear requisições externas, usamos um Ingress controller. Crie o ingress.yaml:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: kotlin-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - host: kotlin.example.com http: