k8s部署前后端分离项目

1. 项目准备

项目demo简述:
前端:nginx部署页面,并反向代理后端api接口
后端:SpringBoot + Mybatis,web项目访问mysql数据库

1.1 后端项目

1.1.1 数据库表

user
库表

CREATE DATABASE  IF NOT EXISTS `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `demo`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jack', 22);
INSERT INTO `user` VALUES (2, 'Tom', 21);

SET FOREIGN_KEY_CHECKS = 1;
1.1.2 SpringBoot项目

同普通SpringBoot项目一样,整合Mybatis,可参考我其他的博客。下面只给出Controller,和访问结果。

package ace.gjh.controller;

import ace.gjh.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ACE_GJH
 * @date 2021/5/7
 */
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user")
    public Object userInfo(){
        return userService.listUsers();
    }

}

访问效果

GET http://localhost:8888/test/user
[
    {
        "id": 1,
        "name": "Jack",
        "age": 22
    },
    {
        "id": 2,
        "name": "Tom",
        "age": 21
    }
]

1.2 前端项目

1.2.1 页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script src="js/jquery-3.4.1.min.js"></script>
    <script>
        $(function () {
            test()
        })

        /*加载文件列表*/
        function test() {
            $.ajax({
                url: "/api/test/user",
                type: "GET",
                dataType: "json",
                success: function (result) {
                    $("#result").text("name: " + result[0].name + " age: " + result[0].age + " | name: " + result[1].name + " age: " + result[1].age)
                }
            })
        }
    </script>
</head>
<body>
	<h2>测试页面</h2>
访问后台数据结果:<p id="result"></p>
</body>
</html>
1.2.2 nginx代理

注意反向代理需要配置后端Service的Cluster-IP和端口,因为nginx的配置文件无法从环境变量中获取值(无法通过服务发现获取后端服务的IP和端口)。

    server {
        listen       18888;
        server_name  localhost;
                location / {
            root   <你的前端文件夹路径>\k8s-test-frontend;
            index  index.html index.htm;
        }
        # 反向代理后端api
        location /api {
            rewrite ^/api/(.*)$ /$1 break; 
            proxy_pass http://<后端Service的Cluster-IP>:<后端Service的端口>/;
        } 
    }
1.2.3 页面效果

测试页面

2. Docker镜像准备

2.1 数据库镜像

2.1.1 初始化sql脚本
CREATE DATABASE  IF NOT EXISTS `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `demo`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jack', 22);
INSERT INTO `user` VALUES (2, 'Tom', 21);

SET FOREIGN_KEY_CHECKS = 1;
2.1.2 Dockerfile
FROM mysql:8.0.24
MAINTAINER ACE_GJH
COPY ./demo.sql /docker-entrypoint-initdb.d

制作镜像

docker build -f Dockerfile -t demo-mysql:0.1.0 .

2.2 后端镜像

2.2.1 Dockerfile

注意:脚本中最后的java运行命令,需要从环境变量中注入Mysql服务Service的Cluster-IP和对应的端口,需要参照MySQL的Service中的名称进行对应,例如下面的mysql服务IP地址为环境变量DEMO_MYSQL_SERVICE_SERVICE_HOST,mysql端口DEMO_MYSQL_SERVICE_SERVICE_PORT_MYSQL_PORT,还要注意这坑爹的时区serverTimezone=UTC,一定要和你的服务器对应,否则一直连接超时。

FROM java:8-alpine
MAINTAINER ACE_GJH
RUN mkdir /app
WORKDIR /app
COPY k8s-deploy-1.0-SNAPSHOT.jar /app
EXPOSE 8888
ENV JAVA_OPT="-Xmx32m -Xms32m -Xmn16m"
CMD java $JAVA_OPT -Dspring.datasource.url="jdbc:mysql://${DEMO_MYSQL_SERVICE_SERVICE_HOST}:${DEMO_MYSQL_SERVICE_SERVICE_PORT_MYSQL_PORT}/demo?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" -jar k8s-deploy-1.0-SNAPSHOT.jar

制作镜像

docker build -f Dockerfile -t demo-backend:0.1.0 .

2.3 前端镜像

FROM nginx:1.20.0-alpine
MAINTAINER ACE_GJH
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
COPY ./webpack/dist /usr/share/nginx/webpack/dist

制作镜像

docker build -f Dockerfile -t demo-frontend:0.1.0 .

3. k8s配置文件

3.1 数据库

3.1.1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-mysql
  namespace: gjh
spec:
  selector:
    matchLabels:
      app: demo-mysql
  replicas: 1
  template:
    metadata:
       labels:
         app: demo-mysql
    spec:
      volumes:
      # mysql数据
      - name: mysql-data
        hostPath:
          path: /root/data/demo/mysql
      containers:
      - name: demo-mysql
        image: demo-mysql:0.1.0
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-data
3.1.2 Service
apiVersion: v1
kind: Service
metadata:
  name: demo-mysql-service
  namespace: gjh
spec:
  ports:
  - port: 3306
    name: mysql-port
  selector:
    app: demo-mysql

3.2 后端项目

3.2.1 ReplicationController

为了起到负载均衡的作用,这里副本数选择2

apiVersion: v1
kind: ReplicationController
metadata:
  name: demo-backend-rc
  namespace: gjh
  labels:
    app: demo-backend
spec:
  selector:
    app: demo-backend
  replicas: 2
  template:
    metadata:
       labels:
         app: demo-backend
    spec:
      containers:
      - name: demo-backend
        image: demo-backend:0.1.0
        ports:
        - containerPort: 8888
3.2.2 Service
apiVersion: v1
kind: Service
metadata:
  name: demo-backend-service
  namespace: gjh
spec:
  type: NodePort
  ports:
  - port: 8888
    name: backend-port
    nodePort: 38888
  selector:
    app: demo-backend

3.3 前端项目

3.3.1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-frontend
  namespace: gjh
spec:
  selector:
    matchLabels:
      app: demo-frontend
  replicas: 1
  template:
    metadata:
       labels:
         app: demo-frontend
    spec:
      containers:
      - name: demo-frontend
        image: demo-frontend:0.1.0
        ports:
        - containerPort: 18888
3.3.2 Service
apiVersion: v1
kind: Service
metadata:
  name: demo-frontend-service
  namespace: gjh
spec:
  type: NodePort
  ports:
  - port: 18888
    name: frontend-port
    nodePort: 38889
  selector:
    app: demo-frontend
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭建華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值