前序

目前大多数项目都在以前后端分离方式进行项目的开发、部署。这样方便在更新前端时,不用重启后端,反之亦然,前后端解耦也提高开发的效率。今天咱们讲讲在如何在k8s集群中进行前后端分离部署。

镜像制作

后端

dockerfile编写

 

bash

复制代码

#基于openjdk镜像
FROM adoptopenjdk:8u222-b10-jdk-hotspot-bionic
#指定app目录为当前运行目录
WORKDIR /server
#安装字体及相关环境变量
RUN apt-get update  && apt-get -y install fontconfig && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \    && localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG zh_CN.utf8
COPY ./server /server/
#端口映射
EXPOSE 8080
#执行命令,给sh脚本赋予执行权限
RUN chmod a+x start.sh
#指定启动后需要执行的脚本
ENTRYPOINT ["./start.sh"]

构建镜像

将dockerfile文件放在后端工程server同一层级下执行

 

vbscript

复制代码

docker build -f dockerfile -t server:0.0.1 .

记得以上命令中最后的.不能删掉

前端

dockerfile

前端镜像打算以nginx镜像作为基镜像,把前端项目文件构建结果拷贝进去,如下:

 

bash

复制代码

#基于openjdk镜像
FROM nginx
COPY nginx.conf /etc/nginx/
COPY web /opt/front/

nginx.conf为自己写的nginx配置文件,拷贝进去后覆盖nginx镜像中的配置文件内容。 /opt/front路径是nginx默认找静态资源的路径

构建镜像

将dockerfile文件放在web目录同级

 

erlang

复制代码

docker build -f dockerfile -t web:0.0.1 .

编写k8s资源yaml

后端

deploy以及service资源yaml

 

yaml

复制代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-v2
spec:
  selector:
    matchLabels:
      app: server-v1
  replicas: 1
  template:
    metadata:
      labels:
        app: server-v1
    spec:
      containers:
      - name: server-v1
        image: xxxxxx:8082/repository/mydocker/server:0.0.1 #替换为自己的docker镜像仓库地址
        ports:
        - containerPort: 8080
     # nodeName: node1
---
apiVersion: v1
kind: Service
metadata:
  name: backend-v1
spec:
  selector:
    app: server-v1
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

前端

deploy以及service资源yaml

 

yaml

复制代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: front-v2
spec:
  selector:
    matchLabels:
      app: web-v1
  replicas: 1
  template:
    metadata:
      labels:
        app: web-v1
    spec:
     # nodeName: node1
      containers:
      - name: web-v1
        image: xxxxxxxxxxxx:8082/repository/mydocker/web:0.0.1 #替换为自己的docker镜像仓库地址
        ports:
        - containerPort: 80
     # nodeName: node1
---
apiVersion: v1
kind: Service
metadata:
  name: front-v1
spec:
  selector:
    app: web-v1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

外部访问ingress-nginx资源yaml编写

 

yaml

复制代码

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-demo
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
       - path: /
         pathType: ImplementationSpecific
         backend:
           service:
             name: front-v1
             port:
               number: 80
       - path: /api
         pathType: Prefix
         backend:
           service:
             name: backend-v1
             port:
               number: 8080
       - path: /login-in
         pathType: Prefix
         backend:
           service:
             name: backend-v1
             port:
               number: 8080
       - path: /logout
         pathType: Prefix
         backend:
           service:
             name: backend-v1
             port:
               number: 8080

结语

以上内容涵盖前后端镜像dokcerfile编写到镜像制作,以及部署至k8s集群所需的deployment、service的yaml资源的编写,和ingress的yaml资源的编写。因大家的项目情况各不相同,以上只是一个整体的参考。如果有问题,还请各位小伙伴在评论区进行讨论,大家互相学习,共同进步!


作者:IAlegend