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

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

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

Начать курс

Деплой 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-приложения более отказоустойчивыми и масштабируемыми. Удачи в деплое!

Блоги

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