Деплой Java на Kubernetes: базовое руководство
Kubernetes (K8s) стал стандартом де-факто для оркестрации контейнеризированных приложений. Если вы Java-разработчик, умение развертывать свои приложения в Kubernetes — это не просто плюс, а необходимость в современной DevOps-культуре. В этом руководстве мы пройдем полный путь от создания простого Java-приложения до его деплоя в кластер Kubernetes. Вы узнаете, как упаковать приложение в Docker-образ, написать необходимые манифесты и запустить его в production-подобной среде.
1. Подготовка Java-приложения и Docker-образа
Прежде чем деплоить приложение в Kubernetes, его нужно контейнеризировать. Docker — это стандартный способ упаковки Java-приложений с их зависимостями. Рассмотрим простой REST-сервис на Spring Boot.
Создадим класс HelloController.java:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello from Java on Kubernetes!";
}
}
Теперь создадим Dockerfile для сборки образа. Используем multi-stage сборку, чтобы минимизировать размер финального образа:
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Соберите образ командой docker build -t my-java-app:latest . и запустите локально для проверки: docker run -p 8080:8080 my-java-app. Если всё работает, можно загрузить образ в реестр (например, Docker Hub):
docker tag my-java-app:latest yourusername/my-java-app:latest
docker push yourusername/my-java-app:latest
2. Основные манифесты Kubernetes
Для деплоя в Kubernetes потребуется как минимум два ресурса: Deployment (отвечает за управление подами) и Service (обеспечивает сетевой доступ).
Создайте файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app-deployment
labels:
app: java-app
spec:
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: 5
Теперь создайте service.yaml, чтобы сделать приложение доступным внутри кластера:
apiVersion: v1
kind: Service
metadata:
name: java-app-service
spec:
selector:
app: java-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
Если нужно открыть доступ извне (например, для тестирования), измените тип на LoadBalancer или используйте NodePort.
3. Развертывание в кластере
Убедитесь, что у вас есть доступ к кластеру Kubernetes (например, локальный Minikube или облачный сервис). Примените манифесты:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Проверьте статус подов:
kubectl get pods
Вы должны увидеть два работающих пода (так как мы указали replicas: 2). Если поды не запускаются, посмотрите логи:
kubectl logs <pod-name>
Чтобы протестировать приложение, выполните перенаправление портов:
kubectl port-forward service/java-app-service 8080:80
Откройте браузер по адресу http://localhost:8080 — вы должны увидеть приветственное сообщение.
4. Масштабирование и обновление
Одно из главных преимуществ Kubernetes — простое масштабирование. Увеличьте количество реплик до 5:
kubectl scale deployment java-app-deployment --replicas=5
Проверьте, что появилось 5 подов:
kubectl get pods
Для обновления приложения измените код, соберите новый Docker-образ с новым тегом (например, v2) и обновите манифест:
kubectl set image deployment/java-app-deployment java-app=yourusername/my-java-app:v2
Kubernetes выполнит rolling update — постепенно заменит старые поды на новые без простоя.
Заключение
В этом руководстве мы разобрали базовый процесс деплоя Java-приложения на Kubernetes. Вы научились:
- Контейнеризировать Java-приложение с помощью Docker
- Создавать манифесты Deployment и Service
- Развертывать и тестировать приложение в кластере
- Масштабировать и обновлять приложение без простоев
Это лишь начало. В реальных проектах вам понадобятся ConfigMaps, Secrets, Ingress-контроллеры и мониторинг. Но освоив базу, вы сможете легко двигаться дальше. Kubernetes — мощный инструмент, который делает Java-приложения более отказоустойчивыми и масштабируемыми. Удачи в деплое!