Implantação de Java no Kubernetes: guia básico
O Kubernetes (K8s) tornou-se o padrão de facto para orquestração de aplicações conteinerizadas. Se você é um desenvolvedor Java, saber como implantar suas aplicações no Kubernetes não é apenas um diferencial, mas uma necessidade na cultura DevOps moderna. Neste guia, percorreremos o caminho completo desde a criação de uma aplicação Java simples até sua implantação em um cluster Kubernetes. Você aprenderá como empacotar a aplicação em uma imagem Docker, escrever os manifestos necessários e executá-la em um ambiente semelhante ao de produção.
1. Preparação da aplicação Java e da imagem Docker
Antes de implantar a aplicação no Kubernetes, é necessário conteinerizá-la. Docker é a forma padrão de empacotar aplicações Java com suas dependências. Vamos considerar um serviço REST simples em Spring Boot.
Criaremos a classe HelloController.java:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class HelloController {
@GetMapping("/") public String hello() { return "Hello from Java on Kubernetes!"; }}Agora criaremos o Dockerfile para construir a imagem. Usaremos multi-stage build para minimizar o tamanho da imagem final:
FROM maven:3.8.5-openjdk-17 AS buildWORKDIR /appCOPY pom.xml .COPY src ./srcRUN mvn clean package -DskipTests
FROM openjdk:17-jdk-slimWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]Construa a imagem com o comando docker build -t my-java-app:latest . e execute localmente para verificar: docker run -p 8080:8080 my-java-app. Se tudo funcionar, você pode enviar a imagem para um registry (por exemplo, Docker Hub):
docker tag my-java-app:latest yourusername/my-java-app:latestdocker push yourusername/my-java-app:latest2. Manifestos principais do Kubernetes
Para implantar no Kubernetes, serão necessários pelo menos dois recursos: Deployment (responsável pelo gerenciamento dos pods) e Service (fornece acesso à rede).
Crie o arquivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app-deployment labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/my-java-app:latest ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 20 periodSeconds: 5Agora crie o service.yaml para tornar a aplicação acessível dentro do cluster:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPSe precisar abrir acesso externo (por exemplo, para testes), altere o tipo para LoadBalancer ou use NodePort.
3. Implantação no cluster
Certifique-se de ter acesso ao cluster Kubernetes (por exemplo, Minikube local ou serviço em nuvem). Aplique os manifestos:
kubectl apply -f deployment.yamlkubectl apply -f service.yaml