Kubernetes微型实战(3): renren_fast前后端分离项目(后端)

从本篇开始,实战部署一个前后端分离的项目,分别部署一个前端,一个后端,一个服务端

前置准备

请确保已经按照教程1、教程2完成了Docker私服以及MySQL单机服务的部署,明确一下几点环境信息

  • 本地IP:192.168.64.6
  • Docker registry私服地址:192.168.43.205:5000
  • MySQL地址:
    • 外部地址:192.168.64.6:3306
    • 内部service名称:mysql
    • 内部地址:mysql.default.svc.cluster.local:3306

部署的项目

renren-fast v3.0

此为前后端分离项目,本篇介绍后端部署,不包含Redis的连接,且为单实例

image1

部署完成后的效果图(由于为后端应用,所以仅提供查看swagger文档的功能)

image2


修改项目配置并打包

首先按照官网教程先把项目克隆到本地,然后用maven下载各种依赖,确保可以正常打包

打开文件 src/main/resources/application.yml,把 spring.profiles 的参数改为 prod ,这样子最终使用的将会是 src/main/resources/application-prod.yml 文件中配置的参数,而不是同级目录中的 application-dev.yml

注意到 server.port 配置的端口为8080

之后,打开文件 src/main/resources/application-prod.yml,修改如下图红线的部分

image3.png

分别改为Kubernetes中内部DNS对应的MySQL的service的url,基本格式是 service名称.命名空间的名称.svc.cluster.local ,下面两个分别为用户名和密码

同时注意到该程序使用的MySQL的数据库命名为 renren_fast

在项目根目录下使用命令 mvn clean install -Dmaven.test.skip=true 对项目进行打包,生成的jar文件在 target/renren-fast.jar


打包成镜像并推送至私有仓库

打开项目根目录下的 Dockerfile,将 ADD renren-fast.jar /app.jar 修改为 ADD target/renren-fast.jar /app.jar

在项目根目录下执行打包命令

1
docker build -t 192.168.43.205:5000/renren-fast-server:1.3 .

注意,由于我本地测试了多次,所以打了很多的tag,本次tag代表的版本为1.3

打包完成,将其推送至私服

1
docker push 192.168.43.205:5000/renren-fast-server:1.3

准备前置数据

在项目文件夹 db 下有需要导入的sql文件,由于我们使用的是MySQL,所以需要导入的是 db/mysql.sql 文件,由于 renren_fast 数据库还不存在,所以先需要远程登录创建一下

1
mysql -h 192.168.64.6  -P 3306 -u root -p

执行sql命令

1
create database renren_fast;

随后导入sql文件

1
mysql -h 192.168.64.6  -P 3306 -u root -p renren_fast < db/mysql.sql

编写Kubernetes配置文件

现在编写Deployment和Service

Deployment配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# springboot-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: java-app
image: 192.168.43.205:5000/renren-fast-server:1.3
resources:
limits:
memory: "1Gi" # 稍微大一些,SpringBoot启动比较慢
cpu: "300m"
requests:
memory: "512Mi"
cpu: "100m"
ports:
- containerPort: 8080 # 这里和之前 application.yml 中的port相同
name: java-app-port

Service配置如下,设置为NodePort类型,便于暴露端口

1
2
3
4
5
6
7
8
9
10
11
12
13
# springboot-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: java-app
spec:
type: NodePort
selector:
app: java-app
ports:
- port: 8080 # 内部访问端口
targetPort: java-app-port # 这里的名称需要和前面的ports中的name对应
nodePort: 30125 # 外部访问端口

如果两个文件是在同一个文件夹下的,那么直接在该文件夹下执行如下命令即可

1
kubectl apply -f .

测试

由于SpringBoot启动较慢,所以要等待一段时间。这里直接用 kubectl attach <pod 名称> 直接查看SpringBoot的输出log,如果看到下面这些内容了就代表启动完毕

image4.png

然后就可以访问其swagger文档页测试各种api了,我测试机上访问的链接是 http://192.168.64.6:30125/renren-fast/swagger/index.html

image5.png