Files
taiji-AI-PAD/k8s/prod/deploy.sh
T
2026-05-05 14:13:59 +08:00

154 lines
5.3 KiB
Bash

#!/bin/bash
# Taiji AI-PAD AKS 部署脚本 (生产环境)
# 部署到 taiji-ai-pda AKS 集群
set -e
# 配置变量 - 生产环境
ACR_NAME="taiji"
ACR_LOGIN_SERVER="${ACR_NAME}.azurecr.io"
RESOURCE_GROUP="taiji-ai-pda"
AKS_NAME="taiji-ai-pda"
NAMESPACE="taiji-ai"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${RED}=== Taiji AI-PAD AKS 部署脚本 (生产环境) ===${NC}"
echo -e "${RED}警告: 您正在部署到生产环境!${NC}"
echo -e "${YELLOW}目标集群: ${AKS_NAME}${NC}"
echo -e "${YELLOW}命名空间: ${NAMESPACE}${NC}"
echo ""
# 确认生产环境部署
read -p "确认部署到生产环境? (输入 'yes' 继续): " confirm
if [ "$confirm" != "yes" ]; then
echo -e "${YELLOW}部署已取消${NC}"
exit 0
fi
# 检查 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) 匹配,避免在 arm64 Mac 上误构建为 arm64
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/prod/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/prod/secrets.yaml
kubectl apply -f k8s/prod/configmap.yaml
# 部署 NATS
echo -e "${YELLOW}部署 NATS 消息队列...${NC}"
kubectl apply -f k8s/prod/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/prod/data-ingestion.yaml
# 部署 MCP Server
echo -e "${YELLOW}部署 MCP Server...${NC}"
kubectl apply -f k8s/prod/mcp-server.yaml
# 部署 API Gateway
echo -e "${YELLOW}部署 API Gateway...${NC}"
kubectl apply -f k8s/prod/api-gateway.yaml
# 部署 Ingress
echo -e "${YELLOW}部署 Ingress...${NC}"
kubectl apply -f k8s/prod/ingress.yaml
# 部署 Prometheus 监控
echo -e "${YELLOW}部署 Prometheus 监控...${NC}"
kubectl apply -f k8s/prod/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 "${RED}生产环境配置信息:${NC}"
echo -e " - 数据库: taiji_prod (生产库)"
echo -e " - Redis: taiji2026.southeastasia.redis.azure.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