K8S部署vue、springboot前后端分离项目
K8S部署vue、springboot前后端分离项目k8s环境部署vue项目准备springboot项目准备k8s容器部署两个项目遇到的问题k8s环境部署因为换工作,新公司使用k8s部署环境,之前没有接触过k8s,所以打算先学一下,之前有过docker的学习经验。看着各种博客和教学视频用kubeadm安装了k8s集群,过程当时没有记录,就不详写,这篇主要记录一个简单前后端分离项目的k8s部署vue
K8S部署vue、springboot前后端分离项目
k8s环境部署
因为换工作,新公司使用k8s部署环境,之前没有接触过k8s,所以打算先学一下,之前有过docker的学习经验。
看着各种博客和教学视频用kubeadm安装了k8s集群,过程当时没有记录,就不详写,这篇主要记录一个简单前后端分离项目的k8s部署
vue项目准备
前端界面不是很熟就下载了一个已经写好的项目再这个基础上进行修改的,就是这个项目vue-element-admin,可以自己搜一下。
项目修改后执行命令
npm run build:prod
打包完成后再项目目录下生成dist目录
将dist目录通过FileZilla传输到linux虚拟机中,我的虚拟机是centos7
连接虚拟机在dist所在自建目录下增加两个文件default.config和Dockerfile
default.cfg是nginx的配置文件,内容如下
server {
listen 9000;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /prod-api/ {
proxy_pass http://192.168.106.165:30160/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
其中需要注意的点是 location /prod-api/ 调用后端时配置的路径
/prod-api/ 这个对应的是vue项目中的.env.production中配置的VUE_APP_BASE_API
Dockerfile是docker build的文件,内容如下
FROM nginx:latest
MAINTAINER "lyl"
LABEL description="TODO LIST"
COPY dist/ /usr/share/nginx/html/
COPY default.conf /etc/nginx/conf.d/default.conf
然后执行docker build -t web-todo .
注意执行的时候不要忘记最后的点号,-t 设置生成image的名字,可自定义
执行后可通过docker images |grep web-todo查看已生成的image
执行
docker tag web-todo:latest 192.165.168.165/harbor/web-todo:v1
写自己的docker仓库地址,我是按照网上教程搭了一个harbor的仓库
然后将image推到仓库
docker push 192.165.168.165/harbor/web-todo:v1
springboot项目准备
我的后端项目框架是springboot+shiro+jpa+redis+mysql
项目比较简单,代码就不展示了
主要是记录k8s部署相关内容
maven打jar,通过FileZilla传输到linux虚拟机
在jar包所在目录新增Dockerfile文件,文件内容如下
#基础镜像,如果本地仓库没有,会从远程仓库拉取
FROM openjdk:8-jdk-alpine
#容器中创建目录
RUN mkdir -p /usr/local/hapo
#编译后的jar包copy到容器中创建到目录内
COPY ./todo-list-1.0-SNAPSHOT.jar /usr/local/hapo/app.jar
#指定容器启动时要执行的命令
ENTRYPOINT ["java","-jar","/usr/local/hapo/app.jar"]
todo-list-1.0-SNAPSHOT.jar是我的jar名称,其他可保持不变
然后按照上面docker打包上传的步骤上传到docker仓库
k8s容器部署两个项目
k8s管理项目主要是靠yaml,这次部署的todo-list.yaml如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-todo
namespace: default
labels:
app: web-todo
spec:
replicas: 2
selector:
matchLabels:
app: web-todo # has to match .spec.template.metadata.labels
template:
metadata:
labels:
app: web-todo # has to match .spec.selector.matchLabels
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: web-todo
image: 192.168.106.165/harbor/web-todo:v3
imagePullPolicy: Always
#args: [--spring.profiles.active=cluster]
ports:
- containerPort: 9000
name: web-todo
resources:
requests:
memory: 300Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 400m
---
kind: Service
apiVersion: v1
metadata:
name: web-todo
namespace: default
labels:
app: web-todo
spec:
type: NodePort
ports:
- port: 9000
nodePort: 30260 #service对外开放端口
selector:
app: web-todo
---
#ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: web-todo
# annotations:
# nginx.ingress.kubernetes.io/auth-type: basic
# nginx.ingress.kubernetes.io/auth-secret: basic-auth
# nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - hapo'
spec:
# tls:
# - hosts:
# - ling.hapo.com
# secretName: tls-secret
rules:
- host: ling.hapo.com
http:
paths:
- path:
backend:
serviceName: web-todo # 这里对应着service 的 名字
servicePort: 9000 # 对应着需要映射的service的端口
---
apiVersion: v1
kind: Service
metadata:
name: todo-list
namespace: default
labels:
app: todo-list
spec:
type: NodePort
ports:
- port: 8000
nodePort: 30160 #service对外开放端口
selector:
app: todo-list
---
apiVersion: apps/v1
kind: Deployment #对象类型
metadata:
name: todo-list #名称
labels:
app: todo-list #标注
spec:
replicas: 2 #运行容器的副本数,修改这里可以快速修改分布式节点数量
selector:
matchLabels:
app: todo-list
template:
metadata:
labels:
app: todo-list
spec:
imagePullSecrets:
- name: harbor-secret
containers: #docker容器的配置
- name: todo-list
image: 192.168.106.165/harbor/todo-list:v1 # pull镜像的地址 ip:prot/dir/images:tag
imagePullPolicy: IfNotPresent #pull镜像时机,
ports:
- containerPort: 8000 #容器对外开放端口
因为部署时使用了ingress,可以先按教程安装ingress
在master机器上添加yaml文件
执行命令
kubectl create -f todo-list.yaml
查看pod
如果pod都在running状态,项目就都起好了
在自己的电脑上配置host ,将ingress中的域名与master地址配置在hosts文件中
然后用域名就可以访问项目了,这步不可省略
前后端调用成功
遇到的问题
整个部署成功了,中间遇到了各种各样的问题,无法调用后端,docker仓库连不上等问题
中间harbor总是出现各种问题,docker login间歇性连不上
因为用的是笔记本,性能也不太好,又在上面加了三个虚拟机,所有性能可以预料到,我把harbor和k8s的master放到一个虚拟机上,端口占用问题,性能问题虚拟机会重启,docker login经常会失败,失败时请先查防火墙是否关闭,一定要看一下,如果防火墙不是永久关闭,重启之后防火墙会打开,一定要先排查这个问题!!!
再就是前后端无法调通的问题,我前端项目打了n次报,主要都是在改后端调用的地址,后端没有加https,我写过全地址(域名加端口号)这种在80端口调用的时候是没有问题的,但是用443端口的时候就会出现后端调用不是https的问题,后面就在default.conf加上了location /prod-api/那段配置,用nginx来连后端。
还有很多问题做的时候没有做记录,好不容易整个过程通了记录一下,怕后面再忘记。
更多推荐
所有评论(0)