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

87 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
# kubectl wrapper with automatic image pull fix
# 用途:自动检测并修复 ImagePullBackOff 问题
REAL_KUBECTL=$(which kubectl | grep -v "kubectl-auto-fix" | head -1)
if [[ -z "$REAL_KUBECTL" ]]; then
REAL_KUBECTL="/usr/local/bin/kubectl"
fi
CACHE_SCRIPT="/Users/brunogao/work/codes/tools/macos/k8s/cache-image.sh"
LOG_FILE="/tmp/kubectl-auto-fix.log"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log() {
echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
log_user() {
echo -e "$1"
}
# 执行原始命令
$REAL_KUBECTL "$@"
EXIT_CODE=$?
# 只在 apply/create/replace 命令后检查
if [[ "$1" =~ ^(apply|create|replace)$ ]] && [[ "$EXIT_CODE" -eq 0 ]]; then
log "kubectl $* 执行成功,检查镜像拉取状态..."
# 等待 Pod 创建
sleep 3
# 检查是否有 ImagePull 失败
FAILED_DEPLOYS=$($REAL_KUBECTL get deployments --all-namespaces -o json 2>/dev/null | \
jq -r '.items[] |
select(.status.conditions[]? |
select(.type=="Available" and .status=="False" and
(.message | test("ImagePull|ErrImage")))) |
"\(.metadata.namespace)/\(.metadata.name)"' 2>/dev/null)
if [[ -n "$FAILED_DEPLOYS" ]]; then
log_user ""
log_user "${YELLOW}⚠️ 检测到镜像拉取失败,自动修复中...${NC}"
log_user ""
declare -A FIXED
while IFS= read -r deploy; do
[[ -z "$deploy" ]] && continue
[[ -n "${FIXED[$deploy]}" ]] && continue
log "自动修复: $deploy"
log_user "${BLUE}🔧 修复 Deployment: $deploy${NC}"
if [[ -x "$CACHE_SCRIPT" ]]; then
if "$CACHE_SCRIPT" --update-deployment "$deploy" >> "$LOG_FILE" 2>&1; then
log_user "${GREEN} ✅ 修复成功${NC}"
log "修复成功: $deploy"
FIXED[$deploy]=1
else
log_user "${RED} ❌ 修复失败${NC}"
log_user "${YELLOW} 查看日志: tail -f $LOG_FILE${NC}"
log "修复失败: $deploy"
fi
else
log_user "${RED} ❌ 缓存脚本不存在: $CACHE_SCRIPT${NC}"
log "缓存脚本不存在"
fi
done <<< "$FAILED_DEPLOYS"
if [[ ${#FIXED[@]} -gt 0 ]]; then
log_user ""
log_user "${GREEN}✅ 自动修复完成,共修复 ${#FIXED[@]} 个 Deployment${NC}"
log_user "${BLUE}💡 提示:等待几秒后运行 'kubectl get pods' 查看状态${NC}"
log_user ""
fi
fi
fi
exit $EXIT_CODE