Деплой 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-чартами для повторяемых релизов.