87 lines
2.7 KiB
Bash
Executable File
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
|