在Kubernetes上部署Kotlin:基础指南
现代开发离不开容器化和编排。Kubernetes (K8s) 已成为管理微服务的标准,而Kotlin则是构建可靠后端应用最流行的语言之一。在本指南中,我们将从简单的Kotlin应用开始,逐步完成其在Kubernetes集群中的完整部署。您将学习如何将代码打包成Docker镜像、编写清单文件以及配置服务访问。
1. 准备Kotlin应用
以Ktor(一个轻量级Kotlin框架)上的简单REST API为例。创建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端口启动服务器,包含两个端点:根端点和健康检查端点。确保在build.gradle.kts中添加了Ktor和Netty依赖。
2. 构建Docker镜像
要在Kubernetes中部署,应用必须打包到容器中。在项目根目录创建Dockerfile:
FROM gradle:8.5-jdk21 AS buildWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon
FROM openjdk:21-jdk-slimWORKDIR /appCOPY --from=build /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["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.0docker push yourusername/my-kotlin-app:1.03. Kubernetes清单文件
现在创建用于集群部署的YAML文件。从deployment.yaml开始:
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/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: v1kind: Servicemetadata: name: kotlin-app-svcspec: selector: app: kotlin-app ports: - port: 80 targetPort: 8080 type: ClusterIP服务将80端口的流量转发到容器的8080端口。如果需要外部访问,请将类型改为NodePort或LoadBalancer。
4. 配置Ingress并部署
要路由外部请求,请使用Ingress控制器。创建ingress.yaml:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: kotlin-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - host: kotlin.example.com http: