Kubernetes(K8S) + Harbor + Ingress 部署 SpringBoot + Vue 前后端分离项目
文章目录
- 1、环境准备
- 2、搭建 K8S
- 3、搭建 Harbor
- 4、搭建 MySQL
- 5、构建 SpringBoot 项目镜像
- 6、构建 Vue.js 项目镜像
- 7、部署项目
- 7.1、配置 NameSpace
- 7.2、配置 Deployment、Service
- 7.3、配置 Ingress-Nginx
- 7.4、访问测试
1、环境准备
本次整体项目部署使用的是阿里云ECS服务器
,服务器地区选择的是香港
(选择香港的原因 7.2 章节
Ingress 域名解析用的是阿里云的真实域名地址,如果地区是大陆服务器还需要域名备案
),整体部署配置如下:
- 服务器1:
- 部署:K8S Master
- 配置:CentOS 7.9,4核8G
- 服务器2:
- 部署:K8S Worker 1
- 配置:CentOS 7.9,4核8G
- 服务器3:
- 部署:K8S Worker 2
- 配置:CentOS 7.9,4核8G
- 服务器4:
- 部署:MySQL + Harbor
- 配置:CentOS 7.9,2核4G
- 开放端口:80、8080、3306、9999
整体部署架构图如下:
2、搭建 K8S
在服务器1,2,3搭建1主2从
K8S集群,详细部署流程参照下述文章链接:https://xuzhibin.blog.csdn.net/article/details/139649056
3、搭建 Harbor
在服务器4上,进行Harbor
部署,参考该链接:
https://blog.csdn.net/weixin_46594796/article/details/143113896
Harbor
搭建完毕后,要在 Harbor 中创建一个项目名为test
,留着后面操作 Docker
镜像使用:
4、搭建 MySQL
本次部署的前端项目、后端项目、数据库脚本我已经上传到了 Github 上,请自行下载:
https://github.com/Binx98/test-project
在服务器4上,创建启动 MySQL
数据库容器:
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0
通过 Navicat
连接到创建好的 MySQL(账号密码都是root),先创建 test
数据库,然后将上面提供的 MySQL 数据初始化脚本 init.sql
执行加载完毕,数据导入成功后如下图:
5、构建 SpringBoot 项目镜像
通过 IDEA 打开后端项目,记得调整一下配置文件,将MySQL URL
调整为部署MySQL的内网IP
地址:
在 IDEA 控制台上,通过 Maven
完成 SpringBoot 项目打包
操作:
mvn clean package -Dmaven.test.skip=true
打包完毕后,可以看到 target 目录下生成的 Jar 文件:
将JAR包上传到服务器4的 /opt
目录上,然后在 /opt
目录上编写 BackendDockerfile
文件,用于 JAR 包镜像构建,BackendDockerfile
内容如下:
# 基础镜像
FROM openjdk:17
# 宿主机文件 COPY 镜像
ADD backend-project.jar /backend-project.jar
# 容器启动时执行(类似CMD)
ENTRYPOINT ["java", "-jar", "backend-project.jar"]
然后在服务器4的/opt
目录下,进行镜像构建,命令如下:
cd /opt
docker build -f BackendDockerfile -t backend-project .
镜像构建完毕后,通过下述命令启动镜像,判断是否打包成功:
docker run -d -p 8080:8080 backend-project
最后通过 公网IP地址:8080/api
访问测试接口,可以查看到后端服务部署成功:
然后将该 SpringBoot项目
镜像推送到 Harbor
当中:
# 登录 Harbor,账号密码:admin/Harbor12345
docker login 服务器4内网IP:9999# 为镜像打标签
docker tag backend-project:latest 服务器4内网IP:9999/test/backend-project:1.0# 推送镜像到 Harbor
docker push 服务器4内网IP:9999/test/backend-project:1.0
镜像上传完毕后,可以在 Harbor 的 test 项目中查看刚刚上传的镜像:
6、构建 Vue.js 项目镜像
在构建镜像之前,先要调整一下 Vue.js
项目的后端接口URL配置信息(.env.production
),使用域名/api
,我的域名是k8s.joydevelop.com
:
调整完毕后,将 Vue.js
项目进行打包操作,控制台执行下述命令:
npm run build:prod
然后将打包后的 dist
文件上传到服务器4 /opt
目录,然后在 /opt 目录上编写 FrontendDockerfile
文件,用于 Vue.js 项目镜像构建:
# 基础镜像 Nginx
FROM nginx# 拷贝当前目录的文件到指定文件夹下,改文件夹为镜像中的文件夹
COPY ./dist /usr/share/nginx/html# 拷贝nginx.conf文件到镜像下,替换掉原有的nginx.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
接着在服务器4 /opt
目录下,创建 nginx.conf
文件,内容如下(记得调整内网IP地址):
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;try_files $uri $uri/ /index.html;index index.html index.htm;}location /api/ {proxy_http_version 1.1;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_set_header Connection "";# 这里用的是 K8S Service 服务名访问方式(先按照我这么写!)proxy_pass http://backend-service.prod-env.svc.cluster.local:8080;}}
}
执行下述命令,完成 Vue.js
镜像构建:
cd /opt
docker build -f FrontendDockerfile -t frontend-project .
最后,将构建好的 Vue.js
镜像上传到 Harbor
中:
# 为镜像打标签
docker tag frontend-project:latest 服务器4内网IP:9999/test/frontend-project:1.0# 推送镜像到 Harbor
docker push 服务器4内网IP:9999/test/frontend-project:1.0
镜像上传完毕后,可以在 Harbor
的 test
项目中查看刚刚上传的镜像:
7、部署项目
注意:在项目部署之前,先要保证K8S
每一台服务器(服务器1,2,3)的/etc/docker/daemon.json
都配置上了 Harbor 的内网IP和端口号,否则会导致K8S集群无法成功拉取Harbor私有镜像:
{"registry-mirrors": ["https://8er86g8v.mirror.aliyuncs.com","https://docker.1panel.live/"],"insecure-registries": ["服务器4内网IP:9999"]
}
然后服务器1,2,3
通过下述命令重新加载配置:
systemctl daemon-reload && systemctl restart docker
7.1、配置 NameSpace
命名空间namespace
主要是用于 K8S 集群中资源隔离的,所以在这里我为项目创建一个命名空间prod-env
,命令如下:
kubectl create ns prod-env
7.2、配置 Deployment、Service
具体配置内容如下,注释写的很清楚,不多解释啦!
前端部署配置 frontend.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:# Deployment 名称name: frontend-deployment# 命名空间namespace: prod-envlabels:app: frontend-label
spec:# 生成 Pod 数量replicas: 3# Pod 标签选择器,用于匹配管理selector:matchLabels:app: frontend-labeltemplate:# Pod 标签,必须与 selector 匹配metadata:labels:app: frontend-labelspec:containers:# 容器名- name: frontend# Harbor 前端镜像地址image: 服务器4内网IP:9999/test/frontend-project:1.0imagePullPolicy: Always# 容器端口ports:- containerPort: 80# 指定容器的资源请求和限制resources:requests:memory: 300Micpu: 200mlimits:memory: 500Micpu: 400m---kind: Service
apiVersion: v1
metadata:name: frontend-servicenamespace: prod-envlabels:app: frontend-label
spec:selector:app: frontend-label# Service 类型:ClusterIP、NodePort、LoadBalancer# 这里使用 ClusterIP,代表只在集群内部通讯(实际企业中也是用 ClusterIP)# NodePort可以将Service对外暴露访问(一般没人用)type: ClusterIPports:- protocol: TCP# 容器端口port: 80# Service 端口targetPort: 80
后端部署配置 backend.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:name: backend-deploymentnamespace: prod-envlabels:app: backend-label
spec:replicas: 3selector:matchLabels:app: backend-labeltemplate:metadata:labels:app: backend-labelspec:containers:- name: backendimage: 服务器4内网IP:9999/test/backend-project:1.0imagePullPolicy: Alwaysports:- containerPort: 8080resources:requests:memory: 300Micpu: 200mlimits:memory: 500Micpu: 400m---kind: Service
apiVersion: v1
metadata:name: backend-servicenamespace: prod-envlabels:app: backend-label
spec:selector:app: backend-labeltype: ClusterIPports:- protocol: TCPport: 8080targetPort: 8080
最后,通过下述命令对前端、后端项目
进行启动:
kubectl apply -f frontend.yaml && kubectl apply -f backend.yaml
7.3、配置 Ingress-Nginx
直接通过 K8S Service 的 NordPort
模式可以完成服务对外提供访问的要求,但是真正企业级场景来说,更多的是使用 Ingress-Nginx
构建应用入口,所以这里还需要部署一下 Ingress-Nginx
,请参考下述连接部署:https://xuzhibin.blog.csdn.net/article/details/143227591
按照上述部署完毕后其实有个问题,我们需要保证ingress-nginx-controller
部署在 Master
节点上,否则无法进行正确的访问,所以还需要修改Ingress部署配置文件
的一处位置,让其部署在主节点上:
修改完毕后,重新卸载安装 Ingress-Nginx
:
# 删除 Ingress-Nginx
kubectl delete -f ingress-deploy.yaml# 安装 Ingress-Nginx
kubectl apply -f ingress-deploy.yaml
此时可以看到,ingress-nginx-controller
部署在 k8s-master
上了:
部署完毕后,接下来要做的是配置一下 ingress-project.yaml
完成访问配置,由于我的服务器都在香港地区,所以这次我就用真实的域名解析到我的主服务器IP上(没有可用于名,就得通过修改 hosts 文件使用假域名测试了),配置内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:# Ingress-Nginx 名称name: my-ingressnamespace: prod-env
spec:# Ingress ClassingressClassName: nginx# 路由规则rules:# 域名- host: k8s.joydevelop.comhttp:paths:# 访问域名根路径,就会路由到 front-service 服务上- path: /pathType: Prefixbackend:service:# 前端服务名称name: frontend-service# 服务端口port:number: 80# 后端服务 Service 就不用暴露了,不需要直接把后端接口给别人调用啊!
# - path: /api
# pathType: Prefix
# backend:
# service:
# name: backend-service
# port:
# number: 8080
然后通过下述命令进行 Ingress-Nginx
创建启动:
kubectl apply -f ingress-project.yaml
7.4、访问测试
最后,在浏览器上通过访问域名,可以看到 K8S 部署 SpringBoot + Vue.js 项目成功!
相关文章:
Kubernetes(K8S) + Harbor + Ingress 部署 SpringBoot + Vue 前后端分离项目
文章目录 1、环境准备2、搭建 K8S3、搭建 Harbor4、搭建 MySQL5、构建 SpringBoot 项目镜像6、构建 Vue.js 项目镜像7、部署项目7.1、配置 NameSpace7.2、配置 Deployment、Service7.3、配置 Ingress-Nginx7.4、访问测试 1、环境准备 本次整体项目部署使用的是阿里云ECS服务器…...
【iOS】知乎日报第一周总结
知乎日报第一周总结 文章目录 知乎日报第一周总结前言网络异步导致视图无法加载加载网络上的图片实现一个上拉刷新的效果左上角的时间初步实现了点击cell进入网页小结 前言 笔者在本周算是正式开始写项目了,本周主要是大致完成了主页的内容,大致完成了主…...
Springboot整合spring-boot-starter-data-elasticsearch
前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖,旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch,提供了一套完整…...
【大模型系列】mPLUG-Owl3(2024.08)
Paper: https://arxiv.org/pdf/2408.04840Github: https://github.com/X-PLUG/mPLUG-OwlHuggingFace:https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728Author: Jiabo Ye et al. 阿里巴巴 文章目录 0 总结(省流版)1 模型结构1.1 Cross-attention Based Achitectur…...
从0到1学习node.js(express模块)
文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习,根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…...
MambaVision
核心速览 研究背景 研究问题 :这篇文章提出了一种新的混合Mamba-Transformer骨干网络,称为MambaVision,专为视 觉应用量身定制。研究的核心问题是如何有效地结合Mamba的状态空间模型(SSM)和Transf ormer的自注意力机制…...
MySQLDBA修炼之道-开发篇(二)
四、开发进阶 1. 范式和反范式 范式是数据库规范化的一个手段,是数据库设计中的一系列原理和技术,用于减少数据库中的数据冗余,并增进数据的一致性。 范式 1.1 第一范式 第一范式是指数据库表的每一列(属性)都是不可…...
前端必备的环境搭建
一、nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置) 参考地址:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)-CSDN博客 说明: 1)关于nodejs目录不显示&a…...
SpringCloud笔记
什么是降级熔断?为什么要进行熔断? 熔断降级是一种分布式系统的保护机制,用于应对服务不稳定或不可用的情况。 熔断是指当某个服务的调用失败次数或异常比例达到一定阈值时,自动切断对该服务的调用,让请求快速失败&…...
优秀的程序员思考数据结构
原文地址:https://read.engineerscodex.com/p/good-programmers-worry-about-data 我最近在这篇很棒的 Stack Overflow 文章中看到了 Linus Torvalds(Linux 和 Git 的创建者)的一句话。(这篇文章回顾了那篇文章中的许多引述。 它…...
「C/C++」C/C++标准库之#include<cstdlib>通用工具库
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
Oracle视频基础1.1.3练习
1.1.3 需求: 完整格式查看所有用户进程里的oracle后台进程 查看物理网卡,虚拟网卡的ip地址 ps -ef | grep oracle /sbin/ifconfig要以完整格式查看所有用户进程中的 Oracle 后台进程,并查看物理和虚拟网卡的 IP 地址,可以使用以下…...
python项目实战——多协程下载美女图片
协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …...
基于.NET 8.0,C#中Microsoft.Office.Interop.Excel来操作office365的excel
开发环境: Visual Studio 2022 office365 项目模板:WPF应用程序 框架:.NET 8.0 依赖:Microsoft.Office.Interop.Excel 注意: 1.使用Microsoft.Office.Interop.Excel库时,服务器或电脑里面必须安装得…...
使用无线方式连接Android设备进行调试的两种方法
1.使用配对码配对设备方式 手机(或者平板等安卓设备)和电脑需连接在同一WiFi 下;保证 SDK 为最新版本(adb --version ≥ 30.0.0); step1.手机启用开发者选项和无线调试模式(会提示确认ÿ…...
Valgrind的使用
Valgrind 是一个强大的开源工具,用于检测程序中的内存错误、内存泄漏以及线程问题。它广泛应用于 C/C++ 等需要手动管理内存的编程语言中。以下内容将详细介绍 Valgrind 的安装、基本使用方法、常用命令及其输出结果的解析。 1. 什么是 Valgrind? Valgrind 是一个用于内存调…...
微信小程序瀑布流实现,瀑布流长度不均等解决方法
这是一开始实现的瀑布流,将数据分为奇数列和偶数列 <view class"content-left"><block wx:for"{{list}}" wx:key"list"><template isitem-data data{{...item}} wx:if"{{index % 2 0}}"></template&…...
Notepad++通过自定义语言实现日志按照不同级别高亮
借助Notepad的自定义语言可以实现日志的按照不同级别的高亮; 参考: https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下: xml文件: <NotepadPlus><UserLang name"Ansibl…...
2024年四川省大学生程序设计竞赛 补题记录
文章目录 Problem A. 逆序对染色(思维树状数组)Problem B. 连接召唤(贪心)Problem E. L 型覆盖检查器(模拟)Problem F. 小球进洞:平面版(几何)Problem G. 函数查询Proble…...
17_事件的处理
目录 绑定事件与解绑事件优化事件的绑定和解绑方式处理不同事件类型的绑定处理同一事件类型多个事件处理函数事件冒泡与更新时机问题 绑定事件与解绑事件 既然要处理事件,那么首先面临的问题是如何在 vnode 中描述这个事件,在 vnode.props 中࿰…...
1FreeRTOS学习(队列、二值信号量、计数型信号量之间的相同点和不同点)
相同点: (1)传递区间 队列、二值信号量、计数型信号量均可用在任务与任务,任务与中断之间进行消息传递 (2) 传递方式 创建队列--发送队列--接受队列 创建二值信号量--发送二值信号量--接受二值信号量 创建计…...
数据库设计与范式及其应用
数据库设计是数据库管理系统(DBMS)中的核心环节,良好的数据库设计不仅可以提高数据存取的效率,还能增强数据的可维护性和一致性。范式(Normalization)是一种设计原则,用于减少数据冗余和提高数据…...
笔记-配置PyTorch(CUDA 12.2)
文章目录 前言一、安装 PyTorch(CUDA 12.2)1. 创建并激活 Conda 环境2. 安装 PyTorch(CUDA 12.2)3. 安装 torch_geometric 及依赖项4. 验证安装 总结 前言 一、安装 PyTorch(CUDA 12.2) 1. 创建并激活 Con…...
[C++]——红黑树(附源码)
目录 一、前言 二、正文 2.1 红黑树的概念 2.2 红黑树的性质 2.3红黑树节点的定义 2.4 红黑树的插入 2.4.1 情况一 2.4.2 情况二 编辑 2.4.3 情况三 2.5 红黑树的验证 三、全部代码 四、结语 一、前言 在上一篇博客中,为小伙伴们进行了AVL树的讲解&#…...
网络文件系统搭建
在CentOS7上搭建网络文件系统(NFS),并让客户端进行挂载,具体步骤如下: 1. 服务器端操作 安装NFS服务器软件包: 执行以下命令安装NFS服务: sudo yum install nfs-utils -y 启动并启用NFS服务&…...
基于vue、VantUI、django的程序设计
首先构建vue项目,构建项目点这里 安装 npm install axios axios简介 Axios 是一个基于 promise 的 HTTP 库,用于发起请求和接收响应,实现异步操作 基本使用 axios对象 请求响应拦截 在utils文件夹里新建ajax.js 创建一个axios对象并…...
京准电钟解读:NTP网络对时服务器助力厂区改造方案
京准电钟解读:NTP网络对时服务器助力厂区改造方案 京准电钟解读:NTP网络对时服务器助力厂区改造方案 1)系统概述 时钟系统可通过网络进行管理及时间校对,为厂区提供高精度、全天时、全天候 的授时服务,统一全厂各种系统…...
本地docker-compose仓库搭建以及推送docker镜像到仓库
前言 以下部分知识只适用于linux,不适合小白,请自行甄别执行 1.搭建 #参考 https://blog.csdn.net/u011535199/article/details/107457275 version: 3 services:registry:restart: alwaysimage: registry:2ports:- 5000:5000environment:#REGISTRY_HT…...
WPF+MVVM案例实战(八)- 自定义开关控件封装实现
文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现 3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现 4、源代码获取 1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleBut…...
单机kafka性能需要高性能的硬件做支撑
一般来说,单机kafka在硬件支持的情况下,能支持每秒100万写入,如果硬件没有那么好的话(机械硬盘,容器内给内存8G, CPU也不是很好),就只能减少每秒的写入量,每秒写入5万都比较不错了。 如果强行每…...
有关网站建设的视频/seo外链专员
转自: 这段时间,因为项目要上线,所以要进行压力测试,这就牵涉到要测试系统性能问题,查看JVM的使用情况是必不可少的,不然上生产后造成内存泄露就over了。服务器用的是阿里云的云服务器,预装的C…...
哪些网站是用c语言做的/网络广告策划的内容
# 1:给定一个数,判断他是正数,负数,还是0 a int(input("请输入一该个整数")) if a 0:print(a, "是0") elif a > 0:print(a, "是正数") else:print(a, "是负数")# 练习2:…...
网站开发的网站/友链外链app
概念性规划方案温州落地项目: 温州电动汽车综合充换电站建设、温州年产15000吨用优质钛材料建设项目、温州塑料颗粒加工、温州养殖500头牛项目、温州新建丹东塔醋、无添加剂酱油及豆瓣酱生产、温州豆腐厂豆制品加工建设项目。 您不必担忧不在一个城市不好沟通&#…...
国内人做韩国网站一般都卖什么东西/怎么引流到微信呢
开门见山。这篇文章,教大家用Python实现常用的假设检验!服从什么分布,就用什么区间估计方式,也就就用什么检验!比如:两个样本方差比服从F分布,区间估计就采用F分布计算临界值(从而得出置信区间)…...
推广平台软件/南宁seo推广优化
一、原型 任何对象都有一个原型对象,这个原型对象由对象的内置属性_proto_指向它的构造函数的prototype指向的对象 即任何对象都是由一个构造函数创建的,但是,不是每一个对象都有prototype,只有方法才有prototype。 function Per…...
网站在线沟通工具/网站首页排名seo搜索优化
深海迷航秘籍怎么用?深海迷航游戏中使用秘籍可以快速的完成任务,增加物品收益,本文带来了秘籍代码及使用方法,有需要的玩家欢迎收藏。下面就一起来看看深海迷航秘籍代码大全吧。f3 f8同时打开,勾选掉禁用控制台选项&am…...