# 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 监控

