Implantação de aplicações Java no Kubernetes: do Dockerfile ao serviço em funcionamento
\n\nO desenvolvimento Java moderno é impensável sem conteinerização e orquestração. Kubernetes (K8s) tornou-se o padrão para gerenciamento de microsserviços, e saber implantar aplicações Java em um cluster é uma habilidade obrigatória para desenvolvedores backend. Neste artigo, vamos analisar na prática o ciclo completo de implantação: desde a construção da imagem Docker com a aplicação Java até a configuração do balanceamento de carga via Ingress.
\n\n1. Preparação da aplicação Java e Dockerfile
\n\nAntes de chegar ao Kubernetes, sua aplicação Java deve ser empacotada em uma imagem Docker. Vamos considerar o caso clássico — uma aplicação Spring Boot, compilada em um arquivo JAR.
\n\nCompilação do projeto
\nSuponha que temos um projeto que é compilado via Maven. Execute o comando na raiz do projeto:
\nmvn clean package -DskipTests\nComo resultado, na pasta target/ aparecerá o arquivo my-app-1.0.0.jar.
Criação do Dockerfile
\nPara minimizar o tamanho da imagem e aumentar a segurança, usamos compilação multi-estágio (multi-stage build).
\n# Stage 1: compilação\nFROM maven:3.8.6-openjdk-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests\n\n# Stage 2: imagem final\nFROM openjdk:17-jdk-slim\nWORKDIR /app\nCOPY --from=builder /app/target/my-app-1.0.0.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nCompilação e publicação da imagem
\ndocker build -t my-java-app:1.0.0 .\ndocker tag my-java-app:1.0.0 your-dockerhub/my-java-app:1.0.0\ndocker push your-dockerhub/my-java-app:1.0.0\n\n2. Criação de manifestos Kubernetes
\n\nKubernetes usa uma abordagem declarativa. Vamos descrever o estado desejado do sistema em arquivos YAML.
\n\nDeployment — gerenciamento de pods
\nCrie o arquivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: java-app-deployment\n labels:\n app: java-app\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: java-app\n template:\n metadata:\n labels:\n app: java-app\n spec:\n containers:\n - name: java-app\n image: your-dockerhub/my-java-app:1.0.0\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "256Mi"\n cpu: "250m"\n limits:\n memory: "512Mi"\n cpu: "500m"\n livenessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 30\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 20\n periodSeconds: 5\n\nService — garantindo acesso
\nCrie o arquivo service.yaml:
apiVersion: v1\nkind: Service\nmetadata:\n name: java-app-service\nspec:\n selector:\n app: java-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nConfigMap — externalizando configuração
\nPara armazenar variáveis de ambiente, crie configmap.yaml:
apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: app-config\ndata:\n SPRING_PROFILES_ACTIVE: "prod"\n DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"\n\n3. Implantação no cluster e verificação
\n\nAgora vamos aplicar todos os manifestos ao cluster. Certifique-se de que o kubectl está configurado e você está conectado ao contexto correto.
Aplicação dos manifestos
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVerificação do estado
\nkubectl get pods\nkubectl get deployments\nkubectl get services\nVocê deve