284 lines
7.6 KiB
Bash
Executable File
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 "═══════════════════════════════════════════════"
|