#!/bin/bash # 灵境万象系统 - 一键部署到 Kubernetes v1.0.0 # Created Time: 2025-11-26 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}=========================================${NC}" echo -e "${BLUE}🚀 灵境万象系统 - K8s 一键部署 v1.0.0${NC}" echo -e "${BLUE}=========================================${NC}" echo "" # 加载版本配置 if [ -f "monitoring-versions.env" ]; then source monitoring-versions.env echo -e "${GREEN}✅ 已加载版本配置文件${NC}" else echo -e "${YELLOW}⚠️ 未找到版本配置文件,使用默认配置${NC}" LJWX_VERSION="2.0.3" LJWX_MYSQL_VERSION="2.0.3" LJWX_REDIS_VERSION="2.0.3" LJWX_BOOT_VERSION="2.0.3" LJWX_BIGSCREEN_VERSION="2.0.3" LJWX_ADMIN_VERSION="2.0.3" fi # 配置参数 NAMESPACE="${K8S_NAMESPACE:-ljwx-system}" REGISTRY="${PRIVATE_REGISTRY:-localhost:15000}" IMAGE_PREFIX="ljwx" K8S_DIR="./k8s" # 运行模式 BUILD_IMAGES="${BUILD_IMAGES:-true}" # 是否构建镜像 PUSH_IMAGES="${PUSH_IMAGES:-true}" # 是否推送镜像 CREATE_NAMESPACE="${CREATE_NAMESPACE:-true}" # 是否创建命名空间 DEPLOY_MYSQL="${DEPLOY_MYSQL:-true}" # 是否部署 MySQL DEPLOY_REDIS="${DEPLOY_REDIS:-true}" # 是否部署 Redis DEPLOY_APPS="${DEPLOY_APPS:-true}" # 是否部署应用 # MySQL 配置 MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-123456}" MYSQL_DATABASE="${MYSQL_DATABASE:-lj-06}" MYSQL_USER="${MYSQL_USER:-root}" # Redis 配置 REDIS_PASSWORD="${REDIS_PASSWORD:-123456}" # 打印带颜色的消息 print_info() { echo -e "${BLUE}ℹ ${NC}$1" } print_success() { echo -e "${GREEN}✅${NC} $1" } print_warning() { echo -e "${YELLOW}⚠️${NC} $1" } print_error() { echo -e "${RED}❌${NC} $1" } print_header() { echo "" echo -e "${BLUE}=========================================${NC}" echo -e "${BLUE}$1${NC}" echo -e "${BLUE}=========================================${NC}" } # 检查必要工具 check_prerequisites() { print_header "检查前置条件" # 检查 kubectl if ! command -v kubectl &> /dev/null; then print_error "kubectl 未安装,请先安装 kubectl" exit 1 fi print_success "kubectl 已安装" # 检查 K8s 集群连接 if ! kubectl cluster-info &> /dev/null; then print_error "无法连接到 Kubernetes 集群" print_info "请检查 kubectl 配置: kubectl config view" exit 1 fi print_success "Kubernetes 集群连接正常" # 显示集群信息 CLUSTER_NAME=$(kubectl config current-context) print_info "当前集群: $CLUSTER_NAME" # 检查 Docker if ! command -v docker &> /dev/null; then print_error "Docker 未安装,请先安装 Docker" exit 1 fi print_success "Docker 已安装" # 检查本地 Registry if curl -s -f --max-time 3 "http://$REGISTRY/v2/_catalog" > /dev/null 2>&1; then print_success "本地 Registry 运行正常 ($REGISTRY)" else print_warning "本地 Registry 未运行,将无法推送镜像" read -p "是否继续(使用已有镜像)? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi BUILD_IMAGES=false PUSH_IMAGES=false fi } # 创建 K8s 配置目录 create_k8s_dir() { print_header "创建 K8s 配置目录" mkdir -p "$K8S_DIR"/{namespace,configmap,secret,mysql,redis,boot,bigscreen,admin,ingress} print_success "K8s 配置目录已创建" } # 生成 Namespace generate_namespace() { print_info "生成 Namespace 配置..." cat > "$K8S_DIR/namespace/namespace.yaml" < "$K8S_DIR/configmap/ljwx-config.yaml" < "$K8S_DIR/secret/ljwx-secret.yaml" < "$K8S_DIR/mysql/mysql-statefulset.yaml" < "$K8S_DIR/redis/redis-deployment.yaml" < "$K8S_DIR/boot/boot-deployment.yaml" < "$K8S_DIR/bigscreen/bigscreen-deployment.yaml" < "$K8S_DIR/admin/admin-deployment.yaml" < "$K8S_DIR/ingress/ingress.yaml" </dev/null | wc -l | tr -d ' ') RUNNING_PODS=$(kubectl get pods -n $NAMESPACE --field-selector=status.phase=Running --no-headers 2>/dev/null | wc -l | tr -d ' ') READY_PODS=$(kubectl get pods -n $NAMESPACE -o json 2>/dev/null | jq '[.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True"))] | length') print_info "Pod 状态统计:" echo " 总计: $TOTAL_PODS" echo " 运行中: $RUNNING_PODS" echo " 就绪: $READY_PODS" echo "" if [ "$READY_PODS" = "$TOTAL_PODS" ]; then print_success "所有 Pods 已就绪!" else print_warning "部分 Pods 未就绪,请查看详细状态" fi } # 显示访问信息 show_access_info() { print_header "访问信息" local DOMAIN="${LJWX_DOMAIN:-ljwx.local}" local INGRESS_IP=$(kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null || echo "待获取") if [ "$INGRESS_IP" = "待获取" ]; then INGRESS_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || echo "localhost") fi echo "" print_success "部署完成!" echo "" echo "=========================================" echo "访问地址:" echo "=========================================" echo "管理后台: http://$DOMAIN" echo "后端 API: http://$DOMAIN/api" echo "数据大屏: http://$DOMAIN/bigscreen" echo "" echo "Ingress IP: $INGRESS_IP" echo "" echo "如果使用本地域名,请添加到 /etc/hosts:" echo " $INGRESS_IP $DOMAIN" echo "" echo "=========================================" echo "命名空间: $NAMESPACE" echo "镜像仓库: $REGISTRY" echo "版本信息:" echo " - Boot: $LJWX_BOOT_VERSION" echo " - Bigscreen: $LJWX_BIGSCREEN_VERSION" echo " - Admin: $LJWX_ADMIN_VERSION" echo " - MySQL: $LJWX_MYSQL_VERSION" echo " - Redis: $LJWX_REDIS_VERSION" echo "" echo "=========================================" echo "常用命令:" echo "=========================================" echo "查看 Pods: kubectl get pods -n $NAMESPACE" echo "查看日志: kubectl logs -f -n $NAMESPACE" echo "进入容器: kubectl exec -it -n $NAMESPACE -- /bin/sh" echo "删除部署: kubectl delete namespace $NAMESPACE" echo "查看事件: kubectl get events -n $NAMESPACE --sort-by='.lastTimestamp'" echo "" } # 主函数 main() { # 检查前置条件 check_prerequisites # 生成 K8s 配置 generate_all_manifests # 构建镜像 build_images # 部署到 K8s deploy_to_k8s # 验证部署 sleep 5 verify_deployment # 显示访问信息 show_access_info } # 显示帮助信息 show_help() { cat < 指定命名空间(默认: ljwx-system) --registry 指定镜像仓库(默认: localhost:15000) --domain 指定访问域名(默认: ljwx.local) 环境变量: K8S_NAMESPACE K8s 命名空间 PRIVATE_REGISTRY 私有镜像仓库地址 BUILD_IMAGES 是否构建镜像 (true/false) PUSH_IMAGES 是否推送镜像 (true/false) DEPLOY_MYSQL 是否部署 MySQL (true/false) DEPLOY_REDIS 是否部署 Redis (true/false) MYSQL_ROOT_PASSWORD MySQL root 密码(默认: 123456) MYSQL_DATABASE MySQL 数据库名(默认: lj-06) REDIS_PASSWORD Redis 密码(默认: 123456) LJWX_DOMAIN 访问域名(默认: ljwx.local) 示例: # 完整部署 $0 # 跳过镜像构建(使用已有镜像) $0 --skip-build # 使用外部数据库 $0 --skip-mysql --skip-redis # 指定命名空间和域名 K8S_NAMESPACE=ljwx-prod LJWX_DOMAIN=ljwx.example.com $0 更多信息请参考: README.md EOF } # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in --help) show_help exit 0 ;; --skip-build) BUILD_IMAGES=false shift ;; --skip-push) PUSH_IMAGES=false shift ;; --skip-mysql) DEPLOY_MYSQL=false shift ;; --skip-redis) DEPLOY_REDIS=false shift ;; --namespace) NAMESPACE="$2" shift 2 ;; --registry) REGISTRY="$2" shift 2 ;; --domain) export LJWX_DOMAIN="$2" shift 2 ;; *) print_error "未知选项: $1" echo "使用 --help 查看帮助" exit 1 ;; esac done # 执行主函数 main