#!/bin/bash set -e DOCKER_DIR="../../docker" echo "==========================================" echo "部署 Nacos" echo "==========================================" # 检查是否需要清理旧数据 echo "" echo "检查现有 Nacos 部署..." if kubectl get statefulset nacos -n ruoyi &> /dev/null; then echo "⚠️ 检测到已存在的 Nacos 部署" echo "" read -p "是否删除旧的 Nacos 部署和数据?(y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "删除旧的 Nacos StatefulSet..." kubectl delete statefulset nacos -n ruoyi --ignore-not-found=true echo "删除旧的 Nacos Service..." kubectl delete service ruoyi-nacos -n ruoyi --ignore-not-found=true echo "删除旧的 PVC(数据将被清空)..." kubectl delete pvc -l app=nacos -n ruoyi --ignore-not-found=true echo "等待资源清理完成..." sleep 5 echo "✓ 旧数据清理完成" else echo "⚠️ 保留旧数据" fi fi echo "" # 步骤 1: 构建 Nacos 镜像 echo "步骤 1: 构建 Nacos 镜像..." cd "$DOCKER_DIR" docker-compose build --no-cache ruoyi-nacos if [ $? -eq 0 ]; then echo "✓ Nacos 镜像构建完成" else echo "✗ Nacos 镜像构建失败" exit 1 fi # 步骤 1.5: 检测环境并导入镜像(仅 Minikube 需要) echo "" if command -v minikube &> /dev/null && minikube status &> /dev/null; then echo "检测到 Minikube 环境,导入镜像(可能需要 1-2 分钟)..." # 先导出镜像到临时文件 TEMP_IMAGE="/tmp/nacos-runtime-$$.tar" echo "导出镜像到临时文件..." docker save -o "$TEMP_IMAGE" nacos-runtime # 导入到 Minikube echo "导入镜像到 Minikube..." minikube image load "$TEMP_IMAGE" & PID=$! # 显示进度,最多等待 10 分钟 COUNT=0 MAX_COUNT=300 while kill -0 $PID 2>/dev/null; do echo -n "." sleep 2 COUNT=$((COUNT + 1)) if [ $COUNT -ge $MAX_COUNT ]; then kill $PID 2>/dev/null echo "" echo "✗ 镜像导入超时(超过 10 分钟)" exit 1 fi done wait $PID EXIT_CODE=$? echo "" if [ $EXIT_CODE -eq 0 ]; then echo "✓ 镜像导入到 Minikube 完成" else echo "✗ 镜像导入失败" rm -f "$TEMP_IMAGE" exit 1 fi # 清理临时文件 rm -f "$TEMP_IMAGE" else echo "检测到 k3s/k8s 环境,跳过镜像导入(使用本地 Docker 镜像)" fi # 步骤 2: 部署到 K8s echo "" echo "步骤 2: 部署到 Kubernetes..." cd - kubectl apply -f service.yaml kubectl apply -f statefulset.yaml # 步骤 3: 等待 Pod 启动 echo "" echo "步骤 3: 等待 Nacos Pod 启动..." kubectl wait --for=condition=ready pod -l app=nacos -n ruoyi --timeout=300s if [ $? -ne 0 ]; then echo "✗ Nacos Pod 启动超时" exit 1 fi # 检查部署状态 echo "" echo "==========================================" echo "检查部署结果" echo "==========================================" # 检查 Pod 状态 echo "检查 Nacos Pod 状态..." POD_STATUS=$(kubectl get pods -n ruoyi -l app=nacos -o jsonpath='{.items[0].status.phase}') if [ "$POD_STATUS" == "Running" ]; then echo "✓ Nacos Pod 运行正常" kubectl get pods -n ruoyi -l app=nacos else echo "✗ Nacos Pod 状态异常: $POD_STATUS" kubectl get pods -n ruoyi -l app=nacos exit 1 fi echo "" # 检查 Service 状态 echo "检查 Nacos Service 状态..." if kubectl get svc ruoyi-nacos -n ruoyi &> /dev/null; then echo "✓ Nacos Service 创建成功" kubectl get svc -n ruoyi ruoyi-nacos else echo "✗ Nacos Service 创建失败" exit 1 fi echo "" # 检查 PVC 状态 echo "检查 Nacos PVC 状态..." PVC_STATUS=$(kubectl get pvc -n ruoyi -l app=nacos -o jsonpath='{.items[0].status.phase}') if [ "$PVC_STATUS" == "Bound" ]; then echo "✓ Nacos PVC 绑定成功" kubectl get pvc -n ruoyi -l app=nacos else echo "✗ Nacos PVC 状态异常: $PVC_STATUS" kubectl get pvc -n ruoyi -l app=nacos exit 1 fi echo "" echo "==========================================" echo "✓ Nacos 部署完成!" echo "==========================================" echo "" echo "连接信息:" echo " Service: ruoyi-nacos.ruoyi.svc.cluster.local" echo " HTTP 端口: 8848" echo " Client RPC 端口: 9848" echo " Raft RPC 端口: 9849" echo "" exit 0