#!/bin/bash # Taiji AI-PAD AKS 部署脚本 (测试环境) # 部署到 testagnet AKS 集群 set -e # 配置变量 - 测试环境 ACR_NAME="taiji" ACR_LOGIN_SERVER="${ACR_NAME}.azurecr.io" RESOURCE_GROUP="taiji-ai-test" AKS_NAME="testagnet" NAMESPACE="taiji-ai-test" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}=== Taiji AI-PAD AKS 部署脚本 (测试环境) ===${NC}" echo -e "${YELLOW}目标集群: ${AKS_NAME}${NC}" echo -e "${YELLOW}命名空间: ${NAMESPACE}${NC}" echo "" # 检查 Azure CLI 登录状态 echo -e "${YELLOW}检查 Azure 登录状态...${NC}" az account show > /dev/null 2>&1 || { echo -e "${RED}请先运行 'az login' 登录 Azure${NC}"; exit 1; } echo -e "${GREEN}Azure 已登录${NC}" # 登录 ACR echo -e "${YELLOW}登录 Azure Container Registry...${NC}" az acr login --name ${ACR_NAME} # 获取 AKS 凭据 echo -e "${YELLOW}获取 AKS 集群凭据 (${AKS_NAME})...${NC}" az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --overwrite-existing # 构建并推送 Docker 镜像 echo -e "${YELLOW}构建并推送 Docker 镜像到 ACR...${NC}" # 构建 Data Ingestion # --platform linux/amd64: 显式锁定架构,与 AKS 标准节点 (amd64) 匹配 echo -e "${YELLOW}[1/2] 构建 Data Ingestion 镜像...${NC}" docker build --platform linux/amd64 -t ${ACR_LOGIN_SERVER}/data-ingestion:latest ./services/data-ingestion/ docker push ${ACR_LOGIN_SERVER}/data-ingestion:latest # 构建 MCP Server echo -e "${YELLOW}[2/2] 构建 MCP Server 镜像...${NC}" docker build --platform linux/amd64 -t ${ACR_LOGIN_SERVER}/mcp-server:latest ./services/mcp-server/ docker push ${ACR_LOGIN_SERVER}/mcp-server:latest echo -e "${GREEN}所有镜像构建并推送完成!${NC}" # 部署到 AKS echo -e "${YELLOW}部署到 AKS (测试环境)...${NC}" # 创建命名空间 echo -e "${YELLOW}创建命名空间...${NC}" kubectl apply -f k8s/test/namespace.yaml # 创建 ACR 拉取凭据 (如果不存在) echo -e "${YELLOW}检查 ACR 拉取凭据...${NC}" if ! kubectl get secret acr-secret -n ${NAMESPACE} > /dev/null 2>&1; then echo -e "${YELLOW}创建 ACR 拉取凭据...${NC}" ACR_PASSWORD=$(az acr credential show --name ${ACR_NAME} --query "passwords[0].value" -o tsv) kubectl create secret docker-registry acr-secret \ --namespace ${NAMESPACE} \ --docker-server=${ACR_LOGIN_SERVER} \ --docker-username=${ACR_NAME} \ --docker-password=${ACR_PASSWORD} fi # 部署 Secrets 和 ConfigMap echo -e "${YELLOW}部署 Secrets 和 ConfigMap...${NC}" kubectl apply -f k8s/test/secrets.yaml kubectl apply -f k8s/test/configmap.yaml # 部署 NATS echo -e "${YELLOW}部署 NATS 消息队列...${NC}" kubectl apply -f k8s/test/nats.yaml # 等待 NATS 就绪 echo -e "${YELLOW}等待 NATS 就绪...${NC}" kubectl wait --for=condition=ready pod -l app=nats -n ${NAMESPACE} --timeout=120s || true # 部署 Data Ingestion echo -e "${YELLOW}部署 Data Ingestion...${NC}" kubectl apply -f k8s/test/data-ingestion.yaml # 部署 MCP Server echo -e "${YELLOW}部署 MCP Server...${NC}" kubectl apply -f k8s/test/mcp-server.yaml # 部署 API Gateway echo -e "${YELLOW}部署 API Gateway...${NC}" kubectl apply -f k8s/test/api-gateway.yaml # 部署 Ingress echo -e "${YELLOW}部署 Ingress...${NC}" kubectl apply -f k8s/test/ingress.yaml # 部署 Prometheus 监控 echo -e "${YELLOW}部署 Prometheus 监控...${NC}" kubectl apply -f k8s/test/monitoring.yaml # 等待所有服务就绪 echo -e "${YELLOW}等待所有服务就绪...${NC}" kubectl wait --for=condition=ready pod -l app=data-ingestion -n ${NAMESPACE} --timeout=180s || true kubectl wait --for=condition=ready pod -l app=mcp-server -n ${NAMESPACE} --timeout=180s || true kubectl wait --for=condition=ready pod -l app=api-gateway -n ${NAMESPACE} --timeout=180s || true kubectl wait --for=condition=ready pod -l app=prometheus -n ${NAMESPACE} --timeout=180s || true # 获取 API Gateway 外部 IP echo -e "${YELLOW}获取 API Gateway 外部 IP...${NC}" EXTERNAL_IP=$(kubectl get svc api-gateway -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null) echo "" echo -e "${GREEN}=== 测试环境部署完成! ===${NC}" echo "" echo -e "查看所有 Pod 状态:" kubectl get pods -n ${NAMESPACE} echo "" echo -e "查看所有 Service:" kubectl get svc -n ${NAMESPACE} echo "" echo -e "查看 Ingress:" kubectl get ingress -n ${NAMESPACE} echo "" echo -e "${BLUE}测试环境配置信息:${NC}" echo -e " - 数据库: taiji (测试库)" echo -e " - Redis: testagnet.redis.cache.windows.net" echo -e " - 命名空间: ${NAMESPACE}" if [ -n "$EXTERNAL_IP" ]; then echo "" echo -e "${GREEN}API Gateway 外部访问地址: http://${EXTERNAL_IP}${NC}" echo -e " - 健康检查: http://${EXTERNAL_IP}/health" echo -e " - MCP Server: http://${EXTERNAL_IP}/api/mcp/" echo -e " - Data Ingestion: http://${EXTERNAL_IP}/api/data/" else echo "" echo -e "${YELLOW}LoadBalancer IP 尚未分配,请稍后运行以下命令查看:${NC}" echo -e " kubectl get svc api-gateway -n ${NAMESPACE}" fi