#!/bin/bash # 自动镜像修复系统安装脚本 # 用途:一键安装所有自动化组件 set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warning() { echo -e "${YELLOW}[!]${NC} $1"; } log_error() { echo -e "${RED}[✗]${NC} $1"; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" echo "" log_info "=== 自动镜像修复系统安装 ===" echo "" # 显示选项 echo "请选择安装组件:" echo "" echo " 1. OrbStack Registry Mirror (推荐 - 最透明)" echo " 2. kubectl wrapper (推荐 - 自动检测)" echo " 3. 后台监控服务 (可选 - 持续监控)" echo " 4. 全部安装 (推荐)" echo " 5. 仅更新 CLAUDE.md" echo "" read -p "请输入选项 (1-5): " -n 1 -r echo "" echo "" case $REPLY in 1) INSTALL_MIRROR=true ;; 2) INSTALL_KUBECTL=true ;; 3) INSTALL_WATCHER=true ;; 4) INSTALL_MIRROR=true INSTALL_KUBECTL=true INSTALL_WATCHER=true ;; 5) INSTALL_CLAUDE=true ;; *) log_error "无效选项" exit 1 ;; esac # 安装 OrbStack Mirror if [[ "$INSTALL_MIRROR" == "true" ]]; then log_info "[1/3] 配置 OrbStack Registry Mirror..." echo "" if [[ -x "$SCRIPT_DIR/setup-orbstack-registry-mirror.sh" ]]; then "$SCRIPT_DIR/setup-orbstack-registry-mirror.sh" else log_error "脚本不存在: setup-orbstack-registry-mirror.sh" fi echo "" fi # 安装 kubectl wrapper if [[ "$INSTALL_KUBECTL" == "true" ]]; then log_info "[2/3] 安装 kubectl wrapper..." echo "" if [[ ! -f "$SCRIPT_DIR/kubectl-auto-fix" ]]; then log_error "文件不存在: kubectl-auto-fix" exit 1 fi # 检查是否已安装 if grep -q "kubectl-auto-fix" "$HOME/.zshrc" 2>/dev/null; then log_warning "kubectl alias 已存在,跳过" else # 添加 alias cat >> "$HOME/.zshrc" << 'EOF' # kubectl auto-fix wrapper alias kubectl="$HOME/work/codes/tools/macos/k8s/kubectl-auto-fix" EOF log_success "已添加 kubectl alias 到 ~/.zshrc" fi log_info "请运行以下命令使 alias 生效:" echo " source ~/.zshrc" echo "" fi # 安装后台监控 if [[ "$INSTALL_WATCHER" == "true" ]]; then log_info "[3/3] 配置后台监控服务..." echo "" PLIST_FILE="$HOME/Library/LaunchAgents/com.k8s.image-watcher.plist" if [[ -f "$PLIST_FILE" ]]; then log_warning "LaunchAgent 已存在,先卸载..." launchctl unload "$PLIST_FILE" 2>/dev/null || true fi # 创建 LaunchAgent cat > "$PLIST_FILE" << EOF Label com.k8s.image-watcher ProgramArguments $SCRIPT_DIR/watch-and-fix-images.sh RunAtLoad KeepAlive StandardOutPath /tmp/image-watch.log StandardErrorPath /tmp/image-watch-error.log EnvironmentVariables PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin EOF log_success "已创建 LaunchAgent: $PLIST_FILE" # 询问是否立即启动 read -p "是否立即启动后台监控? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then launchctl load "$PLIST_FILE" log_success "后台监控已启动" echo "" log_info "查看日志: tail -f /tmp/image-watch.log" else log_info "稍后启动: launchctl load $PLIST_FILE" fi echo "" fi # 更新 CLAUDE.md if [[ "$INSTALL_CLAUDE" == "true" ]] || [[ "$INSTALL_KUBECTL" == "true" ]] || [[ "$INSTALL_MIRROR" == "true" ]]; then log_info "更新 CLAUDE.md 配置..." echo "" CLAUDE_MD="/Users/brunogao/work/codes/tools/macos/CLAUDE.md" if [[ ! -f "$CLAUDE_MD" ]]; then log_warning "CLAUDE.md 不存在,创建新文件" touch "$CLAUDE_MD" fi # 检查是否已添加 if grep -q "## 镜像拉取问题自动修复" "$CLAUDE_MD" 2>/dev/null; then log_warning "CLAUDE.md 已包含镜像修复配置,跳过" else cat >> "$CLAUDE_MD" << 'EOF' ## 镜像拉取问题自动修复 ### 识别条件 当遇到以下情况时,自动执行镜像缓存: - Kubernetes Pod 状态为 `ImagePullBackOff` 或 `ErrImagePull` - kubectl apply/create 返回镜像拉取错误 - docker pull 命令超时或失败 ### 自动修复流程 #### 方案 1: 使用 kubectl wrapper(已安装) ```bash # kubectl 命令会自动检测并修复 kubectl apply -f deployment.yaml # → 自动检测 ImagePullBackOff # → 自动缓存镜像 # → 自动更新 Deployment ``` #### 方案 2: 手动执行修复 ```bash # 自动修复 Deployment(推荐) cd /Users/brunogao/work/codes/tools/macos/k8s ./cache-image.sh --update-deployment / # 或单独缓存镜像 ./cache-image.sh : ``` ### 重要提示 - ✅ kubectl 命令已自动启用修复功能 - ✅ 所有镜像会缓存到 `harbor.omniverseai.net:8080/library/` - ✅ 支持 Docker Hub, GCR, Quay 等所有公共仓库 - ⚠️ 遇到 ImagePull 问题时,kubectl wrapper 会自动处理 - ⚠️ 如果 wrapper 失败,手动执行 `./cache-image.sh --update-deployment` ### 系统配置 已安装组件: - ✅ OrbStack Registry Mirror (透明加速) - ✅ kubectl wrapper (自动检测和修复) - ✅ 后台监控服务 (持续监控) 查看监控日志: ```bash tail -f /tmp/image-watch.log ``` 停止监控: ```bash launchctl unload ~/Library/LaunchAgents/com.k8s.image-watcher.plist ``` EOF log_success "已更新 CLAUDE.md" fi echo "" fi # 显示总结 echo "" echo "═══════════════════════════════════════════════" log_success "安装完成" echo "═══════════════════════════════════════════════" echo "" if [[ "$INSTALL_MIRROR" == "true" ]]; then echo "✅ OrbStack Registry Mirror" echo " - 已配置本地 Harbor 作为镜像加速器" echo " - 需要重启 OrbStack: orb restart" echo "" fi if [[ "$INSTALL_KUBECTL" == "true" ]]; then echo "✅ kubectl wrapper" echo " - 已添加 kubectl alias" echo " - 生效命令: source ~/.zshrc" echo " - 测试: kubectl apply -f deployment.yaml" echo "" fi if [[ "$INSTALL_WATCHER" == "true" ]]; then echo "✅ 后台监控服务" echo " - 查看日志: tail -f /tmp/image-watch.log" echo " - 停止监控: launchctl unload ~/Library/LaunchAgents/com.k8s.image-watcher.plist" echo "" fi echo "📚 相关文档:" echo " - 完整方案: $SCRIPT_DIR/AUTO-IMAGE-CACHE-SOLUTIONS.md" echo " - 使用指南: $SCRIPT_DIR/CACHE-IMAGE-GUIDE.md" echo " - 快速修复: $SCRIPT_DIR/QUICK-FIX-IMAGEPULL.md" echo "" echo "🎯 下一步:" echo " 1. source ~/.zshrc (使 kubectl alias 生效)" echo " 2. orb restart (使 Registry Mirror 生效)" echo " 3. kubectl apply -f test.yaml (测试自动修复)" echo "" echo "═══════════════════════════════════════════════"