a-cloud-all/k8s/02-redis/deploy.sh

167 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
DOCKER_DIR="../../docker"
echo "=========================================="
echo "部署 Redis"
echo "=========================================="
# 检查是否需要清理旧数据
echo ""
echo "检查现有 Redis 部署..."
if kubectl get statefulset redis -n ruoyi &> /dev/null; then
echo "⚠️ 检测到已存在的 Redis 部署"
echo ""
read -p "是否删除旧的 Redis 部署和数据?(y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "删除旧的 Redis StatefulSet..."
kubectl delete statefulset redis -n ruoyi --ignore-not-found=true
echo "删除旧的 Redis Service..."
kubectl delete service ruoyi-redis -n ruoyi --ignore-not-found=true
echo "删除旧的 PVC数据将被清空..."
kubectl delete pvc -l app=redis -n ruoyi --ignore-not-found=true
echo "等待资源清理完成..."
sleep 5
echo "✓ 旧数据清理完成"
else
echo "⚠️ 保留旧数据"
fi
fi
echo ""
# 步骤 1: 构建 Redis 镜像
echo "步骤 1: 构建 Redis 镜像..."
cd "$DOCKER_DIR"
docker-compose build --no-cache ruoyi-redis
if [ $? -eq 0 ]; then
echo "✓ Redis 镜像构建完成"
else
echo "✗ Redis 镜像构建失败"
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/redis-runtime-$$.tar"
echo "导出镜像到临时文件..."
docker save -o "$TEMP_IMAGE" redis-runtime
# 导入到 Minikube
echo "导入镜像到 Minikube..."
minikube image load "$TEMP_IMAGE" &
PID=$!
# 显示进度,最多等待 5 分钟
COUNT=0
MAX_COUNT=150
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 "✗ 镜像导入超时(超过 5 分钟)"
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: 等待 Redis Pod 启动..."
kubectl wait --for=condition=ready pod -l app=redis -n ruoyi --timeout=300s
if [ $? -ne 0 ]; then
echo "✗ Redis Pod 启动超时"
exit 1
fi
# 检查部署状态
echo ""
echo "=========================================="
echo "检查部署结果"
echo "=========================================="
# 检查 Pod 状态
echo "检查 Redis Pod 状态..."
POD_STATUS=$(kubectl get pods -n ruoyi -l app=redis -o jsonpath='{.items[0].status.phase}')
if [ "$POD_STATUS" == "Running" ]; then
echo "✓ Redis Pod 运行正常"
kubectl get pods -n ruoyi -l app=redis
else
echo "✗ Redis Pod 状态异常: $POD_STATUS"
kubectl get pods -n ruoyi -l app=redis
exit 1
fi
echo ""
# 检查 Service 状态
echo "检查 Redis Service 状态..."
if kubectl get svc ruoyi-redis -n ruoyi &> /dev/null; then
echo "✓ Redis Service 创建成功"
kubectl get svc -n ruoyi ruoyi-redis
else
echo "✗ Redis Service 创建失败"
exit 1
fi
echo ""
# 检查 PVC 状态
echo "检查 Redis PVC 状态..."
PVC_STATUS=$(kubectl get pvc -n ruoyi -l app=redis -o jsonpath='{.items[0].status.phase}')
if [ "$PVC_STATUS" == "Bound" ]; then
echo "✓ Redis PVC 绑定成功"
kubectl get pvc -n ruoyi -l app=redis
else
echo "✗ Redis PVC 状态异常: $PVC_STATUS"
kubectl get pvc -n ruoyi -l app=redis
exit 1
fi
echo ""
echo "=========================================="
echo "✓ Redis 部署完成!"
echo "=========================================="
echo ""
echo "连接信息:"
echo " Service: ruoyi-redis.ruoyi.svc.cluster.local"
echo " 端口: 6379"
echo ""
exit 0