Implantação de Kotlin no Kubernetes: guia básico na prática
\n\nO desenvolvimento moderno cada vez mais exige não apenas escrever código de qualidade, mas também sua implantação adequada. O Kubernetes tornou-se o padrão de facto para orquestração de contêineres. Neste guia, vamos abordar como empacotar uma aplicação Kotlin em um contêiner Docker e implantá-la em um cluster Kubernetes. Você receberá manifestos prontos e exemplos práticos em Kotlin (usando o framework Ktor).
\n\n1. Preparação da aplicação Kotlin
\n\nPara demonstração, usaremos uma API REST simples em Ktor. Certifique-se de ter o Gradle (ou Maven) configurado com o plugin application.
Exemplo de build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.22"\n application\n id("com.github.johnrengelman.shadow") version "8.1.1"\n}\n\napplication {\n mainClass.set("com.example.ApplicationKt")\n}\n\ndependencies {\n implementation("io.ktor:ktor-server-netty:2.3.7")\n implementation("io.ktor:ktor-server-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\n\nO endpoint mais simples (src/main/kotlin/com/example/Application.kt):
package com.example\n\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.serialization.kotlinx.json.*\nimport io.ktor.server.plugins.contentnegotiation.*\n\nfun main() {\n embeddedServer(Netty, port = 8080) {\n install(ContentNegotiation) {\n json()\n }\n routing {\n get("/") {\n call.respond(mapOf("message" to "Hello from Kotlin on K8s!"))\n }\n get("/health") {\n call.respond(mapOf("status" to "UP"))\n }\n }\n }.start(wait = true)\n}\n\nCompile o fat JAR com o comando:
\n./gradlew shadowJar\n\nO JAR pronto aparecerá em build/libs/.
2. Criação da imagem Docker
\n\nCrie o arquivo Dockerfile na raiz do projeto:
FROM openjdk:17-jdk-slim\n\nWORKDIR /app\n\nCOPY build/libs/*-all.jar app.jar\n\nEXPOSE 8080\n\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nCompile a imagem e envie para o registro (por exemplo, Docker Hub):
\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\nCertifique-se de substituir yourusername pelo seu login no Docker Hub ou informe o endereço do registro privado.
3. Manifestos Kubernetes
\n\nPara a implantação, precisaremos de dois arquivos YAML: Deployment (gerencia os pods) e Service (abre o acesso).
\n\n3.1. Deployment (deployment.yaml)
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: kotlin-app\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: kotlin-app\n template:\n metadata:\n labels:\n app: kotlin-app\n spec:\n containers:\n - name: kotlin-app\n image: yourusername/kotlin-k8s-demo:v1\n ports:\n - containerPort: 8080\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 3\n periodSeconds: 5\n\n3.2. Service (service.yaml)
\napiVersion: v1\nkind: Service\nmetadata:\n name: kotlin-app-service\nspec:\n selector:\n app: kotlin-app\n ports:\n - port: 80\n targetPort: 8080\n type: LoadBalancer\n\nAplique os manifestos:
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVerifique o status:
\nkubectl get pods\nkubectl