前言
随着容器化技术的普及,部署 Web 应用到 Kubernetes(K8s)已经成为现代开发中常见的实践。本教程将从零开始,引导您构建并部署一个简单的 Java Spring Boot Web 应用到 Kubernetes 集群,覆盖从代码开发到容器化再到集群部署的完整流程。
本文一共包含三个部分:使用 Java Spring Boot 构建一个简单的 Hello World Web 应用、编写 Dockerfile 构建镜像将应用容器化、使用 labs.play-with-k8s.com 快速体验 Kubernetes 的部署与运行。
构建一个 hello world web 应用
我们可以使用
Spring Initializr
快速生成一个 Spring Boot 项目,也可以使用 ide 脚手架工具帮助我们快速构建一个简单的 Hello World Web 应用,此部分内容比较简单大家可以选择合适的方式构建。
项目结构
项目核心文件
HelloWorldController.java package org.demo.springwebwithk8s.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @RestController public class HelloController { @GetMapping("/") public String sayHello() { return "Hello world!"; } } } application.properties spring.application.name=spring-web-with-k8s server.port=8080
启动项目 检查项目是否构建成功
启动项目,使用 curl 命令访问 http://localhost:8080,检查是否正常输出 "Hello world!"
正常输出 "Hello world!" ,项目构建成功。
容器化我们的应用
容器化是将应用打包为一个可以在任何地方运行的轻量级环境。下面我们将我们构建的 hello world 应用打包成 Docker 镜像。
编写 Dockerfile
# 使用的基础镜像 FROM openjdk:17-jdk-alpine # 定义环境变量 注意地址是否和本地 jar 包地址是否一致 ARG JAR_FILE=target/spring-web-with-k8s-0.0.1-SNAPSHOT.jar # 将应用的 jar 文件复制到容器中 COPY ${JAR_FILE} app.jar # 暴露端口 EXPOSE 8080 # 定义运行命令 ENTRYPOINT ["java", "-jar", "/app.jar"]
构建 docker 镜像
docker build -t hello-world-app:1.0 . docker build: 命令用于根据 Dockerfile 构建 Docker 镜像。 -t: 表示为构建的镜像指定一个标签(tag)。 hello-world-app:1.0: hello-world-app: 镜像名称,用于标识你的应用镜像。 1.0: 镜像的版本号,可以帮助区分同一应用的不同版本。 .: 指定 Dockerfile 所在的路径。在当前目录(.)中寻找 Dockerfile。
检测镜像是否正常构建
docker run -d -p 8080:8080 --name hello-world-app hello-world-app:1.0 docker run: 命令用于运行一个容器。 -d: 后台运行容器(Detached 模式)。 --name hello-world-app: 为容器指定一个名字 hello-world-app,方便后续管理(例如查看状态、停止容器等)。 -p 8080:8080: 端口映射,将宿主机的 8080 端口映射到容器的 8080 端口。 hello-world-app:1.0: 指定运行的镜像名称和版本号,表示基于这个镜像创建并运行容器。
推送 docker 镜像仓库
本文以
hub.docker.com
为例
# Docker Hub 要求推送的镜像以 username/repository:tag 格式命名。为本地镜像打上 Docker Hub 所需的标签 docker tag hello-world-app:1.0 your-dockerhub-username/hello-world-app:1.0 docker push your-dockerhub-username/hello-world-app:1.0
使用 labs.play-with-k8s.com 构建 Kubernetes 集群并部署应用
最后,我们使用 labs.play-with-k8s.com 快速部署我们的应用到 Kubernetes 集群中。
构建 Kubernetes 集群环境
首先创建三台服务器实例,构建 Kubernetes 集群
初始化 master 节点并初始化网络
kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16 kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
将另外两台服务器实例添加入集群
kubeadm join 192.168.0.6:6443 --token y18e92.u3f9xgtio2vifvkb \ --discovery-token-ca-cert-hash sha256:85d66d0f4ae5122084bf0149029b9a9e374007cf6ae91913cab9cdf6b6f66789
集群搭建结果查看
编写部署文件
在 Kubernetes 中,部署文件(YAML 文件)是 Kubernetes 对象的声明式配置。等价于使用 kubectl 命令行工具逐步手动创建、管理和配置这些对象的命令。通过部署文件,你可以用一种声明式的方式告诉 Kubernetes 需要什么样的资源,而 Kubernetes 会自动实现和维持这些需求。
hello-world-service.yaml
apiVersion: v1 kind: Service metadata: name: hello-world-service spec: selector: app: hello-world ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: hello-world spec: replicas: 2 selector: matchLabels: app: hello-world template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: your-dockerhub-username/hello-world-app:1.0 ports: - containerPort: 8080
部署
kubectl apply -f hello-world-deployment.yaml
访问是否部署成功
总结
本文我们从零开始构建并部署了一个 Java Spring Boot Web 应用到 Kubernetes 集群,完整经历了以下步骤:
应用开发:我们使用 Spring Boot 构建了一个简单的 "Hello World" 应用,奠定了部署的基础。 应用容器化:通过编写 Dockerfile,将 Spring Boot 应用打包成 Docker 镜像,为跨平台部署和环境一致性提供支持。 Kubernetes 部署:利用 labs.play-with-k8s.com,快速构建 Kubernetes 集群,成功部署和运行了容器化的 Web 应用。
本文只是一篇 Kubernetes 最基础的入门介绍教程,随着实际项目需求的扩展,我们可以进一步学习 Kubernetes 的更多功能,例如 水平扩展(Scaling)、配置管理(ConfigMaps 和 Secrets)、日志与监控 等,构建更加复杂和健壮的分布式应用系统。