192 lines
6.5 KiB
Bash
Executable File
192 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# AKS 清理脚本 - 删除所有旧镜像和命名空间
|
|
# 使用前请确保已登录 Azure CLI 并配置了正确的 AKS 和 ACR
|
|
|
|
set -e # 遇到错误立即退出
|
|
|
|
# 颜色输出
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 配置变量(请根据实际情况修改)
|
|
AKS_RESOURCE_GROUP="${AKS_RESOURCE_GROUP:-taiji-rg}"
|
|
AKS_CLUSTER_NAME="${AKS_CLUSTER_NAME:-taiji-aks}"
|
|
ACR_NAME="${ACR_NAME:-taijiregistry}"
|
|
NAMESPACE="${NAMESPACE:-taiji-ai}"
|
|
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo -e "${YELLOW}AKS 清理脚本${NC}"
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo ""
|
|
|
|
# 检查 Azure CLI 是否已安装
|
|
if ! command -v az &> /dev/null; then
|
|
echo -e "${RED}错误: Azure CLI 未安装。请先安装 Azure CLI。${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查 kubectl 是否已安装
|
|
if ! command -v kubectl &> /dev/null; then
|
|
echo -e "${RED}错误: kubectl 未安装。请先安装 kubectl。${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查是否已登录 Azure
|
|
echo -e "${YELLOW}检查 Azure 登录状态...${NC}"
|
|
if ! az account show &> /dev/null; then
|
|
echo -e "${RED}错误: 未登录 Azure。请先运行 'az login'${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✓ Azure 登录状态正常${NC}"
|
|
echo ""
|
|
|
|
# 获取 AKS 凭据
|
|
echo -e "${YELLOW}获取 AKS 集群凭据...${NC}"
|
|
az aks get-credentials --resource-group "$AKS_RESOURCE_GROUP" --name "$AKS_CLUSTER_NAME" --overwrite-existing
|
|
echo -e "${GREEN}✓ AKS 凭据已获取${NC}"
|
|
echo ""
|
|
|
|
# 显示当前命名空间
|
|
echo -e "${YELLOW}当前命名空间列表:${NC}"
|
|
kubectl get namespaces
|
|
echo ""
|
|
|
|
# 确认删除操作
|
|
echo -e "${RED}警告: 此操作将删除以下内容:${NC}"
|
|
echo -e "${RED} 1. 命名空间: ${NAMESPACE} (包括所有资源)${NC}"
|
|
echo -e "${RED} 2. ACR 中的所有镜像${NC}"
|
|
echo ""
|
|
read -p "确认继续? (yes/no): " confirm
|
|
|
|
if [ "$confirm" != "yes" ]; then
|
|
echo -e "${YELLOW}操作已取消${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
# 1. 删除命名空间
|
|
echo ""
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo -e "${YELLOW}步骤 1: 删除命名空间${NC}"
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
|
|
if kubectl get namespace "$NAMESPACE" &> /dev/null; then
|
|
echo -e "${YELLOW}正在删除命名空间: ${NAMESPACE}...${NC}"
|
|
|
|
# 删除命名空间中的所有资源
|
|
echo " 删除命名空间中的所有资源..."
|
|
kubectl delete all --all -n "$NAMESPACE" --ignore-not-found=true
|
|
kubectl delete secrets --all -n "$NAMESPACE" --ignore-not-found=true
|
|
kubectl delete configmaps --all -n "$NAMESPACE" --ignore-not-found=true
|
|
kubectl delete pvc --all -n "$NAMESPACE" --ignore-not-found=true
|
|
|
|
# 删除命名空间本身
|
|
echo " 删除命名空间..."
|
|
kubectl delete namespace "$NAMESPACE" --ignore-not-found=true
|
|
|
|
# 等待命名空间完全删除
|
|
echo " 等待命名空间完全删除..."
|
|
while kubectl get namespace "$NAMESPACE" &> /dev/null; do
|
|
echo " 等待中..."
|
|
sleep 2
|
|
done
|
|
|
|
echo -e "${GREEN}✓ 命名空间 ${NAMESPACE} 已删除${NC}"
|
|
else
|
|
echo -e "${YELLOW}命名空间 ${NAMESPACE} 不存在,跳过${NC}"
|
|
fi
|
|
|
|
# 列出所有 taiji 相关的命名空间并删除
|
|
echo ""
|
|
echo -e "${YELLOW}查找其他 taiji 相关的命名空间...${NC}"
|
|
TAIJI_NAMESPACES=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\n' | grep -i taiji || true)
|
|
|
|
if [ -n "$TAIJI_NAMESPACES" ]; then
|
|
for ns in $TAIJI_NAMESPACES; do
|
|
if [ "$ns" != "$NAMESPACE" ]; then
|
|
echo -e "${YELLOW}删除命名空间: $ns...${NC}"
|
|
kubectl delete namespace "$ns" --ignore-not-found=true
|
|
echo -e "${GREEN}✓ 命名空间 $ns 已删除${NC}"
|
|
fi
|
|
done
|
|
else
|
|
echo -e "${GREEN}✓ 没有其他 taiji 相关的命名空间${NC}"
|
|
fi
|
|
|
|
# 2. 删除 ACR 中的镜像
|
|
echo ""
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo -e "${YELLOW}步骤 2: 清理 ACR 镜像${NC}"
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
|
|
# 检查 ACR 是否存在
|
|
if ! az acr show --name "$ACR_NAME" &> /dev/null; then
|
|
echo -e "${YELLOW}ACR ${ACR_NAME} 不存在或无法访问,跳过镜像清理${NC}"
|
|
else
|
|
echo -e "${YELLOW}列出 ACR 中的仓库...${NC}"
|
|
REPOSITORIES=$(az acr repository list --name "$ACR_NAME" --output tsv 2>/dev/null || echo "")
|
|
|
|
if [ -z "$REPOSITORIES" ]; then
|
|
echo -e "${GREEN}✓ ACR 中没有镜像仓库${NC}"
|
|
else
|
|
echo "找到以下仓库:"
|
|
echo "$REPOSITORIES"
|
|
echo ""
|
|
|
|
# 删除每个仓库中的所有镜像
|
|
for repo in $REPOSITORIES; do
|
|
echo -e "${YELLOW}处理仓库: $repo${NC}"
|
|
|
|
# 列出该仓库的所有标签
|
|
TAGS=$(az acr repository show-tags --name "$ACR_NAME" --repository "$repo" --output tsv --orderby time_desc 2>/dev/null || echo "")
|
|
|
|
if [ -z "$TAGS" ]; then
|
|
echo " 仓库 $repo 中没有标签"
|
|
continue
|
|
fi
|
|
|
|
echo " 找到以下标签:"
|
|
echo "$TAGS" | head -10
|
|
if [ $(echo "$TAGS" | wc -l) -gt 10 ]; then
|
|
echo " ... (还有更多)"
|
|
fi
|
|
echo ""
|
|
|
|
# 删除所有标签
|
|
echo " 正在删除所有标签..."
|
|
for tag in $TAGS; do
|
|
az acr repository delete --name "$ACR_NAME" --image "${repo}:${tag}" --yes 2>/dev/null || true
|
|
done
|
|
|
|
echo -e "${GREEN}✓ 仓库 $repo 的所有镜像已删除${NC}"
|
|
done
|
|
|
|
echo ""
|
|
echo -e "${GREEN}✓ ACR 镜像清理完成${NC}"
|
|
fi
|
|
fi
|
|
|
|
# 3. 清理未使用的镜像(可选)
|
|
echo ""
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo -e "${YELLOW}步骤 3: 清理 AKS 节点上的未使用镜像${NC}"
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
|
|
echo -e "${YELLOW}注意: 节点镜像清理需要在每个节点上执行,这通常需要 SSH 访问权限${NC}"
|
|
echo -e "${YELLOW}如果需要清理节点镜像,请手动在每个节点上运行: docker system prune -a -f${NC}"
|
|
|
|
# 总结
|
|
echo ""
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo -e "${GREEN}清理完成!${NC}"
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo ""
|
|
echo "已执行的操作:"
|
|
echo " ✓ 删除命名空间: ${NAMESPACE}"
|
|
echo " ✓ 清理 ACR 镜像"
|
|
echo ""
|
|
echo -e "${YELLOW}提示: 如果需要重新部署,请运行部署脚本${NC}"
|
|
|