Деплой Kotlin на Kubernetes: базовое руководство
Современная разработка немыслима без контейнеризации и оркестрации. Kubernetes (K8s) стал стандартом для управления микросервисами, а Kotlin — одним из самых популярных языков для создания надёжных бэкенд-приложений. В этом руководстве мы пройдём путь от простого Kotlin-приложения до его полноценного развёртывания в кластере Kubernetes. Вы узнаете, как упаковать код в Docker-образ, написать манифесты и настроить доступ к сервису.
1. Подготовка Kotlin-приложения
Для примера возьмём простое REST API на Ktor — лёгком фреймворке для Kotlin. Создадим файл Main.kt:
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.routing.*
import io.ktor.http.*
import io.ktor.server.response.*
fun main() {
embeddedServer(Netty, port = 8080) {
routing {
get("/") {
call.respondText("Hello from Kotlin on K8s!", ContentType.Text.Plain)
}
get("/health") {
call.respondText("OK", ContentType.Text.Plain)
}
}
}.start(wait = true)
}
Этот код запускает сервер на порту 8080 с двумя эндпоинтами: корневой и health check. Убедитесь, что в build.gradle.kts подключены зависимости Ktor и Netty.
2. Сборка Docker-образа
Для деплоя в Kubernetes приложение должно быть упаковано в контейнер. Создадим Dockerfile в корне проекта:
FROM gradle:8.5-jdk21 AS build
WORKDIR /app
COPY build.gradle.kts settings.gradle.kts ./
COPY src ./src
RUN gradle build --no-daemon
FROM openjdk:21-jdk-slim
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Сборка выполняется в два этапа: сначала компиляция с помощью Gradle, затем копирование JAR-файла в чистый образ. Соберите образ командой:
docker build -t my-kotlin-app:1.0 .
Для публикации в реестре (например, Docker Hub) выполните:
docker tag my-kotlin-app:1.0 yourusername/my-kotlin-app:1.0
docker push yourusername/my-kotlin-app:1.0
3. Манифесты Kubernetes
Теперь создадим YAML-файлы для развёртывания в кластере. Начнём с 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/my-kotlin-app:1.0
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
Этот манифест создаёт два реплики приложения, добавляет проверки живости и готовности. Далее service.yaml:
apiVersion: v1
kind: Service
metadata:
name: kotlin-app-svc
spec:
selector:
app: kotlin-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Сервис направляет трафик с порта 80 на порт 8080 контейнера. Если нужен внешний доступ, измените тип на NodePort или LoadBalancer.
4. Настройка Ingress и деплой
Для маршрутизации запросов извне используем Ingress-контроллер. Создайте ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kotlin-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: kotlin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kotlin-app-svc
port:
number: 80
Примените все манифесты по порядку:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
Проверьте статус подов:
kubectl get pods -l app=kotlin-app
Когда все поды перейдут в статус Running, выполните тестовый запрос:
curl http://localhost:80
# Ответ: Hello from Kotlin on K8s!
Если вы используете minikube, сначала включите Ingress:
minikube addons enable ingress
Заключение
Мы разобрали полный цикл деплоя Kotlin-приложения на Kubernetes: от написания кода на Ktor до развёртывания в кластере с помощью манифестов. Вы научились создавать Docker-образ, настраивать проверки здоровья, сервисы и Ingress. Этот подход масштабируется на любые микросервисы на Kotlin: Spring Boot, Ktor, Vert.x и другие.
Для production-среды добавьте ConfigMap для конфигураций, Secrets для паролей и HorizontalPodAutoscaler для автоматического масштабирования. Помните про мониторинг (kube-prometheus-stack) и логирование (Loki или ELK). Теперь вы готовы запускать свои Kotlin-сервисы в облаке!