#!/bin/bash # 用 Prometheus 常数 25 走一遍扩容,然后改回真实的 vLLM 排队指标。 # 不向 vLLM 发推理请求。结束时 ScaledObject 回到仓库里的那份配置。 set -u NS=dify ORIG=/tmp/keda-sim-orig.yaml FAKE=/tmp/keda-sim-fake.yaml BACK=/tmp/keda-sim-back.yaml cat > "$FAKE" <<'EOF' apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: dify-worker namespace: dify spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: worker minReplicaCount: 1 maxReplicaCount: 3 pollingInterval: 15 cooldownPeriod: 60 advanced: horizontalPodAutoscalerConfig: behavior: scaleUp: stabilizationWindowSeconds: 0 policies: - type: Pods value: 3 periodSeconds: 15 scaleDown: stabilizationWindowSeconds: 0 policies: - type: Percent value: 100 periodSeconds: 15 triggers: - type: prometheus metadata: serverAddress: http://prometheus.observability.svc.cluster.local:9090 metricName: vllm_num_requests_waiting query: vector(25) threshold: "10" activationThreshold: "10" EOF cat > "$BACK" <<'EOF' apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: dify-worker namespace: dify spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: worker minReplicaCount: 1 maxReplicaCount: 3 pollingInterval: 15 cooldownPeriod: 60 advanced: horizontalPodAutoscalerConfig: behavior: scaleUp: stabilizationWindowSeconds: 0 policies: - type: Pods value: 3 periodSeconds: 15 scaleDown: stabilizationWindowSeconds: 0 policies: - type: Percent value: 100 periodSeconds: 15 triggers: - type: prometheus metadata: serverAddress: http://prometheus.observability.svc.cluster.local:9090 metricName: vllm_num_requests_waiting query: 'sum(vllm:num_requests_waiting{model_name="qwen3.6-27b"})' threshold: "10" activationThreshold: "10" EOF finish() { echo echo "========== 改回真实排队指标 ==========" kubectl apply -f "$BACK" for i in $(seq 1 24); do spec=$(kubectl -n "$NS" get deploy worker -o jsonpath='{.spec.replicas}') ready=$(kubectl -n "$NS" get deploy worker -o jsonpath='{.status.readyReplicas}') echo "down t=${i} spec=${spec:-empty} ready=${ready:-empty}" if [ "${spec:-}" = "1" ] && [ "${ready:-}" = "1" ]; then break fi sleep 10 done kubectl apply -f "$ORIG" rm -f "$FAKE" "$BACK" "$ORIG" echo echo "========== 结束后 ==========" kubectl -n "$NS" get scaledobject dify-worker kubectl -n "$NS" get hpa keda-hpa-dify-worker kubectl -n "$NS" get pods -l app=worker -o wide echo -n "vLLM /health " curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://127.0.0.1:8000/health || echo fail } trap finish EXIT echo "========== 模拟前 ==========" kubectl -n "$NS" get scaledobject dify-worker kubectl -n "$NS" get hpa keda-hpa-dify-worker kubectl -n "$NS" get pods -l app=worker -o wide echo -n "vLLM /health " curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://127.0.0.1:8000/health || echo fail echo echo "========== 把指标临时改成 25 ==========" kubectl apply -f "$FAKE" up_ok=0 for i in $(seq 1 24); do spec=$(kubectl -n "$NS" get deploy worker -o jsonpath='{.spec.replicas}') ready=$(kubectl -n "$NS" get deploy worker -o jsonpath='{.status.readyReplicas}') active=$(kubectl -n "$NS" get scaledobject dify-worker -o jsonpath='{.status.conditions[?(@.type=="Active")].status}') echo "up t=${i} spec=${spec:-empty} ready=${ready:-empty} active=${active:-empty}" kubectl -n "$NS" get hpa keda-hpa-dify-worker if [ "${ready:-}" = "3" ]; then up_ok=1 break fi sleep 10 done echo echo "========== 扩容后的 Pod ==========" kubectl -n "$NS" get pods -l app=worker -o wide kubectl -n "$NS" describe scaledobject dify-worker | sed -n '/Conditions:/,/Events:/p' if [ "$up_ok" != "1" ]; then echo "worker 没有在预期时间内变成 3 个就绪副本" fi