从 0 到 1 掌握部署第一个 Web 应用到 Kubernetes 中

文章目录

  • 前言
  • 构建一个 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 {@RestControllerpublic 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.0docker 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.0docker 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-worldports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:name: hello-world
spec:replicas: 2selector:matchLabels:app: hello-worldtemplate:metadata:labels:app: hello-worldspec:containers:- name: hello-worldimage: your-dockerhub-username/hello-world-app:1.0ports:- 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编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab以一个图像分类例子总结分类学习的使用方法

目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…

uniapp开发微信小程序笔记7-页面跳转、跳转传参、接收参数

前言&#xff1a; uni-app中提供了两种页面跳转方式&#xff1a; 组件跳转API跳转 一、组件跳转 <navigator url"/pages/mine/mine">跳转</navigator>二、API跳转 API方法备注uni.navigateTo() 1、不能跳转到tabBar页面 2、保留当前页面&#xff0c;…

2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)

一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页&#xff0c;此款单片机有两个串口。 串口1相关寄存器&#xff1a; SCON:串行控制寄存器&#xff08;可位寻址&#xff09; SCON寄存器说明&#xff1a; 需要PCON寄存器的SMOD0/PCON.6为0&#xff0c;使SM0和SM…

前端:base64的作用

背景 项目中发现&#xff0c;img标签中写src&#xff0c;读取一个png图片&#xff0c;只有16kb&#xff0c;速度特别慢。 解决办法&#xff0c;将图片转为base64&#xff0c;然后读取&#xff0c;速度特别快17ms就解决。 定义&#xff1a;base64是一种基于64个可打印字符(A-…

【Excel】拆分多个sheet,为单一表格

Private Sub 分拆工作表() Application.ScreenUpdating True 让屏幕显示操作过程&#xff0c; Dim sht As Worksheet Dim MyBook As Workbook Set MyBook ActiveWorkbook For Each sht In MyBook.Sheets If sht.Visible True Then 隐藏的sheet跳过&#xff0c;否则会报1004无…

.net 支持跨平台(桌面)系列技术汇总

1. 首先微软老大哥的.net core 。 .NET Core 是微软开发的一个跨平台、高性能的开源框架&#xff0c;用于构建云和互联网连接的新型应用。 它允许开发者在 Windows、macOS 和 Linux 上使用喜爱的开发工具进行开发&#xff0c;并支持部署到云或本地环境。 .NET Core 是对 .NET …

Reactor 模式的理论与实践

1. 引言 1.1 什么是 Reactor 模式&#xff1f; Reactor 模式是一种用于处理高性能 I/O 的设计模式&#xff0c;专注于通过非阻塞 I/O 和事件驱动机制实现高并发性能。它的核心思想是将 I/O 操作的事件分离出来&#xff0c;通过事件分发器&#xff08;Reactor&#xff09;将事…

【Android+多线程】IntentService 知识总结:应用场景 / 使用步骤 / 源码分析

定义 IntentService 是 Android中的一个封装类&#xff0c;继承自四大组件之一的Service 功能 处理异步请求 & 实现多线程 应用场景 线程任务 需 按顺序、在后台执行 最常见的场景&#xff1a;离线下载不符合多个数据同时请求的场景&#xff1a;所有的任务都在同一个T…

openssl创建自签名证书

原文地址&#xff1a;自签名证书 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 1 生成私钥 openssl genrsa -out server.key 2048 2 创建证书请求文件 openssl req -new -key server.key -out server.csr 3 用私钥和证书请求文件&#xf…

Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能

目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型&#xff1a;相关数据&#xff1a;要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码&#xff1a; 拦截器代码解释&#xff1a;详细解释&#xff1a;格式优化&#xff1a; Easy Excel…

python VS c++

一、语法特点 Python&#xff1a; 语法简洁、优雅&#xff0c;代码可读性极强&#xff0c;采用缩进来表示代码块&#xff0c;摒弃了像 C 那样使用大括号的传统方式&#xff0c;使得代码看上去十分清晰简洁。例如&#xff1a; ​ if 5 > 3:print("5大于3") elif 5 …

Spring Boot 的 WebClient 实践教程

什么是 WebClient&#xff1f; 在 Spring Boot 中&#xff0c;WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端&#xff0c;用于与 RESTful 服务或其他 HTTP 服务交互。相比于传统的 RestTemplate&#xff0c;WebClient 更加现代化&#xff0c;具有异步和…

QML学习 —— 29、3种不同使用动画的方式(附源码)

效果 说明 第一种:属性动画 - 当启动软件时候自动执行动画。      第二种:行为动画 - 当属性发生变化则自动执行动画。      第三种:目标动画 - 将动画变为对象,指定对象的目标进行执行动画。 代码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQu…

Zustand:一个轻量级的React状态管理库

文章目录 前言一、安装Zustand二、使用Zustand三、实际案例结语 前言 在现代Web开发中&#xff0c;状态管理是一个常见的需求&#xff0c;特别是在构建大型或复杂的单页面应用程序&#xff08;SPA&#xff09;时。React等框架虽然提供了基本的状态管理功能&#xff0c;但对于复…

Redis缓存穿透及常见的解决方案

一.什么是缓存穿透&#xff1f; 缓存穿透是指当客户端请求的数据在缓存&#xff08;如 Redis&#xff09;中不存在&#xff0c;并且在数据库中也不存在时&#xff0c;直接绕过缓存去请求数据库。这种情况会导致&#xff1a; 缓存系统无法发挥作用&#xff0c;数据每次都会直接…

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…

windows下安装wsl的ubuntu,同时配置深度学习环境

写在前面&#xff0c;本次文章只是个人学习记录&#xff0c;不具备教程的作用。个别信息是网上的&#xff0c;我会标注&#xff0c;个人是gpt生成的 安装wsl 直接看这个就行&#xff1b;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块&#xff0c;只需要在文件中通过require(http)引入即可。…

AI赋能电商:构建高效、智能化的新零售生态

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;其在电商领域的应用日益广泛&#xff0c;从购物推荐到供应链管理&#xff0c;再到商品定价&#xff0c;AI正在全面改变传统电商的运营模式&#xff0c;并推动行业向智能化和精细化方向发展。本文将探讨如何利…

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…