将 Kotlin 应用部署到 Kubernetes:分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

将 Kotlin 部署到 Kubernetes:实践基础指南

\n\n

现代开发越来越需要不仅编写高质量的代码,还要进行合理的部署。Kubernetes 已成为容器编排的事实标准。在本指南中,我们将介绍如何将 Kotlin 应用打包到 Docker 容器中,并将其部署到 Kubernetes 集群。您将获得现成的清单和 Kotlin 实践示例(使用 Ktor 框架)。

\n\n

1. 准备 Kotlin 应用

\n\n

为了演示,我们使用一个基于 Ktor 的简单 REST API。请确保您已配置好带有 application 插件的 Gradle(或 Maven)。

\n\n

build.gradle.kts 示例:

\n
plugins {\n    kotlin("jvm") version "1.9.22"\n    application\n    id("com.github.johnrengelman.shadow") version "8.1.1"\n}\n\napplication {\n    mainClass.set("com.example.ApplicationKt")\n}\n\ndependencies {\n    implementation("io.ktor:ktor-server-netty:2.3.7")\n    implementation("io.ktor:ktor-server-content-negotiation:2.3.7")\n    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}
\n\n

最简单的端点(src/main/kotlin/com/example/Application.kt):

\n
package com.example\n\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.serialization.kotlinx.json.*\nimport io.ktor.server.plugins.contentnegotiation.*\n\nfun main() {\n    embeddedServer(Netty, port = 8080) {\n        install(ContentNegotiation) {\n            json()\n        }\n        routing {\n            get("/") {\n                call.respond(mapOf("message" to "Hello from Kotlin on K8s!"))\n            }\n            get("/health") {\n                call.respond(mapOf("status" to "UP"))\n            }\n        }\n    }.start(wait = true)\n}
\n\n

使用以下命令构建 fat JAR:

\n
./gradlew shadowJar
\n\n

生成的 JAR 文件将出现在 build/libs/ 目录中。

\n\n

2. 创建 Docker 镜像

\n\n

在项目根目录创建 Dockerfile 文件:

\n
FROM openjdk:17-jdk-slim\n\nWORKDIR /app\n\nCOPY build/libs/*-all.jar app.jar\n\nEXPOSE 8080\n\nENTRYPOINT ["java", "-jar", "app.jar"]
\n\n

构建镜像并推送到仓库(例如 Docker Hub):

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

请务必将 yourusername 替换为您在 Docker Hub 上的用户名,或指定私有仓库的地址。

\n\n

3. Kubernetes 清单

\n\n

部署需要两个 YAML 文件:Deployment(管理 Pod)和 Service(开放访问)。

\n\n

3.1. Deployment(deployment.yaml)

\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kotlin-app\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: kotlin-app\n  template:\n    metadata:\n      labels:\n        app: kotlin-app\n    spec:\n      containers:\n      - name: kotlin-app\n        image: yourusername/kotlin-k8s-demo:v1\n        ports:\n        - containerPort: 8080\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n          initialDelaySeconds: 3\n          periodSeconds: 5
\n\n

3.2. Service(service.yaml)

\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: kotlin-app-service\nspec:\n  selector:\n    app: kotlin-app\n  ports:\n  - port: 80\n    targetPort: 8080\n  type: LoadBalancer
\n\n

应用清单:

\n
kubectl apply -f deployment.yaml\nkubectl apply -f service.yaml
\n\n

检查状态:

\n
kubectl get pods\nkubectl                

博客

书籍推荐