将 Kotlin 部署到 Kubernetes:初学者基础指南

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

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

开始课程

将 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:                

博客

书籍推荐