# 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 -n ruoyi ``` ### 查看日志 ```bash # 查看 Pod 日志 kubectl logs -n ruoyi # 实时查看日志 kubectl logs -f -n ruoyi # 查看前 100 行日志 kubectl logs --tail=100 -n ruoyi ``` ### 删除资源 ```bash # 删除所有资源 kubectl delete -k . # 删除特定 Pod kubectl delete pod -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 -n ruoyi # 查看 Pod 日志 kubectl logs -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 监控