#!/bin/bash
#################################################################
# 脚本名称: k3s_install.sh
# 创建用户: hexiaoshi
# 创建时间: 2024-07-18
# 脚本描述: 安装 K3s 及相关组件
# 使用方法: sudo ./k3s_install.sh
#################################################################

# 设置变量
K3S_VERSION="v1.27.5+k3s1"
K3S_PACKAGE="k3s_${K3S_VERSION}_20250625.tar.gz"
DOWNLOAD_URL="http://183.3.220.117:8090/${K3S_PACKAGE}"
WORK_DIR="/tmp/k3s_${K3S_VERSION}"

# 错误处理函数
error_exit() {
    echo "错误: $1" >&2
    exit 1
}

# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

# 清理函数
cleanup() {
    log "开始清理临时文件..."
    rm -rf "${WORK_DIR}"
    rm -f "/tmp/${K3S_PACKAGE}"
}

# 检查必要条件
check_prerequisites() {
    # 检查 root 权限
    if [ "$EUID" -ne 0 ]; then
        error_exit "请使用 root 权限运行此脚本"
    fi

    # 检查 k3s 是否已安装
    if command -v k3s &> /dev/null; then
        log "K3s 已经安装，版本信息："
        k3s --version
        exit 0
    fi

    # 检查 Docker 是否安装
    if ! command -v docker &> /dev/null; then
        error_exit "未检测到 Docker，请先安装 Docker"
    fi

    # 检查 wget 是否安装
    if ! command -v wget &> /dev/null; then
        error_exit "未检测到 wget，请先安装 wget"
    }
}

# 下载并解压安装包
download_and_extract() {
    log "开始下载 K3s 安装包..."
    cd /tmp || error_exit "无法切换到 /tmp 目录"
    
    wget "${DOWNLOAD_URL}" || error_exit "下载失败，请检查网络连接或链接是否有效"
    
    log "解压安装包..."
    tar xzf "${K3S_PACKAGE}" || error_exit "解压失败"
    
    cd "${WORK_DIR}" || error_exit "无法切换到工作目录"
    tar -zxvf apps.tar.gz -C /home/ || error_exit "解压 apps.tar.gz 失败"
}

# 安装 K3s
install_k3s() {
    log "开始安装 K3s..."
    
    # 设置节点名称
    export K3S_NODE_NAME=${K3S_NODE_NAME:-k3s-master}
    
    # 加载离线镜像
    log "加载离线镜像..."
    docker load -i k3s-airgap-images-amd64.tar || error_exit "加载镜像失败"
    
    # 安装 K3s
    log "执行 K3s 安装脚本..."
    chmod 755 install.sh k3s || error_exit "修改权限失败"
    
    INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_MIRROR=cn ./install.sh --docker || error_exit "K3s 安装失败"
}

# 验证安装
verify_installation() {
    log "验证 K3s 安装..."
    if ! command -v k3s &> /dev/null; then
        error_exit "K3s 安装似乎失败了"
    fi
    
    log "K3s 版本信息："
    k3s --version
    
    log "节点状态："
    kubectl get nodes
}

# 主函数
main() {
    log "开始 K3s 安装流程..."
    
    # 捕获错误信号
    trap cleanup EXIT
    
    check_prerequisites
    download_and_extract
    install_k3s
    verify_installation
    
    log "K3s 安装完成！"
}

# 执行主函数
main "$@"

