Деплой Java на Kubernetes: базовое руководство на практике

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему 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 и конфигураций. Это лишь первый шаг. В

Блоги

Рекомендаций по книгам