下面是一个详细的部署指南,介绍如何使用 Kubernetes(K8s)+ Harbor + Ingress 来部署一个 SpringBoot + Vue 前后端分离项目。此教程涵盖从镜像打包、上传 Harbor、K8s 部署、Ingress 配置到前后端联调的完整流程,适合 DevOps 工程师和云原生开发者。
🧩 目录
- 环境准备
- Harbor 镜像仓库配置
- 构建前后端镜像并推送到 Harbor
- K8s 编写 Deployment & Service(SpringBoot + Vue)
- 配置 Ingress 实现外网访问
- 前后端联调与跨域处理
- HTTPS 与域名配置(可选)
- 常见问题排查
- 参考资料与出站链接
1️⃣ 环境准备
- 已安装 Kubernetes 集群(可使用 Minikube, K3s, 或生产环境 K8s)
- 安装并配置好 Harbor
- 安装 Ingress Controller(如 Nginx Ingress)
kubectl
,docker
,helm
,node
,npm
,maven
环境可用
2️⃣ Harbor 镜像仓库配置
Harbor 是私有镜像仓库。我们用它来存储 SpringBoot 和 Vue 构建好的 Docker 镜像。
步骤:
- 访问 Harbor UI 创建项目(如:
myproject
) - 配置
~/.docker/config.json
登录 Harbor:
docker login harbor.mydomain.com
- 设置 Harbor 支持 HTTP(测试用)或启用 HTTPS(推荐)
- 可在
kubelet
配置中添加 Harbor 认证,以便 K8s 自动拉取私有镜像
3️⃣ 构建前后端镜像并推送到 Harbor
🅰️ SpringBoot 构建后端镜像
Dockerfile:
FROM openjdk:17
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
构建并推送:
mvn clean package -DskipTests
docker build -t harbor.mydomain.com/myproject/backend:1.0 .
docker push harbor.mydomain.com/myproject/backend:1.0
🅱️ Vue 构建前端镜像
Dockerfile:
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
构建并推送:
npm install
npm run build
docker build -t harbor.mydomain.com/myproject/frontend:1.0 .
docker push harbor.mydomain.com/myproject/frontend:1.0
4️⃣ Kubernetes 部署 SpringBoot + Vue
🅰️ 后端 Deployment + Service
backend-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: harbor.mydomain.com/myproject/backend:1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080
🅱️ 前端 Deployment + Service
frontend-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: vue-frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: harbor.mydomain.com/myproject/frontend:1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
5️⃣ 配置 Ingress 实现外网访问
需要安装 Ingress 控制器(如 Nginx Ingress):
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.4/deploy/static/provider/cloud/deploy.yaml
ingress.yaml
配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: project-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: vue.mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- host: api.mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 80
配置 DNS 或 hosts:
echo "127.0.0.1 vue.mydomain.com api.mydomain.com" >> /etc/hosts
6️⃣ 前后端联调与跨域处理
方法一:Vue dev 模式代理
// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://api.mydomain.com',
changeOrigin: true
}
}
}
}
方法二:SpringBoot 添加 CORS 配置
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true);
}
};
}
}
7️⃣ HTTPS 与域名配置(可选)
使用 Cert-Manager 自动申请 Let’s Encrypt 证书:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
配置 Ingress
增加 TLS 支持。
8️⃣ 常见问题排查
问题 | 解决方式 |
---|---|
Harbor 无法拉取镜像 | 确认 imagePullSecret 配置、Harbor 是否为 HTTPS |
前端无法访问后端 API | 检查 CORS、代理设置、Ingress 路由是否配置正确 |
Ingress 404 / backend 服务未通 | 查看 kubectl describe ingress 输出,确认 service 名称、端口匹配 |
Kubernetes 报 Unauthorized | 确认 kubeconfig 配置,或者 kubectl 是否有权限 |
容器 CrashLoopBackOff | 查看 pod 日志:kubectl logs <pod> 获取详细信息 |
📘 参考资料与出站链接
如果你需要我继续提供 Helm Chart 封装、自动 CI/CD(如 GitLab CI)、使用 Kustomize 管理环境等进阶内容,请告诉我,我可以为你生成后续教程。
发表回复