摘要如果我们要将一个复杂的微服务项目部署到K8S上,首先要学会部署单个SpringBoot应用。今天我们就来说说如何将SpringBoot应用部署到K8S上,这和用DockerCompose部署非常相似。希望对您有所帮助!在将镜像推送到DockerHub之前,我们使用了自建的镜像仓库。这次我们换一种方式,将镜像上传到DockerHub。首先我们要注册一个DockerHub账号,DockerHub地址:https://hub.docker.com/部署应用使用之前的mall-tiny-fabric项目,首先修改pom.xml文件,主要是添加DockerHub认证信息并修改镜像前缀,具体内容如下;http://192.168.5.94:2375macrodockerxxxmacrodocker/${project.name}:${project.version}修改完成后,使用package命令先将镜像打包到Linux服务器,然后使用docker:push命令将镜像推送到DockerHub:推送成功后,就可以在DockerHub中看到镜像了。应用部署接下来我们将应用部署到K8S上,包括SpringBoot应用的部署和MySQL的部署。要部署MySQL,首先要添加配置文件mysql-deployment.yaml,创建一个Deployment。详情见评论;apiVersion:apps/v1kind:Deploymentmetadata:#指定Deployment的名称name:mysql-deployment#指定Deployment的labelslabels:app:mysqlspec:#指定Pod的副本数createreplicas:1#定义如何查找Pod管理Labelslabels:app:mysql#Pod的模板规范spec:containers:-name:mysql#指定容器镜像image:mysql:5.7#指定开放端口ports:-containerPort:3306#设置环境变量env:-name:MYSQL_ROOT_PASSWORDvalue:root#使用存储卷volumeMounts:#将存储卷挂载到容器内部路径-mountPath:/var/log/mysqlname:log-volume-mountPath:/var/lib/mysqlname:data-volume-mountPath:/etc/mysqlname:conf-volume#定义存储卷volumes:-name:log-volume#hostPath类型存储卷在主机上的路径hostPath:path:/home/docker/mydata/mysql/log#创建时目录不存在类型:DirectoryOrCreate-name:data-volumehostPath:path:/home/docker/mydata/mysql/datatype:DirectoryOrCreate-name:conf-volumehostPath:path:/home/docker/mydata/mysql/conftype:DirectoryOrCreate通过应用配置文件创建Deployment;kubectlapply-fmysql-deployment。yaml运行成功后,查询Deployment,发现mysql-deployment已经准备好了;[macro@linux-localk8s]$kubectlgetdeploymentsNAMEREADYUP-TO-DATEAVAILABLEAGEmysql-deployment1/11138snginx-volume-deployment2/2226d5h如果想让其他Pod通过服务名访问MySQL,需要创建Service,添加配置文件mysql-service。yaml创建服务;apiVersion:v1kind:Servicemetadata:#定义服务名,其他Pod可以使用服务名作为域名访问name:mysql-servicespec:#指定服务类型,通过Node静态端口暴露服务类型:NodePort#The管理标签app为mysqlPodselector:app:mysqlports:-name:httpprotocol:TCPport:3306targetPort:3306#StaticportnodePortonNode:30306通过应用配置文件创建Service;kubectlapply-fmysql-service.yaml运行成功后,查询Service发现mysql-service已经暴露在Node的30306端口;[macro@linux-localk8s]$kubectlgetservicesNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP10.96.0.1443/TCP7d23hmysql-serviceNodePort10.107.189.513306:30306/TCP7snginx-serviceNodePort10.101.171.18180:30080/TCP6d2h部署完成后,需要新建商城数据库,导入相关表。表地址:https://github.com/macrozheng/mall-learning/blob/master/document/sql/mall.sql这里是比较简单的导入方式数据库,通过Navicat创建连接,先配置一个SSH通道;那么我们就可以像访问Linux服务器上的数据库一样访问Minikube中的数据库了,直接在Minikube中添加数据库IP和端口即可要部署一个SpringBoot应用,首先要添加配置文件mall-tiny-fabric-deployment.yaml来创建一个Deployment。这里我们可以通过环境变量覆盖SpringBoot中的默认配置;apiVersion:apps/v1kind:Deploymentmetadata:name:mall-tiny-fabric-deploymentlabels:app:mall-tiny-fabricspec:replicas:1selector:matchLabels:app:mall-tiny-fabrictemplate:metadata:labels:app:mall-tiny-fabricspec:containers:-name:mall-tiny-fabric#指定DockerHub镜像地址在image:macrodocker/mall-tiny-fabric:0.0.1-SNAPSHOTports:-containerPort:8080env:#指定数据库连接地址-name:spring.datasource.urlvalue:jdbc:mysql://mysql-service:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai#指定日志文件路径-name:logging.pathvalue:/var/logsvolumeMounts:-mountPath:/var/logsname:log-volumevolumes:-name:log-volumehostPath:path:/home/docker/mydata/app/mall-tiny-fabric/logstype:DirectoryOrCreate通过应用配置文件创建Deployment;kubectlapply-fmall-tiny-fabric-deployment.yaml我们可以通过kubectllogs命令LOG查看应用的启动情况;[macro@linux-localk8s]$kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEmall-tiny-fabric-deployment-8684857dff-pnz2t1/1Running047smysql-deployment-5dccc96ccf-sfxvg1/1Running025mnginx-volume-deployment-6f6c89976d-nv2rn1/1Running46d6hnginx-volume-deployment-6f6c89976d-tmhc51/1Running46d5h[macro@linux-localk8s]$kubectllogs-fmall-tiny-fabric-deployment-8684857dff-pnz2t如果要从外部访问SpringBoot应用,需要创建一个Service,添加配置文件mall-tiny-fabric-service.yaml来创建Service;apiVersion:v1kind:Servicemetadata:name:mall-tiny-fabric-servicespec:type:NodePortselector:app:mall-tiny-fabricports:-name:httpprotocol:TCPport:8080targetPort:8080#节点上的静态端口nodePort:30180通过应用创建服务配置文件;kubectlapply-fmall-tiny-fabric-service.yaml此时服务已经暴露到Node的30180端口;[macro@linux-localk8s]$kubectlgetservicesNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP10.96.0.1443/TCP7d23hmall-tiny-fabric-serviceNodePort10.100.112.84<无>8080:30180/TCP5smysql-serviceNodePort10.107.189.51<无>3306:30306/TCP13mnginx-serviceNodePort10.101.171.181:<30>8080/TCP6d2h在Linux服务器上,我们可以使用curl命令访问下一个项目的Swagger页面,但是只能查看curl$(minikubeip):30180/swagger-ui.html返回的一串HTML代码外部访问应用是由于使用Minikube安装的K8SNode是在Linux服务器的内网环境下,无法从外部直接访问,所以我们需要安装一个Nginx反向代理来访问。首先,我们需要安装Nginx。对Nginx不熟悉的朋友可以直接参考这篇文章:《Nginx的这些妙用,你肯定有不知道的!》安装完成后,添加一个Nginx配置文件。这里,我的配置路径是/mydata/nginx/conf/conf.d/,用来代理mall-tiny.macrozheng.com域名访问K8S中的SpringBoot应用,proxy_pass是curl使用的路径多于;server{listen80;server_namemall-tiny.macrozheng.com;#修改域名位置/{proxy_set_headerHost$host:$server_port;proxy_passhttp://192.168.49.2:30180;#改为代理服务地址indexindex.htmlindex.htm;}error_page500502503504/50x.html;location=/50x.html{root/usr/share/nginx/html;}}重启Nginx服务,然后修改本地访问Linux服务器的host文件,添加如下记录;192.168.5.94mall-tiny.macrozheng.com后,可以在本机直接访问K8S上的SpringBoot应用,访问地址:http://mall-tiny.macrozheng.com/swagger-ui.html总结通过部署将SpringBoot应用移植到K8S上,我们可以发现部署在K8S上和部署在Docker上有很多相似之处。K8S上的很多部署脚本都可以直接用DockerCompose脚本翻译,非常相似。如果你之前使用过Docker,那么你可以轻松上手K8S!