95 lines
2.8 KiB
Bash
Executable File
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 "=========================================="
|