问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在K8S 中部署 Spring Boot 应用,爽!

发布网友 发布时间:2024-09-25 20:51

我来回答

1个回答

热心网友 时间:2024-10-06 08:31

前言

在Kubernetes中部署spring boot应用整体上来说是一件比较繁琐的事情,而Spring Boot Operator则能带给你更清爽简单的体验。

Spring Boot Operator基于Kubernetes的custom resource definitions (CRDs)扩展API进行的开发。

打包Docker镜像

在讲部署之前我们需要先将我们的SpringBoot应用打包成标准的DockerImage。

Spring Boot 基础就不介绍了,推荐下这个实战教程: https://www.javastack.cn/categories/Spring-Boot/

java项目打包镜像用maven/gradle插件比较多,我的另一篇文章构建SpringBoot的Docker镜像,这里在介绍一个新的google开源的插件Jib,该插件使用起来比较方便。

注意:jib打包的镜像会导致java应用的pid=1,在使用SpringBootOperator进行发布时候,Operator会设置kubernetes的ShareProcessNamespace参数为true(v1.10+版本都可使用)来解决该问题。

下面就来演示一下我们通过https://start.spring.io生成一个标准的SpringBoot项目operator-demo,然后使用jib插件进行镜像打包

scriptmvncom.google.cloud.tools:jib-maven-plugin:build\-Djib.to.auth.username=${{secrets.MY_USERNAME}}\-Djib.to.auth.password=${{secrets.MY_PASSWORD}}\-Djib.container.jvmFlags=--add-opens,java.base/sun.nio.ch=ALL-UNNAMED\-Djib.from.image=freemanliu/oprenjre:11.0.5\-Dimage=registry.cn-shanghai.aliyuncs.com/qingmuio/operator-demo/operator-demo:v1.0.0

执行上面的命令之后我们将得到一个标准的docker镜像,该镜像会被推送到远程仓库。

Operator快速体验

完成了镜像的构建之后,我们紧接着来安装我们的Operator到kubernetes集群,当然了首先你需要一套集群,可以参考我之前一篇文章部署高可用kubernetes,虽然版本比较老,但是新版本其实也差不多的一个思路。

快速安装

此处快速安装只是为了快速体验demo

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml

apply成功之后控制台输出

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated

稍等片刻查看是否已经安装成功

scriptkubectlgetpo-nspring-boot-operator-system

成功如下输出

NAMEREADYSTATUSRESTARTSAGEspring-boot-operator-controller-manager-7f498596bb-wcwtn2/2Running02m15s部署OperatorDemo应用

完成了Operator的部署之后,我们来部署我们第一个应用,这里我们就发布上面我们编写的springboot应用opreator-demo。 首先我们需要先编写一个Spring Boot Application 的CRD部署yaml,如下

#Demo.yamlapiVersion:springboot.qingmu.io/v1alpha1kind:SpringBootApplicationmetadata:name:operator-demospec:springBoot:version:v1.0.0#image:registry.cn-shanghai.aliyuncs.com/qingmuio/operator-demo/operator-demo:v1.0.0

细心的同学可能发现了,为啥连Image都没有?这怎么发布,就name,version,就能完成发布?是的没错!就能完成发布,后面我讲详细讲到他是如何完成的。 接着我们apply一下

scriptkubectlapply-fDemo.yaml

看到console输出

springbootapplication.springboot.qingmu.io/operator-democreated验证

表示创建成功了,接着我们来看下我们部署的第一个应用,这里我们直接用上面的yaml中的name过滤即可。 查看pod

script~#kubectlgetpo|grepoperator-demooperator-demo-7574f4789c-mg58m1/1Running076soperator-demo-7574f4789c-ssr8v1/1Running076soperator-demo-7574f4789c-sznww1/1Running076s

查看下我们的pid不等于1的设置是否生效,根据下面的结果可以看到通过设置ShareProcessNamespace该参数我们可以在Kubernetes层面来解决这个pid=1的问题。

scriptkubectlexec-itoperator-demo-7574f4789c-mg58mbashbash-5.0#ps-efUIDPIDPPIDCSTIMETTYTIMECMDroot10002:06?00:00:00/pauseroot602602:06?00:00:09java--add-opensjava.base/sun.nio.ch=ALL-UNNAMED-cp/app/resources:/app/classes:/app/libs/*io.qingmu.operator.operatordemo.Oper...root380002:07pts/000:00:00bashroot4438002:07pts/000:00:00ps-ef

查看svc

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml0

我们来访问一下试试。

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml1

我们来试着缩减他的副本数到1个 编辑我们的Demo.yaml,加入一个新的属性replicas

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml2

应用一下

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml3

再次查看pod,你会发现我们的pod已经缩放为一个副本了

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml4清理operator-demo

要删除该pod 我们只需要执行delete即可

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml5

再次查看pod,已经没了

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml6部署自己的应用

部署自己私有仓库的应用需要需要先创建secret(如果已经创建跳过即可) 创建docker-registry的secret

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml7

自己应用的crd Yaml

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml8一个完整的Spring Boot Application Yaml

下面是一个完整的yaml属性结构,大部分属性我们都可以用默认配置的即可。 不设置属性,默认使用Operator中设置的通用值详见后面的自定义安装Operator。

Spring Boot 基础就不介绍了,推荐下这个实战教程: https://www.javastack.cn/categories/Spring-Boot/

scriptkubectlapply-fhttps://raw.githubusercontent.com/goudai/spring-boot-operator/master/manifests/deployment.yaml9优雅停机的路径

由于优雅停机默认是关闭的并且并不支持Get请求所以我们需要开启和搭个桥 首先在application.yml中启用

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated0

然后桥接一个Get方法

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated1node亲和的使用

举一个列子 我们有一个springboot应用 user-service 希望他能分布到3个可用区的6个节点上: 首先我们把机器划分多个可用区

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated2

现在我们有三个可以区 每个区有2台workload,一共6台。然后我们需要给这些机器分别打上label。 将全部的i区机器标注为cn-i

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated3

同理将h区的标注为h,g区同理

namespace/spring-boot-operator-systemcreatedcustomresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.iocreatedrole.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolecreatedclusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-readercreatedrolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebindingcreatedclusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebindingcreatedservice/spring-boot-operator-controller-manager-metrics-servicecreateddeployment.apps/spring-boot-operator-controller-managercreated4
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑常用的系统是常见的电脑操作系统有哪些 电脑有哪些系统软件电脑都有哪些系统 csgo箱子开哪个性价比高-七种高性价比箱子详情介绍 word的空白页怎么删除不了word中空白页删不掉解决方法 word空白页怎么删除不了 删除不掉解决方法 word空白页怎么删除不了word中为什么空白页删不掉 word中删除空白页怎么删word空白页删除不掉咋办 表白两次她都说我们继续做朋友,我还有机会吗? 糖尿病人运动最佳方式 糖尿病的人要怎样运动 k8s的常见的三种部署方式 苹果笔记本a2298配置怎样的 苹果笔记本A2298配置是什么? 北京网通ADSL 2M家庭网关 WIFI设置好了 手机也能搜到 但是链接的时候... 内蒙联通赠送的上海贝尔GWH-11家庭网关的超级用户如何进入? ...贝尔epon上行家庭网关终端的超级帐号密码是什么型号是:RG200o-CA... 中国电信ADSL家庭网关设备怎样设置无线上网 专家咨询:中午和晚上不吃主食,只吃苹果会对胃健康又影响吗 中毒看什么科 中毒挂什么科 食物中毒看什么科 Kubernetes 命名空间入门 k8s的概念与架构介绍 k8s入门:基础概念与基本运维指令 【云原生】k8s集群命令行工具kubectl基础操作命令实践详解 初识Job和CronJob 你知道K8S暴露服务的方式有哪些吗? k8s之Job 与 CronJob 在家庭私有云上实现 K8S 部署 prometheus 和 grafana 并打通钉钉告警... 带你快速了解 K8S Job SpringBoot应用部署到K8S上,用着像Docker 成人鞋35码和童鞋35码一样大吗 Dsee Lab(3D全息投影软件)v2.5.1官方版 谁有可以将普通视频变为全息投影源的软件(安卓版、苹果版免费)谢谢... 谁有3D初音全息投影片源(DIY金字塔那种)要成品 谢谢·· 丁酉年癸卯月丁未日戊申时八字算命 重庆市区到承德最快的路线怎么走_348国道自驾游最佳路线 宜昌市到天门市走哪条国道? 如何修改TP-Link路由器的管理员和WiFi密码? tplink路由器怎么改wifi密码 tp link路由器怎样修改管理员密码? 股票抵押的比例是多少? 瑞虎5 1.5T发动机用什么机油好 请问大家,你们的车都能播放5.1声道的音乐吗? 谁知道"九宫八卦阵""八荒六合阵"中的九宫,八荒,六合指什么 ...1.5T发动机,之前一直用的是银美孚5w-30的机油,最近换成了银美孚... 瑞虎52016款瑞5 1.5T换什么机油好,一般是多少升呢。 我用易语言做了一款软件,自己没有加入任何病毒为什么提示有病毒?是不是... 易语言怎么样?希望能从性能实用,操作方面来说一下? 易语言变得程序有毒,听网上说好像要什么模块,还是加壳,具体怎么样让...