Files
ljwx-k8s/enhance-gitea-runner-hpa.sh
2026-02-20 22:50:45 +08:00

95 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# Gitea Runner KEDA 扩缩容策略修复脚本
# 目标:统一使用 external metrics,避免资源型 HPA 指标链路问题
set -euo pipefail
NAMESPACE="gitea-runner"
SCALEDOBJECT_NAME="gitea-runner-scaler"
LEGACY_HPA_NAME="gitea-runner-hpa"
PROMETHEUS_ADDRESS="http://monitoring-kube-prometheus-prometheus.observability.svc.cluster.local:9090"
BACKUP_DIR="./backups"
TMP_FILE="/tmp/gitea-runner-scaler-external-metrics.yaml"
echo "=========================================="
echo "Gitea Runner KEDA 扩缩容策略修复脚本"
echo "=========================================="
echo ""
mkdir -p "$BACKUP_DIR"
if kubectl get scaledobject "$SCALEDOBJECT_NAME" -n "$NAMESPACE" >/dev/null 2>&1; then
echo "[1/6] 备份当前 ScaledObject 配置..."
BACKUP_FILE="$BACKUP_DIR/gitea-runner-scaler-$(date +%Y%m%d-%H%M%S).yaml"
kubectl get scaledobject "$SCALEDOBJECT_NAME" -n "$NAMESPACE" -o yaml > "$BACKUP_FILE"
echo " 已备份: $BACKUP_FILE"
else
BACKUP_FILE=""
echo "[1/6] 当前集群不存在 ScaledObject,跳过备份"
fi
echo ""
echo "[2/6] 清理 legacy 手工 HPA(如存在)..."
if kubectl get hpa "$LEGACY_HPA_NAME" -n "$NAMESPACE" >/dev/null 2>&1; then
kubectl delete hpa "$LEGACY_HPA_NAME" -n "$NAMESPACE"
echo " 已删除: $LEGACY_HPA_NAME"
else
echo " 未发现 legacy HPA: $LEGACY_HPA_NAME"
fi
echo ""
echo "[3/6] 生成 external metrics 策略..."
cat > "$TMP_FILE" <<EOF_INNER
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: gitea-runner-scaler
namespace: gitea-runner
spec:
scaleTargetRef:
name: gitea-runner
minReplicaCount: 1
maxReplicaCount: 5
pollingInterval: 30
cooldownPeriod: 300
triggers:
- type: cron
metadata:
timezone: Asia/Shanghai
start: 0 9 * * 1-5
end: 0 18 * * 1-5
desiredReplicas: "2"
- type: prometheus
metadata:
serverAddress: ${PROMETHEUS_ADDRESS}
threshold: "3"
query: |
sum(gitea_actions_pending_jobs{instance="http://192.168.1.83:33000"})
EOF_INNER
echo ""
echo "[4/6] 应用 ScaledObject..."
kubectl apply -f "$TMP_FILE"
echo ""
echo "[5/6] 验证结果..."
kubectl get scaledobject "$SCALEDOBJECT_NAME" -n "$NAMESPACE"
kubectl get hpa -n "$NAMESPACE" | rg -n "keda-hpa|gitea-runner|NAME" || true
echo ""
echo "[6/6] 输出触发器配置..."
kubectl get scaledobject "$SCALEDOBJECT_NAME" -n "$NAMESPACE" -o yaml | sed -n '/triggers:/,/status:/p'
echo ""
echo "=========================================="
echo "策略修复完成"
echo "- 仅保留 KEDA 自动生成 HPA"
echo "- 使用 cron + prometheus external metrics"
echo "- Prometheus 地址: ${PROMETHEUS_ADDRESS}"
if [[ -n "$BACKUP_FILE" ]]; then
echo "- 回滚命令: kubectl apply -f $BACKUP_FILE"
fi
echo "=========================================="