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

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

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

Начать курс

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

Kubernetes (K8s) стал стандартом для оркестрации контейнеризованных приложений. Если вы разрабатываете серверные приложения на Kotlin (с использованием Ktor, Spring Boot или http4k), рано или поздно встанет вопрос их развертывания в кластере. В этом руководстве мы пройдем путь от упаковки Kotlin-приложения в Docker-образ до его запуска в Kubernetes с использованием ConfigMap и Ingress. Все примеры — рабочие и готовы к адаптации.

1. Подготовка Kotlin-приложения и Docker-образа

Для примера возьмем простое приложение на Ktor (можно заменить на любой другой фреймворк). Наше приложение будет слушать порт 8080 и возвращать JSON с версией.

// src/main/kotlin/com/example/Application.kt
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.routing.*
import io.ktor.server.response.*

fun main() {
    embeddedServer(Netty, port = 8080) {
        routing {
            get("/") {
                call.respond(mapOf("app" to "kotlin-on-k8s", "version" to "1.0.0"))
            }
        }
    }.start(wait = true)
}

Соберем приложение в fat JAR с помощью Gradle (плагин shadow). После сборки создадим Dockerfile:

# Dockerfile
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/app-all.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

Собираем образ и пушим его в реестр (например, Docker Hub):

docker build -t youruser/kotlin-app:1.0.0 .
docker push youruser/kotlin-app:1.0.0

2. Создание манифестов Kubernetes

Теперь опишем ресурсы для развертывания. Создадим три файла: deployment.yaml, service.yaml и configmap.yaml.

2.1. ConfigMap для конфигурации

Вынесем настройки приложения (например, уровень логирования или строку подключения) в ConfigMap:

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "DEBUG"
  APP_MODE: "production"

2.2. Deployment

В манифесте Deployment укажем образ, порт, реплики и пробросим переменные из ConfigMap:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kotlin-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kotlin-app
  template:
    metadata:
      labels:
        app: kotlin-app
    spec:
      containers:
        - name: app
          image: youruser/kotlin-app:1.0.0
          ports:
            - containerPort: 8080
          envFrom:
            - configMapRef:
                name: app-config
          livenessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5

2.3. Service

Service будет балансировать трафик между подами:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: kotlin-app-service
spec:
  selector:
    app: kotlin-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

3. Деплой в кластер и настройка Ingress

Применим манифесты:

kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Проверим, что поды запущены:

kubectl get pods
kubectl logs <pod-name>

Теперь сделаем приложение доступным извне. Создадим Ingress (предполагается, что в кластере установлен Ingress Controller, например, NGINX):

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kotlin-app-ingress
spec:
  rules:
    - host: kotlin.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kotlin-app-service
                port:
                  number: 80

Примените:

kubectl apply -f ingress.yaml

После настройки DNS (или добавления записи в /etc/hosts) приложение будет доступно по адресу http://kotlin.example.com.

4. Масштабирование и обновление

Kubernetes позволяет легко масштабировать приложение. Увеличим количество реплик до 5:

kubectl scale deployment kotlin-app --replicas=5

Для обновления версии измените тег образа в deployment.yaml и примените манифест снова. K8s выполнит rolling update без простоев:

kubectl set image deployment/kotlin-app app=youruser/kotlin-app:1.0.1

Следите за статусом обновления:

kubectl rollout status deployment/kotlin-app

Заключение

Мы рассмотрели полный цикл деплоя Kotlin-приложения в Kubernetes: от сборки Docker-образа до настройки Ingress и масштабирования. Ключевые выводы:

  • Используйте Fat JAR или многомодульные сборки (GraalVM Native Image) для оптимизации размера образа.
  • Выносите конфигурацию в ConfigMap или Secrets — это упрощает управление окружениями.
  • Обязательно настраивайте liveness/readiness probes для корректного перезапуска подов.
  • Для production используйте Ingress Controller (NGINX, Traefik) и сертификаты Let's Encrypt.

Теперь вы можете уверенно разворачивать свои Kotlin-микросервисы в Kubernetes. Дальнейшие шаги: добавление мониторинга (Prometheus + Grafana), настройка CI/CD (GitLab CI, GitHub Actions) и работа с Helm-чартами для повторяемых релизов.

Блоги

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