将 Kotlin 部署到 Kubernetes:实践基础指南
\n\n现代开发越来越需要不仅编写高质量的代码,还要进行合理的部署。Kubernetes 已成为容器编排的事实标准。在本指南中,我们将介绍如何将 Kotlin 应用打包到 Docker 容器中,并将其部署到 Kubernetes 集群。您将获得现成的清单和 Kotlin 实践示例(使用 Ktor 框架)。
\n\n1. 准备 Kotlin 应用
\n\n为了演示,我们使用一个基于 Ktor 的简单 REST API。请确保您已配置好带有 application 插件的 Gradle(或 Maven)。
build.gradle.kts 示例:
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):
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/ 目录中。
2. 创建 Docker 镜像
\n\n在项目根目录创建 Dockerfile 文件:
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):
\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\n请务必将 yourusername 替换为您在 Docker Hub 上的用户名,或指定私有仓库的地址。
3. Kubernetes 清单
\n\n部署需要两个 YAML 文件:Deployment(管理 Pod)和 Service(开放访问)。
\n\n3.1. Deployment(deployment.yaml)
\napiVersion: 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\n3.2. Service(service.yaml)
\napiVersion: 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应用清单:
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\n检查状态:
\nkubectl get pods\nkubectl