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

标签: 从零开始 springboot k8s | 发表时间:2022-07-11 14:25 | 作者:kevinyan
出处:https://juejin.cn/backend

前言

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

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

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

K8s 本机环境安装

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

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

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

SpringBoot 应用,在 K8s 上运行

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

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

  • 完成应用代码的编写

  • 把程序打包成容器镜像

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

  • 用 Deployment 调度应用

  • 使用 Service 暴露应用

  • 通过 Ingress 代理应用

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

完成应用代码的编写

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

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

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 配置

Deployment 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 单独在节点上开端口再向外暴露服务啦。

Service YAML

用 Ingress 代理Service

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

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

https://kubernetes.github.io/ingress-nginx/deploy/

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

 Ingress YAML

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

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

看一下咱们的访问效果

K8s 运行应用的效果

常用命令

我一直在给你们讲 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在线资料中,具体步骤都在这里:

给公众号-网管叨叨,发送 k8s 领取


我正在参与掘金技术社区创作者签约计划招募活动, 点击链接报名投稿

相关 [从零开始 springboot k8s] 推荐:

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

- - 掘金 后端
咱们的 K8s 入门和实践,在经历了三篇理论知识的后,相信各位都已经期待许久(可能的吧),就差私信我,你整着理论整半天有啥用,本大人写的程序怎么能放到 K8s 上运行. 别急,今天这篇文章就带你从写第一行代码开始,一步步教你把程序放到 K8s 跑起来. 这次咱们先用 Spring Boot开发的程序做个例子,后面再写一篇怎么把 Spring Boot 应用放到 K8s 上运行.

K8S部署SpringBoot应用_都超的博客-CSDN博客_k8s springboot

- -
K8S环境机器做部署用,推荐一主双从. Docker Harbor私有仓库,准备完成后在需要使用仓库的机器docker login. 开发机器需要Docker环境,build及push使用. 一、构建基本Springboot工程,本例所用版本及结构如下图. 创建测试代码,简单打印几行log. .

从零开始在ubuntu上安装和使用k8s集群及报错解决

- - 行业应用 - ITeye博客
这几天在学习K8S的安装和使用,在此记录一下. 两小时Kubernetes(K8S)从懵圈到熟练——大型分布式集群环境捷径部署搭建_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili. 镜像+讲义+安装包,链接:https://pan.baidu.com/s/1qO697oBuR7TwQ2J8boI3EA 提取码:4mvs.

SpringBoot-Metrics监控

- -
Metrics基本上是成熟公司里面必须做的一件事情,简单点来说就是对应用的监控,之前在一些技术不成熟的公司其实是不了解这种概念,因为业务跟技术是相关的. 当业务庞大起来,技术也会相对复杂起来,对这些复杂的系统进行监控就存在必要性了,特别是在soa化的系统中,完整一个软件的功能分布在各个系统中,针对这些功能进行监控就更必要了.

从零开始搭建SRE

- - DockOne.io
【编者的话】Google在10年前创造了SRE这个工种. SRE,Site Reliability Engineering的缩写. 其中site是指Website,可以翻译为网站可靠性工程. 几年前资深Google SRE Chris Jones等人联合撰写了《Google SRE: How Google runs production systems》,首次向外界解密了Google的生产环境以及整个SRE的方法论.

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

从零开始做工作室!

- l - 果壳网 guokr.com - 果壳网
DIYer:dwj300 制作时间:1周 制作难度:★★★★☆ GEEK指数:★★★★☆. 在“被没有足够工作空间”、“找不到工具和材料”、“花了太多时间找东西”弄到抓狂以后,我们决定清理地下杂物室,做个工作间. 在施工过程中我们学到了很多,希望这些经验会对想建设或者拓展工作空间的人们有帮助.

从零开始的Spring Session(二)

- - 程序猿DD | 博客
上一篇文章介绍了一些Session和Cookie的基础知识,这篇文章开始正式介绍Spring Session是如何对传统的Session进行改造的. 官网这么介绍Spring Session:. 其具体的特性非常之多,具体的内容可以从文档中了解到,笔者做一点自己的总结,Spring Session的特性包括但不限于以下:.

k8s水平扩容

- - Bboysoul's Blog
k8s 的好处就是可以弹性水平扩容和纵向扩容,平时纵向扩容用的不太多,所以今天说说水平扩容,在创建hpa之前你要确定集群中已经安装了metrics-server,我使用的是k3s,直接自带. 首先创建需要的容器,下面是dockerfile. 原理就是当你访问index.php的时候会进行一个循环计算来提高cpu的使用率.

# [k8s] HPA: Horizontal Pod Autoscaling

- - V2EX - 技术
HPA 是 K8S 的一大利器. 通过 HPA, 我们可以让服务的 pod 数量根据特定指标自动增加或减少, 使得在高峰期有足够的资源服务请求, 在低峰期又可以避免占用过多的资源. 同时, 在 SOA 架构下, 我们也习惯通过 HPA 来避免劳心劳力的为每个微服务计算所需的资源.. minReplicas: 允许的最小 pod 数量.