240 lines
6.2 KiB
Markdown
240 lines
6.2 KiB
Markdown
# Kubernetes 部署指南
|
||
|
||
## 概述
|
||
|
||
本配置将若依微服务系统部署到 Kubernetes 集群,采用单命名空间架构,所有服务运行在 `ruoyi` 命名空间中。
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
k8s/
|
||
├── namespace.yaml # 命名空间
|
||
├── mysql-service.yaml # MySQL 服务
|
||
├── mysql-statefulset.yaml # MySQL 有状态部署
|
||
├── redis-service.yaml # Redis 服务
|
||
├── redis-statefulset.yaml # Redis 有状态部署
|
||
├── nacos-service.yaml # Nacos 服务
|
||
├── nacos-statefulset.yaml # Nacos 有状态部署
|
||
├── gateway-service.yaml # 网关服务
|
||
├── gateway-deployment.yaml # 网关部署
|
||
├── auth-service.yaml # 认证服务
|
||
├── auth-deployment.yaml # 认证部署
|
||
├── system-service.yaml # 系统模块服务
|
||
├── system-deployment.yaml # 系统模块部署
|
||
├── gen-service.yaml # 代码生成服务
|
||
├── gen-deployment.yaml # 代码生成部署
|
||
├── job-service.yaml # 定时任务服务
|
||
├── job-deployment.yaml # 定时任务部署
|
||
├── file-service.yaml # 文件服务
|
||
├── file-deployment.yaml # 文件部署
|
||
├── file-pvc.yaml # 文件存储卷
|
||
├── nginx-service.yaml # Nginx 服务
|
||
├── nginx-deployment.yaml # Nginx 部署
|
||
└── kustomization.yaml # Kustomize 配置
|
||
```
|
||
|
||
## 服务端口映射
|
||
|
||
| 服务 | 容器端口 | Service 名称 | 说明 |
|
||
| ---- | -------- | ------------ | ---- |
|
||
| MySQL | 3306 | ruoyi-mysql | 数据库 |
|
||
| Redis | 6379 | ruoyi-redis | 缓存 |
|
||
| Nacos | 8848/9848/9849 | ruoyi-nacos | 注册中心 |
|
||
| Gateway | 8080 | ruoyi-gateway | 网关(NodePort 30080) |
|
||
| Auth | 9200 | ruoyi-auth | 认证服务 |
|
||
| System | 9201 | ruoyi-system | 系统模块 |
|
||
| Gen | 9202 | ruoyi-gen | 代码生成 |
|
||
| Job | 9203 | ruoyi-job | 定时任务 |
|
||
| File | 9300 | ruoyi-file | 文件服务 |
|
||
| Nginx | 80 | ruoyi-nginx | 前端(NodePort 30080) |
|
||
|
||
## 前置条件
|
||
|
||
### 1. 安装 Kubernetes 集群
|
||
|
||
**选项 A: 使用 k3d(推荐)**
|
||
```bash
|
||
# 安装 k3d
|
||
brew install k3d
|
||
|
||
# 创建集群
|
||
k3d cluster create ruoyi --servers 1 --agents 2
|
||
|
||
# 验证
|
||
kubectl get nodes
|
||
```
|
||
|
||
**选项 B: 使用 minikube**
|
||
```bash
|
||
# 安装 minikube
|
||
brew install minikube
|
||
|
||
# 启动集群
|
||
minikube start --driver=docker --cpus=4 --memory=8192
|
||
|
||
# 验证
|
||
kubectl get nodes
|
||
```
|
||
|
||
### 2. 准备镜像
|
||
|
||
确保以下镜像已构建并可用:
|
||
- mysql-runtime
|
||
- redis-runtime
|
||
- nacos-runtime
|
||
- gateway-runtime
|
||
- ruoyi-auth-runtime
|
||
- ruoyi-modules-system-runtime
|
||
- ruoyi-modules-gen-runtime
|
||
- ruoyi-modules-job-runtime
|
||
- ruoyi-modules-file-runtime
|
||
- nginx-runtime
|
||
|
||
## 部署步骤
|
||
|
||
### 一键部署所有服务
|
||
|
||
```bash
|
||
# 进入 k8s 目录
|
||
cd k8s
|
||
|
||
# 使用 kustomize 部署所有资源
|
||
kubectl apply -k .
|
||
|
||
# 查看部署状态
|
||
kubectl get pods -n ruoyi
|
||
kubectl get svc -n ruoyi
|
||
```
|
||
|
||
## 访问服务
|
||
|
||
由于 Kubernetes 的 NodePort 限制(30000-32767),访问方式如下:
|
||
|
||
```bash
|
||
# Nginx 前端(通过 NodePort 30080)
|
||
http://localhost:30080
|
||
|
||
# 或者使用端口转发访问原始端口
|
||
kubectl port-forward -n ruoyi svc/ruoyi-nginx 80:80
|
||
# 然后访问 http://localhost:80
|
||
```
|
||
|
||
## 常用管理命令
|
||
|
||
### 查看资源状态
|
||
|
||
```bash
|
||
# 查看所有 Pod
|
||
kubectl get pods -n ruoyi
|
||
|
||
# 查看所有 Service
|
||
kubectl get svc -n ruoyi
|
||
|
||
# 查看 PVC 状态
|
||
kubectl get pvc -n ruoyi
|
||
|
||
# 查看详细信息
|
||
kubectl describe pod <pod-name> -n ruoyi
|
||
```
|
||
|
||
### 查看日志
|
||
|
||
```bash
|
||
# 查看 Pod 日志
|
||
kubectl logs <pod-name> -n ruoyi
|
||
|
||
# 实时查看日志
|
||
kubectl logs -f <pod-name> -n ruoyi
|
||
|
||
# 查看前 100 行日志
|
||
kubectl logs --tail=100 <pod-name> -n ruoyi
|
||
```
|
||
|
||
### 删除资源
|
||
|
||
```bash
|
||
# 删除所有资源
|
||
kubectl delete -k .
|
||
|
||
# 删除特定 Pod
|
||
kubectl delete pod <pod-name> -n ruoyi
|
||
|
||
# 删除整个命名空间(会删除所有资源)
|
||
kubectl delete namespace ruoyi
|
||
```
|
||
|
||
## 重要说明
|
||
|
||
### 1. Service 名称与 docker-compose 保持一致
|
||
|
||
所有 Service 名称都使用 `ruoyi-*` 前缀,与 docker-compose.yml 和 SQL 配置中的服务名保持一致:
|
||
- `ruoyi-mysql` - 对应 SQL 中的 `jdbc:mysql://ruoyi-mysql:3306`
|
||
- `ruoyi-redis` - 对应配置中的 `host: ruoyi-redis`
|
||
- `ruoyi-nacos` - 服务注册中心
|
||
- `ruoyi-gateway` - 网关服务
|
||
|
||
这样可以确保应用配置无需修改即可在 K8s 中运行。
|
||
|
||
### 2. 端口访问说明
|
||
|
||
- **容器端口**:与 docker-compose 保持一致(如 MySQL 3306, Redis 6379, Nginx 80)
|
||
- **NodePort**:由于 K8s 限制,NodePort 必须在 30000-32767 范围内
|
||
- **访问方式**:通过 NodePort 30080 访问,或使用 `kubectl port-forward` 映射到本地端口
|
||
|
||
### 3. 单命名空间架构
|
||
|
||
- 所有服务运行在 `ruoyi` 命名空间中
|
||
- 一个 K8s 集群只运行一套服务
|
||
- 没有端口冲突问题
|
||
- 适合开发、测试或单一生产环境
|
||
|
||
### 4. 持久化存储
|
||
|
||
- MySQL、Redis、Nacos 使用 StatefulSet + PVC 持久化数据
|
||
- File 服务使用 PVC 存储上传文件
|
||
- 删除 Pod 不会丢失数据
|
||
|
||
## Docker Compose vs Kubernetes 对比
|
||
|
||
| 特性 | Docker Compose | Kubernetes |
|
||
| ---- | -------------- | ---------- |
|
||
| 服务名 | ruoyi-mysql | ruoyi-mysql(保持一致) |
|
||
| 端口映射 | 80:80 | NodePort 30080 |
|
||
| 服务发现 | links/depends_on | Service + DNS |
|
||
| 负载均衡 | 无 | 自动负载均衡 |
|
||
| 自动重启 | restart: always | 自动重启 Pod |
|
||
| 扩缩容 | 手动修改 | kubectl scale |
|
||
| 持久化 | volumes | PVC |
|
||
| 配置管理 | environment | ConfigMap/Secret |
|
||
|
||
## 故障排查
|
||
|
||
### Pod 无法启动
|
||
|
||
```bash
|
||
# 查看 Pod 事件
|
||
kubectl describe pod <pod-name> -n ruoyi
|
||
|
||
# 查看 Pod 日志
|
||
kubectl logs <pod-name> -n ruoyi
|
||
```
|
||
|
||
### 服务无法访问
|
||
|
||
```bash
|
||
# 检查 Service 状态
|
||
kubectl get svc -n ruoyi
|
||
|
||
# 检查 Endpoints
|
||
kubectl get endpoints -n ruoyi
|
||
```
|
||
|
||
## 下一步优化建议
|
||
|
||
1. **添加健康检查**:为所有服务添加 livenessProbe 和 readinessProbe
|
||
2. **资源限制**:添加 resources.requests 和 resources.limits
|
||
3. **配置外部化**:使用 ConfigMap 管理应用配置文件
|
||
4. **Ingress 配置**:使用 Ingress 替代 NodePort 进行流量管理
|
||
5. **监控告警**:集成 Prometheus + Grafana 监控
|
||
|