从零开始把 SpringBoot 搬到 K8s 上运行,我用了这几步!

news2025/4/7 9:44:24

前言

 

大家好,我是网管。咱们的 K8s 入门和实践,在经历了三篇理论知识的后,相信各位都已经期待许久(可能的吧),就差私信我,你整着理论整半天有啥用,本大人写的程序怎么能放到 K8s 上运行。

别急,今天这篇文章就带你从写第一行代码开始,一步步教你把程序放到 K8s 跑起来。这次咱们先用 Spring Boot开发的程序做个例子,后面再写一篇怎么把 Spring Boot 应用放到 K8s 上运行。

本文的重点,不在于那种语言写的程序,而是先学会应用 上到 K8s 的步骤,所以编程部分的演示非常简单,恨不能写一行代码就带你进入后面的 K8s 部署环节,不过要部署咱们得先有个环境,这里不需要你有啥云服务器,电脑上安装就行了。

K8s 本机环境安装

在个人电脑上安装 K8s 可选的软件,主要有这么几种:

  • minikube。
  • Kind。
  • Docker 桌面应用自带的 K8s 集群。

其中 minikube、DockerDesktop 内嵌K8s 这两种,咱们之前都写文章介绍过,不过两年过去了,我不再推荐各位安装 minikube,原因很简单我的 2021款 "诶嘛姨麦克斯,迈步可”都扛不住他造。还是用后两者吧,如果图省事Docker桌面应用自带的 K8s 集群完全就够用,安装指南可以参考:

  • 试了试Docker桌面应用自带的K8s集群,一个字“简单”

SpringBoot 应用,在 K8s 上运行

怎么把一个 SpringBoot 开发的 Web 应用部署到 K8s 集群上运行,有哪几个步骤要完成的呢,这里我们先归纳一下,后面依次对每一步进行演示。

这里会把我们上面理论部分的知识点再串一遍,主要有这么几个步骤:

  • 完成应用代码的编写

  • 把程序打包成容器镜像

  • 使用上一步打包的镜像,创建应用的Pod

  • 用 Deployment 调度应用

  • 使用 Service 暴露应用

  • 通过 Ingress 代理应用

好了,这六步大家一定要记住,下面我们逐一展开,详细说说。

完成应用代码的编写

这一步咱们为了演示,就简单来搞一个 HelloWorld 级别的代码就行了,没必要搞太复杂,再复杂的项目后面几步的操作也是一样。

首先,咱们建一个 Maven 管理的项目,POM 文件里引入这几个依赖

POM里的依赖很简单,首先是 Spring Boot 程序都要先引入的spring-boot-starter-parent,其次我们演示的是 Web 应用,所以再项目以来里再引入 Spring MVC 的starter 即可。

至于应用的代码,也非常简单

可以看到,仅就 HelloWorld 级别的代码来说,并没有比咱们演示的 Go 程序代码多多少,主要原因是很多工作 SpringBoot 都已经帮我们做好了。

代码写好了,可下来我们把这个 SpringBoot 应用打成 Docker 镜像。

把程序打包成容器镜像

首先咱们准备一下打包镜像的 Dockerfile

FROM openjdk:8-jre
ADD target/*.jar /application.jar
ENTRYPOINT ["java", "-jar","/application.jar"]
复制代码

把这个放在项目的根目录里,具体 Dockerfile 里的命令咱们就不讲了,就三个命令,可以在网管叨bi叨公众号里回复docker,拿到一个 docker 命令的手册,里面常用 Docker 命令的解释都有。

下面把应用打包成镜像:

docker build -t registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-java:v0.1
复制代码

把镜像上传到远程仓库:

docker push registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-java:v0.1
复制代码

这次,咱们还是把镜像传到,某位老好人创建的镜像仓库里,大家练习的时候也可以往里传,不过首先要在阿里云申请个免费的镜像云账号,然后用docker login 命令配置一下你的客户端就行啦,阿里云的页面上都有指示,实在不行了也可以在公众号里问我。

创建应用的Deployment

还记得我在之前的文章 -- K8s 面向对象里说过

Deployment 是一个复合型的控制器,它包装了一个叫做 ReplicaSet -- 副本集的控制器。ReplicaSet 管理正在运行的Pod数量,Deployment 在其之上实现 Pod 滚动更新,对Pod的运行状况进行健康检查以及回滚更新的能力

所以,这里我们直接把步骤2、3合起来一起说。其实也没啥好说的,毕竟 Go 实践那篇文章里我们已经讲过一次了,直接上这次用的 YAML 配置

诶,我就是在这翻车的,一开始我完全拷贝的 Go 实践篇里的 Deployment 配置,部署后,服务不停的重启,排查了一下,是在不停的OOM。

因为咱们只给 Go 的那个应用容器分配了 50M 内存,这次用 SpringBoot 虽然也只是个 HelloWorld 程序,但是缺跑不起来,一请求容器就挂。这里就凸显出 Go 在云原生下的第一个好处啦:占内存小。

排查 K8s 问题的方法,可参考之前的文章:想在研发群里装?先学会这几个排查K8s问题的办法

上面我直接把容器可用的内存调成了 500M,不是说 Java 应用占的内存是Go应用的 10倍,是我懒得一点点去试,直接设置成了 500M,反正 100 M,试过是不行的,哭!

用 Service 暴露服务

创建好上面这几个对象后,我们的应用只能在 K8s 集群的内部使用,想能从外部访问就得把应用暴露出来,这个时候就需要 Service 这个对象了。 Service 对象具体的概念解释,咱们还是看上一篇文章,这里不再赘述了。

下面是一个默认的 Cluster IP 型的 Service,为啥只在集群内暴露呢?因为下面我们还会给 Service 加一层 Ingress,所以就不必再用 NodePort 型的 Service 单独在节点上开端口再向外暴露服务啦。

用 Ingress 代理Service

使用 Ingress 前咱们应该干什么呢?对,需要先安装 Ingress Controller ,这里我们使用开源的 Ingress-Nginx ,它本质上就是个 Nginx,也好理解,Ingress 时代理 Service 对象的,要想代理先得有个基础设施的支持,只不过 K8s 里任何东西都是面向对象方式管理的,所以就有了 Ingress Controller,它支持不同类型的 Ingress Controller,咱们用的这个是免费的。

安装参考下面这个链接,非常简单,上次发文章后,不安装就跑过来问我为啥运行不了的,自己去面壁会儿。

kubernetes.github.io/ingress-ngi…

接下来就是声明代理我们的 Web 应用的 Ingress 对象

通过 kubctl apply -f 命令把它提交给 K8s 集群,创建 Ingress 对象。

Ingress 对象创建好后,我们就能通过 java-app.example.com 访问咱们的服务啦,当然前提是在电脑上配置一下咱们的 hosts 文件,添加一下这个域名到127.0.0.1 的绑定。

看一下咱们的访问效果

常用命令

我一直在给你们讲 K8s 的各种资源对象怎么声明、怎么配合着是用,操作时执行的命令就提了一嘴,没有展开说。主要的原因还是它的命令非常简单,自始至终我就用了一个 kubectl apply 命令,下面我把 K8s 常用的命令组合放这里,供大家操作的时候参考。

  • kubectl apply -f xxx.yaml 让K8s 创建在集群里按配置文件创建/更新资源对象
  • kubectl get pod | deploy | svc | ingress 查看集群中的pod、Deployment、Service、Ingress 资源的状态
  • kubectl describe pod | deploy | svc | ingress {$objectName} 查看具体资源对象当前的详细信息
  • kubectl delete pod | deploy | svc | ingress {$objectName} 删除指定对象

总结

讲完这篇 SpringBoot 应用上 K8s 的过程,咱们快速入门和实践这个短系列就算完结了。

这里总结了一下 K8s 常用的入门知识以及相关的实践操作,只能算是一个非常初级的入门,还有其他很多非常高级的特性能让我们控制 K8s 对应用的各种调度动作。

本文使用的源码、YAML配置、和操作步骤都收录在Github 仓库K8s在线资料中,具体步骤都在这里:

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

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

相关文章

Istio初探

Istio初探 前置环境:docker 一、安装k8s: ● https://segmentfault.com/a/1190000042204035 1、 https://github.com/gotok8s/k8s-docker-desktop-for-mac.git 2、 https://github.com/kubernetes/dashboard 3、 获取token curl ‘http://127.0.0.1:80…

SpringBoot实战项目杂货铺主页统计图表(折线图、饼状图、条形图)

统计图表的制作我们用到了Echarts,不得不说Echarts真的是百度的超级良心产品了。打Call!!!👍👍👍 ✔小插曲: 这里博主顺带提一下,像处理访问量等等数据的时候,往往会涉及到一个并发问题。举个…

ADI Blackfin DSP处理器-BF533的开发详解27:扩展IO输出的详细讲解(含源代码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-BF53x 开发板上扩展接口的 PPORT3 中引出了 4 个扩展 IO 接口输出接口,这些连接到了 CPLD&#x…

【大数据入门核心技术-Hadoop】(八)Hadoop基本管理命令行

目录 一、 三种shell命令方式 二、常见Shell操作命令 三、dfs管理命令行 1、当前haoop环境变量 2、当前集群节点信息 3、运行HTTPFS服务器 4、高可用节点管理 5、单独启动某个节点服务 四、更多命令 一、 三种shell命令方式 HDFS有三种shell命令方式 hadoop fs&#…

flink部署-1.14

1. 版本说明 本文档内容基于 flink-1.14.x,其他版本的整理,请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架,支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

线程死锁、锁死、饥饿、活锁讲解

文章目录死锁哲学家就餐问题死锁的检测方式死锁的产生条件死锁的规避死锁的恢复锁死信号丢失锁死嵌套监视器锁死线程饥饿活锁死锁 概念 如果两个或者更多的线程因为相互等待对方而被永远暂停,线程的生命周期变成了BLOCKED或者WAITING,则我们称这些线程产…

计算机-校验码

码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,码距越大,越利于纠错…

基于C++实现(控制台)仓库管理系统【100010021】

1题目与要求 1.1问题描述 某电子公司仓库中有若干批次的同一种电脑,按价格、数量来存储。要求实现功能: 初始化 n 批不同价格电脑入库;出库:销售 m 台价格为 p 的电脑;入库:新到 m 台价格为 p 的电脑;盘…

Burp Suite Professional 22.11.4 Crack

Burp Suite Professional 是网络安全测试人员的首选工具包。使用它来自动执行重复的测试任务 - 然后使用其专家设计的手动和半自动安全测试工具进行更深入的挖掘。Burp Suite Professional 可以帮助您测试 OWASP Top 10 漏洞 Burp Suite 被描述为通过 Port Swigger 提供给用户…

Python学习基础笔记三十七——collections模块

1、collections模块: 内置数据类型:列表list、字典dict、集合set、元组tuple。 Collections模块提供了另外的数据类型: 队列deque、双端队列:可以快速地从另外一侧追加和推出元素; namedtuple: 生成可以…

游戏开发53课 阴影

4.8 阴影 阴影的实现方式有很多种,消耗和效果各异。 4.8.1 贴图阴影 贴图的方式最简单,做法是制作一张阴影纹理,放到物体脚下(下图),跟随物体一起运动。 贴图阴影渲染非常简单,只需要两个三角…

智能聊天机器人技术研究与应用

文章大纲 1. 聊天机器人简介聊天机器人进化历史聊天机器人核心技术2. 预训练模型与聊天机器人研究进展transfomer 架构回顾预训练对话模型3. 知识图谱与智能问答4. 智能聊天机器人应用实践5. 总结与展望正确使用chatGPT“高端的食材往往只需要最朴素的烹饪方式”参考文献与学习…

OpenFeign使用

OpenFeign使用 在微服务的架构中,传统的http客户端如Httpclient Okhttp HttpURLConnection RestTemplate WebClient 显然不适合。毕竟需要动态的获取服务地址,和进行负载均衡调用。 RPC框架 PC 全称是 Remote Procedure Call ,即远程过程调…

NTC-Templates解析与采集H3C(Comware Version 7)信息

本文仅供本人参考与学习NTC-Templates模板使用。 设备环境:HCL S6850 S5820V2-54QS-GE;Version 7.1.075, Alpha 7571 模板采用:hp_comware_display_xxxxxxxx.textfsm 在线模板测试:https://textfsm.nornir.tech/ hp_comware_d…

httpbin的使用

在学习过程中我们想知道我们发送处的http格式是什么样子的,是否符合我们的要求,寻找一个这样的工具,满足验证测试需要。 Httpbin服务可以满足查看我发出去的请求到底是什么样子的。你需要查看请求中的那部分信息,就调用什么样的接…

【Qt入门第37篇】 网络(七)TCP(一)

导语 TCP即TransmissionControl Protocol,传输控制协议。与UDP不同,它是面向连接和数据流的可靠传输协议。也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用TCP协议…

游戏开发45课 性能优化4

2.6 粒子 粒子特效也是性能的一个大杀手,主要体现在: 每帧计算量大。涉及发射器/效果器/曲线插值等,耗费CPU性能。频繁操作内存。粒子在生命周期里,实例持续不断地创建/删除,即便有缓存机制下,依然避免不…

算法day43|1049,494,474

1049. 最后一块石头的重量 II class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:summ sum(stones)target summ//2#dp下标和数组的定义,dp[j]代表的是最大价值dp [0]*15001#递归公式for i in range(len(stones)):for j in range(target,stones[i]-…

Zero-Shot Learning across Heterogeneous Overlapping Domains

极简论文阅读 摘要 a zero-shot learning approach:零样本学习方法。 natural language understanding domain:自然语言处理域。 a given utterance:给定的话语。 domains at runtime:运行时的域。 utterances and domains 给定话语和域。 …

Yolact

YOLACT 1.Abstract 原理: 生成一组 prototype masks (原型掩码) 个数(nm)可自定义,基于protonet的最后一组卷积核个数 通过一组 coefficients (掩码系数) 预测每个 instance mask (输出mask) 掩码系数由head层输出,shape为&…