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

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

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

Начать курс

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

Современная разработка всё чаще требует не только написания качественного кода, но и его грамотного развертывания. Kubernetes стал стандартом де-факто для оркестрации контейнеров. В этом руководстве мы разберём, как упаковать Kotlin-приложение в Docker-контейнер и развернуть его в кластере Kubernetes. Вы получите готовые манифесты и практические примеры на Kotlin (с использованием фреймворка Ktor).

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

Для демонстрации возьмём простое REST API на Ktor. Убедитесь, что у вас настроен Gradle (или Maven) с плагином application.

Пример build.gradle.kts:

plugins {
    kotlin("jvm") version "1.9.22"
    application
    id("com.github.johnrengelman.shadow") version "8.1.1"
}

application {
    mainClass.set("com.example.ApplicationKt")
}

dependencies {
    implementation("io.ktor:ktor-server-netty:2.3.7")
    implementation("io.ktor:ktor-server-content-negotiation:2.3.7")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
}

Самый простой эндпоинт (src/main/kotlin/com/example/Application.kt):

package com.example

import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.routing.*
import io.ktor.server.response.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.plugins.contentnegotiation.*

fun main() {
    embeddedServer(Netty, port = 8080) {
        install(ContentNegotiation) {
            json()
        }
        routing {
            get("/") {
                call.respond(mapOf("message" to "Hello from Kotlin on K8s!"))
            }
            get("/health") {
                call.respond(mapOf("status" to "UP"))
            }
        }
    }.start(wait = true)
}

Соберите fat JAR командой:

./gradlew shadowJar

Готовый JAR появится в build/libs/.

2. Создание Docker-образа

Создайте файл Dockerfile в корне проекта:

FROM openjdk:17-jdk-slim

WORKDIR /app

COPY build/libs/*-all.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

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

docker build -t yourusername/kotlin-k8s-demo:v1 .
docker push yourusername/kotlin-k8s-demo:v1

Обязательно замените yourusername на свой логин в Docker Hub или укажите адрес частного реестра.

3. Манифесты Kubernetes

Для деплоя нам понадобятся два YAML-файла: Deployment (управляет подами) и Service (открывает доступ).

3.1. Deployment (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: kotlin-app
        image: yourusername/kotlin-k8s-demo:v1
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 3
          periodSeconds: 5

3.2. Service (service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: kotlin-app-service
spec:
  selector:
    app: kotlin-app
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

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

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

Проверьте статус:

kubectl get pods
kubectl get svc

Если вы используете Minikube, внешний IP появится после команды minikube service kotlin-app-service.

4. Настройка Ingress (опционально)

Для продакшн-среды обычно используют Ingress вместо LoadBalancer. Пример ingress.yaml:

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

Не забудьте настроить DNS-запись для kotlin.example.com.

5. Полезные советы для продакшена

  • Ресурсы: всегда указывайте requests и limits для CPU и памяти в Deployment.
  • ConfigMap и Secrets: выносите конфигурацию (URL БД, API-ключи) в отдельные ресурсы.
  • Логирование: используйте структурированное логирование (например, Logback + JSON-формат) для интеграции с ELK или Grafana Loki.
  • Health checks: обязательно настраивайте livenessProbe и readinessProbe — это критично для автоматического восстановления.
  • Горизонтальное масштабирование: добавьте HPA (HorizontalPodAutoscaler) на основе загрузки CPU.

Заключение

Мы прошли полный цикл: от написания простого Kotlin-приложения на Ktor до его развертывания в Kubernetes. Вы узнали, как создать Docker-образ, написать манифесты Deployment и Service, а также настроить базовые проверки здоровья. Этот workflow подходит как для pet-проектов, так и для production-микросервисов.

Kotlin отлично сочетается с Kubernetes благодаря JVM-экосистеме и лаконичности языка. Начните с этого шаблона, а затем добавляйте CI/CD, мониторинг и авторизацию. Успешного деплоя!

Блоги

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