将 Kotlin 部署到 Kubernetes:初学者基础指南
Kubernetes (K8s) 已成为现代开发中容器编排的事实标准。如果您使用 Kotlin 编写代码,无论是基于 Spring Boot 的后端、基于 Ktor 的微服务还是控制台应用程序,掌握将其部署到 Kubernetes 集群中的技能至关重要。在本指南中,我们将从简单的 Kotlin 应用程序开始,逐步实现在集群中运行 Pod。本材料面向初学者:不涉及 Service Mesh 或 Helm 等复杂主题——仅涵盖基础知识。
1. 准备 Kotlin 应用程序以进行容器化
在考虑 Kubernetes 之前,我们需要将应用程序打包成 Docker 镜像。让我们看一个基于 Ktor(一个非常适合微服务的轻量级框架)的简单 REST API 示例。
创建一个包含最小依赖项的 build.gradle.kts 文件:
plugins { kotlin("jvm") version "1.9.0" application}
application { mainClass.set("com.example.AppKt")}
dependencies { implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-content-negotiation:2.3.0") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")}编写一个响应 GET 请求的简单应用程序:
// src/main/kotlin/com/example/App.ktpackage com.example
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.http.*
fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello from Kotlin on Kubernetes!", ContentType.Text.Plain) } } }.start(wait = true)}应用程序监听 8080 端口。请记住这一点——我们将在 Dockerfile 和清单中使用此端口。
2. 创建 Docker 镜像
要构建镜像,我们需要一个 Dockerfile。最佳实践是使用多阶段构建,以使最终镜像尽可能小。
FROM gradle:7.6-jdk17 AS buildWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon
FROM openjdk:17-jre-slimWORKDIR /appCOPY --from=build /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]构建镜像并将其上传到仓库(例如 Docker Hub):
docker build -t yourusername/kotlin-k8s-demo:v1 .docker push yourusername/kotlin-k8s-demo:v1如果您无法访问仓库,可以使用 minikube 并通过命令 minikube image load 在本地加载镜像。
3. 基本 Kubernetes 清单
现在进入最有趣的部分——编写 YAML 清单以在集群中部署应用程序。我们需要两个基本对象:Deployment(管理 Pod 副本)和 Service(提供对 Pod 的访问)。
3.1 Deployment
Deployment 描述了 Pod 的期望状态:使用哪个镜像、有多少副本、开放哪些端口。
apiVersion: apps/v1kind: Deploymentmetadata: name: kotlin-appspec: replicas: 2 selector: matchLabels: app: kotlin-app template: metadata: labels: app: kotlin-app spec: containers: - name: kotlin-app image: yourusername/kotlin-k8s-demo:v1 ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 10 periodSeconds: 5 readinessProbe: httpGet: