k8s部署前后端分离项目

技术栈:Vue + Golang + MySQL + Redis

背景:MySQL 数据库在使用前需要对数据进行初始化

步骤:

1. 为前端 Vue 项目、后端 Go 项目、MySQL 数据库编写 Dockerfile,打包镜像,push 至 Dockerhub
2. 为 4 个服务分别编写 Service、Deployment
3. kubectl create 执行 Service、Deployment
复制代码

附项目地址:github.com/TeanLee/mal…

前端:mall-admin-frontend(包含数据库初始化内容,在 MySQL 文件夹中)

后端:mall-admin-server-go

具体 yaml 文件如下:

前端项目

先编写 Dockerfile 对前端项目打包,Dockerfile 如下:

# !注意:node 版本要和本地能执行成功的版本保持一致!!!
FROM node:16.12

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

ENV VUE_APP_API_URL='http://127.0.0.1:8081'

EXPOSE 8080

CMD [ "npm", "run", "serve" ]
复制代码

.dockerignore(不拷贝 node_modules,减少文件内容)

node_modules
复制代码

在当前 Dockerfile 目录下执行命令:

docker build -t mall-admin-server-frontend .

docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-frontend:1.0.0

docker login

docker push {your dockerhub name}/mall-admin-server-frontend:1.0.0
复制代码

k8s 构建 Service、Deployment 的文件如下,注意替换镜像(image)为上一步构建的镜像名称!

扫描二维码关注公众号,回复: 13756807 查看本文章
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: mall-frontend
  name: mall-frontend
spec:
  ports:
    - name: "8080"
      port: 8080
      targetPort: 8080
  selector:
    io.kompose.service: mall-frontend
status:
  loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: mall-frontend
  name: mall-frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: mall-frontend
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.24.0 (HEAD)
      creationTimestamp: null
      labels:
        io.kompose.service: mall-frontend
    spec:
      containers:
        - env:
            - name: VUE_APP_API_URL
              value: http://127.0.0.1:8081
          image: tean123/mall-admin-server-frontend:1.0.0
          name: mall-admin-server-front-end
          ports:
            - containerPort: 8080
          resources: {}
          tty: true
      restartPolicy: Always
status: {}
复制代码

MySQL 数据库部分

其中 Dump20220317.sql 文件是我需要初始化的文件,按照我在 docker启动时初始化 mysql 数据 文章中的方式,对 MySQL 进行数据初始化。

Dockerfile 如下:

FROM mysql:latest

COPY Dump20220317.sql /docker-entrypoint-initdb.d/Dump20220317.sql
复制代码

在该 Dockerfile 所在目录下执行:

docker build -t mall-admin-server-mysql .

docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-mysql:1.0.0

docker login

docker push {your dockerhub name}/mall-admin-server-mysql:1.0.0
复制代码

MySQL 的 Service、Deployment 部署文件如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: mydb
  name: mydb
spec:
  ports:
    - name: "3306"
      port: 3306
      targetPort: 3306
  selector:
    io.kompose.service: mydb
status:
  loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: mydb
  name: mydb
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: mydb
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.24.0 (HEAD)
      creationTimestamp: null
      labels:
        io.kompose.service: mydb
    spec:
      containers:
        - env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
          image: tean123/mall-admin-server-mysql:1.0.0
          name: mall-admin-server-db
          ports:
            - containerPort: 3306
          resources: {}
          tty: true
      restartPolicy: Always
status: {}
复制代码

后端 Go 部分

Dockerfile 如下:

FROM golang:latest

RUN mkdir /app

WORKDIR /app

ADD go.mod .
ADD go.sum .

RUN go mod download
ADD . .

RUN go build -o main .

EXPOSE 8081
ENTRYPOINT ["./main"]
复制代码

在该 Dockerfile 下执行:

docker build -t mall-admin-server-backend .

docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-backend:1.0.0

docker login

docker push {your dockerhub name}/mall-admin-server-backend:1.0.0
复制代码

后端 Go 项目的 Service、Deployment 部署文件如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  ports:
    - name: "8081"
      port: 8081
      targetPort: 8081
  selector:
    io.kompose.service: app
status:
  loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: app
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.24.0 (HEAD)
      creationTimestamp: null
      labels:
        io.kompose.service: app
    spec:
      containers:
        - env:
            - name: env
              value: production
          image: tean123/mall-admin-server-backend:1.0.0
          name: mall-admin-server-app
          ports:
            - containerPort: 8081
          resources: {}
          tty: true
          volumeMounts:
            - mountPath: /workspace
              name: app-claim0
      restartPolicy: Always
      volumes:
        - name: app-claim0
          persistentVolumeClaim:
            claimName: app-claim0
status: {}
复制代码

Redis 部分

由于没有数据初始化等内容,相对更简单,无需 Dockerfile,只需要部署集群的 Service 和 Deployment

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: cache
  name: cache
spec:
  ports:
    - name: "6379"
      port: 6379
      targetPort: 6379
  selector:
    io.kompose.service: cache
status:
  loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.24.0 (HEAD)
  creationTimestamp: null
  labels:
    io.kompose.service: cache
  name: cache
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: cache
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.24.0 (HEAD)
      creationTimestamp: null
      labels:
        io.kompose.service: cache
    spec:
      containers:
        - image: redis:6.2-alpine
          name: mall-admin-server-redis
          ports:
            - containerPort: 6379
          resources: {}
      restartPolicy: Always
status: {}
复制代码

存储部分

需要注意的是,由于数据库等内容有 Volumn 挂载,因此还需要编写 persistent volumn 内容:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: app-claim0
  name: app-claim0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}
复制代码

部署服务

接下来就是部署服务了,可以选择将所有部署服务的 yaml 放在一个文件夹中,执行

kubectl create -f {deployfile}
复制代码

执行结果如下图:

image.png

文末再推荐一个将 docker-compose 的方法:Kompose

使用kompose convert -f docker-compose.yaml命令就将Docker Compose转换成KubernetesOpenShift所需文件。

猜你喜欢

转载自juejin.im/post/7080781503839338526