Введение: Почему Kubernetes для Java-разработчика?
Современная Java-разработка всё чаще выходит за рамки простого запуска JAR-файлов на сервере. Микросервисная архитектура, необходимость горизонтального масштабирования и отказоустойчивости приводят к использованию контейнеров и оркестраторов. Kubernetes (K8s) стал стандартом де-факто для управления контейнеризированными приложениями. В этом руководстве мы разберём, как выполнить деплой типичного Java-приложения (например, на Spring Boot) в кластер Kubernetes. Вы узнаете, как упаковать приложение в Docker-образ, создать необходимые манифесты и запустить его.
1. Подготовка Java-приложения и сборка Docker-образа
Прежде чем попасть в Kubernetes, Java-приложение должно быть упаковано в контейнер. Рассмотрим простой пример на Spring Boot.
1.1. Пример Java-приложения
Создадим минимальный REST-контроллер, который будет возвращать версию приложения:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@GetMapping("/")
public String home() {
return "Java App running on Kubernetes v1.0";
}
}
1.2. Создание Dockerfile
Для Java-приложений оптимально использовать многоэтапную сборку (multi-stage build), чтобы уменьшить размер финального образа:
FROM maven:3.8.6-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
1.3. Сборка и публикация образа
Соберите образ и отправьте его в реестр (например, Docker Hub):
docker build -t yourusername/java-k8s-demo:1.0 .
docker push yourusername/java-k8s-demo:1.0
2. Основные объекты Kubernetes для деплоя Java
Для развёртывания Java-приложения понадобятся как минимум два ресурса: Deployment (управляет репликами и обновлениями) и Service (обеспечивает сетевой доступ).
2.1. Манифест Deployment
Создайте файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
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/java-k8s-demo:1.0
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
Важно: Для Spring Boot используйте Actuator для health checks. Укажите requests и limits, чтобы Kubernetes правильно распределял ресурсы.
2.2. Манифест Service
Создайте 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
Если нужен внешний доступ (например, для разработки), измените тип на NodePort или LoadBalancer.
3. Конфигурация и переменные окружения
Java-приложения часто требуют внешних настроек: URL базы данных, ключи API и т.д. Для этого используйте ConfigMap и Secrets.
3.1. Создание ConfigMap
Пример конфигурации для Java-приложения:
apiVersion: v1
kind: ConfigMap
metadata:
name: java-app-config
data:
APP_ENV: "production"
DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"
3.2. Использование в Deployment
Добавьте ссылку на ConfigMap в спецификацию контейнера:
envFrom:
- configMapRef:
name: java-app-config
Теперь приложение сможет читать переменные окружения (например, через System.getenv("DB_URL")).
4. Деплой и проверка
Примените манифесты к кластеру:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
4.1. Мониторинг статуса
Проверьте, что поды запущены:
kubectl get pods
kubectl get deployments
kubectl get services
4.2. Тестирование приложения
Если вы используете Minikube или локальный кластер, выполните проброс порта:
kubectl port-forward service/java-app-service 8080:80
Откройте браузер и перейдите на http://localhost:8080 — вы должны увидеть ответ от Java-приложения.
4.3. Масштабирование
Увеличьте количество реплик на лету:
kubectl scale deployment java-app --replicas=5
Kubernetes автоматически создаст новые поды и распределит трафик через Service.
Заключение
Мы рассмотрели базовый процесс деплоя Java-приложения в Kubernetes: от создания Docker-образа до настройки health checks и конфигураций. Это лишь первый шаг. В