Деплой 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, мониторинг и авторизацию. Успешного деплоя!