本文档基于开源的java单体服务(开源问卷系统、DWSurvey)为例,国内码云地址(https://gitee.com/wkeyuan/DWSurvey),github地址(https://github.com/wkeyuan/DWSurvey),演示java 单体服务从源码如何进行源代码编译、容器镜像构建、在京东云创建RDS、并自编写yam文件将服务运行在京东云托管的kubernetes环境。
本文档所涉及使用的软件环境如下:
RDS: 京东云托管数据库,京东云官方文档:https://docs.jdcloud.com/cn/rds/product-overview
Kubernetes:京东云kubernetes集群环境、完全兼容社区版本,京东云官方文档:https://docs.jdcloud.com/cn/jcs-for-kubernetes/product-overview
本文档使用DWSurvey源代码、Dockerfile及yaml文件已经全部上传至github,地址如下:
https://github.com/zhangshijle/dwsurvey-to-jdcloud-kubernetes.git
一:RDS:
1、在京东云创建RDS,如果需要其它中间件也可以按照京东云官方文档创建。
2、在RDS创建数据库账户并进行账户授权
二:java源代码编译:
1、准备Java编译环境
2、Clone Java源代码
3、修改源代码中的RDS连接信息、账户及密码
4、RDS数据初始化
5、编译Java源代码并进行制品测试
三:容器镜像构建:
1、编写Dockerfile构建容器镜像并测试
四:在kubernetes部署web服务并验证
1、编写yam文件,在kubernetes运行web服务并进程状态验证
2、编写yaml文件,在kubernetes集群创建service并进行访问测试
在京东云控制台创建RDS、创建普通数据库账户并进行账户授权,Java服务将使用此普通账户连接RDS。
RDS所在的网络尽量与后期部署的web 服务在同一个VPC,如果不在同一个VPC则需要打通跨VPC的通信。
此域名为RDS的内网或外网户名,内网域名将被解析为RDS的内网IP,外网域名将被解析为RDS的外网IP,外网域名默认未开启、需要单独开启,如果只在京东云内部访问RDS、推荐使用内网域名,相对更加安全。
创建一个数据库和一个数据库账户,用于Java应用程序连接RDS使用。
按照实际需求,指定库名和字符集。
按照实际需求,创建RDS账户并指定密码。
user:DWSurvey
password:DWSurvey123456
按照实际需求,为账户授予RDS的访问权限
点击指定账户的 修改权限 菜单。
为账户选择合适的权限,并点击确定。
验证账户权限和数据库是否对应。
确认可以使用RDS普通账户远程连接到RDS。
[root@20220530-instance ~]# yum install -y mariadb
连接信息为之前步骤获取到的RDS连接地址、创建的RDS账户及指定的密码:
地址: mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com
库名:dwsurvey
账户:DWSurvey
密码:DWSurvey123456
[root@20220530-instance ~]# mysql -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com -uDWSurvey -pDWSurvey123456
基于maven等于Java源代码进行编译,构建为jar包,后续再将jar包构建为容器镜像。
[root@20220530-instance ~]# yum install java-1.8.0-openjdk
[root@20220530-instance ~]# java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode
[root@20220530-instance apps]# tar xvf apache-maven-3.6.3-bin.tar.gz
[root@20220530-instance apps]# ln -sv /apps/apache-maven-3.6.3 /apps/maven
‘/apps/maven’ -> ‘/apps/apache-maven-3.6.3’
[root@20220530-instance apps]# vim /etc/profile
export PATH=/apps/maven/bin/:$PATH
[root@20220530-instance apps]# source /etc/profile
[root@20220530-instance apps]# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /apps/maven
Java version: 1.8.0_362, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
~# git clone https://gitee.com/wkeyuan/DWSurvey.git
~# cd DWSurvey/
#修改RDS连接信息:
[root@20220530-instance DWSurvey]# vim src/main/resources/application-test.yml
web:
# 后端文件存储目录,默认即在安装包同级目录下
file-path: dwfile/dwsurvey/
# 使用哪种部署模式,后期可能会去掉,可以先保持默认
static-type: static
# 站点访问地址,如果配置有域名则为域名地址
site-url: http://www.myserver.com:8081
# 资源访问地址,便于存储模式的切换,目前可以保持与site-url一样
resource-url: http://www.myserver.com:8080
# 站点信息配置,会出现在底部footer区
# 数据库配置
datasource:
#type: com.alibaba.druid.pool.DruidDataSource
# 连接URL
url: jdbc:mysql://mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com:3306/dwsurvey?useUnicode=true&characterEncoding=utf8
# 连接账号
username: DWSurvey
# 连接密码
password: PASSWORD
[root@20220530-instance DWSurvey]# vim src/main/resources/application-prod.yml
web:
file-path: diaowen/file/
static-type: static
site-url: http://www.myserver.com:8080
resource-url: http://www.myserver.com:8080
# site-url: http://ent82.surveyform.cn
info:
site-name: 调问网
site-url: http://www.myserver.com:
site-icp: 京ICP备13050030号-3
site-mail: service@diaowen.net
site-phone: 18888888888
datasource:
#type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com:3306/dwsurvey?useUnicode=true&characterEncoding=utf8
username: DWSurvey
password: PASSWORD
type: com.alibaba.druid.pool.DruidDataSource
基于maven对Java源代码进行编译
[root@20220530-instance apps]# cd /root/DWSurvey/
[root@20220530-instance DWSurvey]# mvn clean install package -Dmaven.test.skip=true
编译完成的jar包通常保存到源代码目录下的target目录中,此jar包将用于运行web服务及构建容器镜像:
[root@20220530-instance DWSurvey]# ll target/
total 165912
drwxr-xr-x 6 root root 4096 Apr 6 13:15 classes
-rw-r--r-- 1 root root 153230407 Apr 6 13:15 dwsurvey-oss-vue-v.5.3.0-Beta.jar #编译完成的制品
-rw-r--r-- 1 root root 16642040 Apr 6 13:15 dwsurvey-oss-vue-v.5.3.0-Beta.jar.original
drwxr-xr-x 3 root root 4096 Apr 6 13:15 generated-sources
drwxr-xr-x 2 root root 4096 Apr 6 13:15 maven-archiver
drwxr-xr-x 3 root root 4096 Apr 6 13:15 maven-status
导入提前准备好的sql文件,对RDS进行初始化。
[root@20220530-instance DWSurvey]# mysql -uDWSurvey -pDWSurvey123456 -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com dwsurvey < ./target/classes/conf/sql/dwsurvey.sql
#验证数据库数据:
[root@20220530-instance DWSurvey]# mysql -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com -uDWSurvey -pDWSurvey123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3347
Server version: 5.7.33-log Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> use dwsurvey;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [dwsurvey]> show tables;
+----------------------+
| Tables_in_dwsurvey |
+----------------------+
| t_an_answer |
| t_an_checkbox |
| t_an_chen_checkbox |
| t_an_chen_fbk |
| t_an_chen_radio |
| t_an_chen_score |
| t_an_comp_chen_radio |
| t_an_dfillblank |
| t_an_enumqu |
| t_an_fillblank |
........................
在可以连接RDS的测试环境启动jar包,验证服务是否可以正常运行:
[root@20220530-instance DWSurvey]# java -jar target/dwsurvey-oss-vue-v.5.3.0-Beta.jar
通过浏览器访问服务器web界面,验证Java服务是否启动正常。
初始账号:service@diaowen.net
密码:123456
登录成功后即可进行查看、配置等业务管理,不同的业务代码功能不一样,此处只作为部署参考,到此步骤即实现了java源代码的的编译步骤,接下来即可进行容器镜像构建并将APP运行在kubernetes环境的目的。
基于dockerfile,将上一步骤编译好的java程序构建成docker镜像,实现基于容器运行java app。
根据实际需求,编写Dockerfile,将上一步骤编译好的jar包构建为容器镜像
[root@20220530-instance DWSurvey]# pwd
/root/DWSurvey
[root@20220530-instance DWSurvey]# mkdir -p k8s/dockerfile
[root@20220530-instance DWSurvey]# cd k8s/dockerfile/
[root@20220530-instance dockerfile]# docker pull openjdk:8u312-buster #基于开源jdk镜像
[root@20220530-instance dockerfile]# cp ../../target/dwsurvey-oss-vue-v.5.3.0-Beta.jar ./ #拷贝jar包
[root@20220530-instance dockerfile]# ll
total 149652
-rwxr-xr-x 1 root root 175 Apr 6 15:22 build-command.sh
-rwxr-xr-x 1 root root 64 Apr 6 15:02 docker-entrypoint.sh
-rw-r--r-- 1 root root 245 Apr 6 15:36 Dockerfile
-rw-r--r-- 1 root root 153230407 Apr 6 14:56 dwsurvey-oss-vue-v.5.3.0-Beta.jar
#验证Dockerfile内容
[root@20220530-instance dockerfile]# cat Dockerfile
FROM openjdk:8u312-buster
RUN mkdir /apps
ADD docker-entrypoint.sh /usr/local/bin/
RUN ln -s /usr/local/bin/docker-entrypoint.sh /entrypoint.sh
ADD dwsurvey-oss-vue-v.5.3.0-Beta.jar /apps/
EXPOSE 8080
ENTRYPOINT ["docker-entrypoint.sh"]
#docker镜像启动服务的内置脚本
[root@20220530-instance dockerfile]# cat docker-entrypoint.sh
#!/bin/bash
java -jar /apps/dwsurvey-oss-vue-v.5.3.0-Beta.jar
#镜像构建脚本
[root@20220530-instance dockerfile]# cat build-command.sh
#!/bin/bash
docker build -t myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1 .
docker push myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1
[root@20220530-instance dockerfile]# bash build-command.sh
在可以连接RDS的主机,基于上一步骤构建的镜像创建测试容器,验证容器可以正常启动:
[root@20220530-instance dockerfile]# docker run -it -p 8080:8080 --rm myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1
编写yaml文件,然后将java服务运行在kubernetes环境并验证是否可以通过外网访问
基于编写yaml文件部署web服务
[root@20220530-instance DWSurvey]# pwd
/root/DWSurvey
[root@20220530-instance DWSurvey]# mkdir -p k8s/yaml
[root@20220530-instance DWSurvey]# cd k8s/yaml/
[root@20220530-instance yaml]# cat 1.DWSurvey-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: myserver-dwsurvey-deployment-label
name: myserver-dwsurvey-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-dwsurvey-selector
template:
metadata:
labels:
app: myserver-dwsurvey-selector
project: myserver
spec:
containers:
- name: myserver-dwsurvey-container
image: myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
imagePullSecrets:
- name: jcr-pull-secret
#部署web服务
[root@20220530-instance yaml]# kubectl apply -f 1.DWSurvey-deployment.yaml
deployment.apps/myserver-dwsurvey-deployment created
#验证pod状态
[root@20220530-instance yaml]# kubectl get pod -n myserver
NAME READY STATUS RESTARTS AGE
myserver-dwsurvey-deployment-7dc99c7ccd-b5qsd 1/1 Running 0 7m27s
当service创建成功后,即可通过service的公网IP访问运行在京东云kubernetes环境中的web服务了。
LoadBalancer类型的service会创建一个带公网IP的SLB,用于从公网访问SLB后kubernetes集群中的web服务。
[root@20220530-instance yaml]# cat 2.DWSurvey-service.yaml
kind: Service
apiVersion: v1
metadata:
namespace: myserver
name: myserver-dwsurvey-slb
labels:
k8s-app: myserver-dwsurvey-slb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 31080
type: LoadBalancer
selector:
app: myserver-dwsurvey-selector
project: myserver
[root@20220530-instance yaml]# kubectl apply -f 2.DWSurvey-service.yaml
service/myserver-dwsurvey-slb created
[root@20220530-instance yaml]# kubectl get svc -n myserver
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myserver-dwsurvey-slb LoadBalancer 10.10.61.33 10.10.48.8,116.196.66.49 80:31080/TCP 2m55s
可以将域名解析到SLB的公网IP(需提前备案)或使用公网IP访问测试。
初始账号:service@diaowen.net
密码:123456
按照以上步骤,即可完成java 单体服务到京东云kubernetes环境的整体迁移,其中Java服务以容器的形式运行在京东云kubernetes环境中、而业务数据则保存到京东云的RDS中。
我们的产品专家为您找到最合适的产品/解决⽅案
1v1线上咨询获取售前专业咨询
专业产品顾问,随时随地沟通