文章目录
- 前言
- 构建一个 hello world web 应用
- 项目结构
- 项目核心文件
- 启动项目 检查项目是否构建成功
- 容器化我们的应用
- 编写 Dockerfile
- 构建 docker 镜像
- 推送 docker 镜像仓库
- 使用 labs.play-with-k8s.com 构建 Kubernetes 集群并部署应用
- 构建 Kubernetes 集群环境
- 编写部署文件
- 总结
- 个人简介
前言
- 随着容器化技术的普及,部署 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)、日志与监控 等,构建更加复杂和健壮的分布式应用系统。
个人简介
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。
🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。
💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。
🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。
📖 保持关注我的博客,让我们共同追求技术卓越。