a-cloud-all/k8s/README.md

6.2 KiB
Raw Blame History

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推荐

# 安装 k3d
brew install k3d

# 创建集群
k3d cluster create ruoyi --servers 1 --agents 2

# 验证
kubectl get nodes

选项 B: 使用 minikube

# 安装 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

部署步骤

一键部署所有服务

# 进入 k8s 目录
cd k8s

# 使用 kustomize 部署所有资源
kubectl apply -k .

# 查看部署状态
kubectl get pods -n ruoyi
kubectl get svc -n ruoyi

访问服务

由于 Kubernetes 的 NodePort 限制30000-32767访问方式如下

# Nginx 前端(通过 NodePort 30080
http://localhost:30080

# 或者使用端口转发访问原始端口
kubectl port-forward -n ruoyi svc/ruoyi-nginx 80:80
# 然后访问 http://localhost:80

常用管理命令

查看资源状态

# 查看所有 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

查看日志

# 查看 Pod 日志
kubectl logs <pod-name> -n ruoyi

# 实时查看日志
kubectl logs -f <pod-name> -n ruoyi

# 查看前 100 行日志
kubectl logs --tail=100 <pod-name> -n ruoyi

删除资源

# 删除所有资源
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 无法启动

# 查看 Pod 事件
kubectl describe pod <pod-name> -n ruoyi

# 查看 Pod 日志
kubectl logs <pod-name> -n ruoyi

服务无法访问

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