对很多公司来说,有不少传统的Java Web应用需要迁移到云环境继续运营,但是暂时没有按云原生的方式重构系统的迫切需要,这样我们需要一个想对简单的方法,迁移这些Java应用系统到云托管的K8S上,这里就说说这个迁移的详细过程,给有类似需要的同学一个参考。
作者这里需要迁移的Java Web应用,都是Spring Boot的Java Web应用的。迁移的详细操作如下:
第一步,确保上云操作的是maven项目,如果不是请自行转成maven。
对于java项目转maven项目的方法,有很多文章可以参考,请自行处理好,保证项目可以打成一个含了tomcat的单独全包的。
第二步,在环境变量里配置本地docker环境.
1、准备docker私有镜像仓库的证书文件:docker_pem.zip,把这个文件下载到本地电脑的一个目录,假定证书路径是: /usr/local/docker_pem
2、设置环境变量。
Windows:
# 在环境变量->系统变量->新建 DOCKER_HOST=tcp://192.168.74.82:2376 DOCKER_CERT_PATH=/usr/local/docker_pem DOCKER_TLS_VERIFY=1
MacOS:
# vim ~/.bash_profile export DOCKER_HOST=tcp://192.168.74.82:2376 export DOCKER_CERT_PATH=/usr/local/docker_pem export DOCKER_TLS_VERIFY=1 # source ~/.bash_profile
3、如无生效,重启电脑。
值得注意的是配置的是系统变量,在装docker时用户变量那里会有一个默认docker仓库的配置,记得要将用户变量与docker相关的配置删掉,已新增的系统变量为准
这是我本地的系统变量,仅供参考
配置好系统变量后,记得重启电脑。怎样检查配置是否生效呢,去到docker服务器192.168.74.82,在根目录下输入docker images,列出当前所有镜像,如果列出一堆镜像则说明配置生效了,如果一个镜像都没请检查环境变量里的系统变量配置是否正确,确保用户变量的默认配置删掉。
第三步,将项目打包成docker镜像
其实只需要改动maven项目的pom.xml文件、在项目的跟目录下新建Dockerfile文件,Dock而file文件内容如下。
FROM xxx/rdgroup-jdk6-resin3.1.8:v1-utf8 ARG WEB_PATH ADD $WEB_PATH /data/web ENTRYPOINT ["/resin-pro-3.1.8/bin/httpd.sh", "-Xmx512m", "-Xms512m"]
FROM后面是resin3.1.8和jdk6的基础镜像,就是我们的项目是基于这个基础镜像创建的。基础镜像分为GBK、UTF-8两个版本,根据自己的项目编码选择基础镜像,gbk版本:xxx/rdgroup-jdk6-resin3.1.8:v1-gbk,utf8版本:xxx/rdgroup-jdk6-resin3.1.8:v1-utf8。ENTRYPOINT的内存设置根据现有项目resin里配置来设置。
pom.xml文件增加dockerfile插件:dockerfile-maven-plugin,注意goals标签里的内容是注释掉的,如果不注释掉,maven每回package都会推送镜像到开发环境,也就是说maven的clean和package两个命令指示单纯的打包,推送镜像另外写命令来推。
pom.xml文件内容如下:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-plugin.version}</version> <executions> <execution> <id>default</id> <!--<goals> <goal>build</goal> <goal>push</goal> </goals>--> </execution> </executions> <configuration> <repository>${docker.host.dev}/${project.artifactId}</repository> <tag>${project.version}</tag><!-- docker默认使用pom版本 --> <!-- 使用maven setting.xml里的配置 --> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <buildArgs> <WEB_PATH>./target/${project.artifactId}-${project.version}</WEB_PATH> </buildArgs> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> </plugin> </plugins> </pluginManagement>
pom.xml的properties里增加:
<maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> <docker.host.dev>192.168.74.82:5000</docker.host.dev> <dockerfile-maven-plugin.version>1.3.6</dockerfile-maven-plugin.version> <!-- dockerfilec插件 -->
第四步,推送项目镜像到开发环境
maven项目package完后,检查target目录下是否生成了上图所示的目录,如没生成请核对下pom.xml文件,没问题就用命令clean package dockerfile:build dockerfile:push -e推送镜像。镜像推送成功后,会在IDEA的控制台上显示success字样的,看到success字样后去192.168.74.82服务上查看是否有推送成功,查看项目推送的镜像:
第五步,k8s打包部署docker镜像
我们是Helm来部署应用到K8S上,下面是Helm的流程。其中database_conf.xml的修改,可以参考我另一篇文章“K8S部署传统应用镜像操作指南”。
helm发布流程:
1、下载发布包feedback-20200107.2.tgz,根据项目需要,只需改动Chart.yaml、values.yaml,其他文件都已模板化。修改完打zip包上传到192.168.75.85的zx-news文件夹下,如果其他应用不放在这个命名空间下,需要重新新建命名空间。
2、解压到当前目录,用helm package feedback打包生成.tgz包,部署到k8s用helm install feedback --namespace zx-news --set image.repository=192.168.74.82:5000 feedback-20200107.2.tgz命令,查看发布结果,STATUS:DEPLOYED,表示已经部署成功。
3、用k8s集合任何一台都可以访问,例如:http://IP:32700/xxx.jsp。每个应用端口不能重复,32700在values.yaml的service→port里设置。访问如果有报错,查看报错信息:kubectl -n trad-ns logs feedback-77bd44f49d-zwxjp,feedback-77bd44f49d-zwxjp这个是应用所在容器名称,查看运行容器命令kubectl -n zx-news get pods。
k8s部署的项目不会用到传统应用的resin_config.xml了,所以之前配置在该文件的数据都要抽取出来。values.yaml的containers-->env-->value配置的是dev,上线后这里记得改成prod,所以项目的配置文件要根据环境的不同设置不同配置文件,例:feedback-dev.properties,feedback-prod.properties。
至此,我们就把一个Java Web应用迁移到了阿里云的托管K8S上,可以享受到K8S的应用管理便利及公有云的强大扩容能力了。