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

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

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

Начать курс

Деплой 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-сервисы в облаке!

Блоги

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