Files
ljwx-k8s/install-auto-fix.sh
2026-02-20 22:50:45 +08:00

284 lines
7.6 KiB
Bash
Executable File

#!/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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.k8s.image-watcher</string>
<key>ProgramArguments</key>
<array>
<string>$SCRIPT_DIR/watch-and-fix-images.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/image-watch.log</string>
<key>StandardErrorPath</key>
<string>/tmp/image-watch-error.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</dict>
</plist>
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 <namespace>/<deployment>
# 或单独缓存镜像
./cache-image.sh <image>:<tag>
```
### 重要提示
- ✅ 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 "═══════════════════════════════════════════════"