fix(acceptance): 在集群内驱动媒体压力

将验收负载二进制改为在协议模拟器 Pod 内执行,并继续通过两个公网入口均分请求,避免本机上行带宽污染 Gateway 的 8 分钟吞吐门槛。\n\nAPI Key 与 Run Token 仅通过 kubectl exec 标准输入传入进程,不写入 Pod 规格、命令参数或验收报告;响应仍由客户端流式解码并计算哈希。\n\n验证:bash -n;ShellCheck;git diff --check。
This commit is contained in:
2026-07-31 02:07:50 +08:00
parent 66db98ec1c
commit 3976cfb64d
+63 -20
View File
@@ -43,7 +43,7 @@ release_manifest=$2
}
load_cluster_env
require_commands curl git go jq node openssl sed
require_commands curl git jq node openssl sed
: "${AI_GATEWAY_ACCEPTANCE_ADMIN_TOKEN:?}"
: "${AI_GATEWAY_ACCEPTANCE_API_KEY:?}"
@@ -88,7 +88,6 @@ remote_release_helper=${AI_GATEWAY_REMOTE_RELEASE_HELPER:-/usr/local/sbin/easyai
temporary_root=$(mktemp -d)
chmod 0700 "$temporary_root"
current_manifest=$temporary_root/current.json
load_binary=$temporary_root/easyai-ai-gateway-acceptance-load
run_token=$(openssl rand -hex 32)
run_id=
report_root=
@@ -667,20 +666,68 @@ apply_capacity_profile() {
run_load_profile() {
local profile=$1
local report_path=$2
(
cd "$cluster_root/apps/api"
AI_GATEWAY_ACCEPTANCE_PROFILE=$profile \
AI_GATEWAY_ACCEPTANCE_GATEWAYS=$AI_GATEWAY_ACCEPTANCE_GATEWAYS \
AI_GATEWAY_ACCEPTANCE_GATEWAY_TLS_SERVER_NAME=$AI_GATEWAY_ACCEPTANCE_GATEWAY_TLS_SERVER_NAME \
AI_GATEWAY_ACCEPTANCE_EMULATOR_URL=http://easyai-acceptance-emulator.easyai.svc.cluster.local:8090 \
AI_GATEWAY_ACCEPTANCE_API_KEY=$AI_GATEWAY_ACCEPTANCE_API_KEY \
AI_GATEWAY_ACCEPTANCE_RUN_ID=$run_id \
AI_GATEWAY_ACCEPTANCE_RUN_TOKEN=$run_token \
AI_GATEWAY_ACCEPTANCE_GEMINI_MODEL=$AI_GATEWAY_ACCEPTANCE_GEMINI_MODEL \
AI_GATEWAY_ACCEPTANCE_VIDEO_MODEL=$AI_GATEWAY_ACCEPTANCE_VIDEO_MODEL \
AI_GATEWAY_ACCEPTANCE_REAL_IMAGE_URLS=$AI_GATEWAY_ACCEPTANCE_REAL_IMAGE_URLS \
"$load_binary" -profile "$profile" -report "$report_path" >/dev/null
)
local load_pod remote_script
[[ $profile =~ ^[a-z-]+$ ]] || return 1
load_pod=$(remote_kubectl get pods -n "$namespace" \
-l 'app.kubernetes.io/name=easyai-acceptance-emulator' -o json |
jq -r '[.items[]
| select(any(.status.conditions[]?; .type=="Ready" and .status=="True"))
| .metadata.name][0] // empty')
[[ $load_pod =~ ^easyai-acceptance-emulator-[a-z0-9-]+$ ]] || {
echo 'acceptance load runner Pod is not Ready' >&2
return 1
}
# Feed private values through stdin so the API Key and Run Token never enter
# the Pod spec, remote command arguments, process list, or report.
# shellcheck disable=SC2016 # This script runs inside the release image.
remote_script='
set -eu
read -r gateways_b64
read -r tls_name_b64
read -r emulator_b64
read -r api_key_b64
read -r run_id_b64
read -r run_token_b64
read -r gemini_model_b64
read -r video_model_b64
read -r image_urls_b64
decode() {
printf "%s" "$1" | base64 -d
}
export AI_GATEWAY_ACCEPTANCE_GATEWAYS=$(decode "$gateways_b64")
export AI_GATEWAY_ACCEPTANCE_GATEWAY_TLS_SERVER_NAME=$(decode "$tls_name_b64")
export AI_GATEWAY_ACCEPTANCE_EMULATOR_URL=$(decode "$emulator_b64")
export AI_GATEWAY_ACCEPTANCE_API_KEY=$(decode "$api_key_b64")
export AI_GATEWAY_ACCEPTANCE_RUN_ID=$(decode "$run_id_b64")
export AI_GATEWAY_ACCEPTANCE_RUN_TOKEN=$(decode "$run_token_b64")
export AI_GATEWAY_ACCEPTANCE_GEMINI_MODEL=$(decode "$gemini_model_b64")
export AI_GATEWAY_ACCEPTANCE_VIDEO_MODEL=$(decode "$video_model_b64")
export AI_GATEWAY_ACCEPTANCE_REAL_IMAGE_URLS=$(decode "$image_urls_b64")
exec /app/easyai-ai-gateway-acceptance-load -profile "$1"
'
{
printf '%s' "$AI_GATEWAY_ACCEPTANCE_GATEWAYS" | openssl base64 -A
printf '\n'
printf '%s' "$AI_GATEWAY_ACCEPTANCE_GATEWAY_TLS_SERVER_NAME" | openssl base64 -A
printf '\n'
printf '%s' 'http://easyai-acceptance-emulator.easyai.svc.cluster.local:8090' |
openssl base64 -A
printf '\n'
printf '%s' "$AI_GATEWAY_ACCEPTANCE_API_KEY" | openssl base64 -A
printf '\n'
printf '%s' "$run_id" | openssl base64 -A
printf '\n'
printf '%s' "$run_token" | openssl base64 -A
printf '\n'
printf '%s' "$AI_GATEWAY_ACCEPTANCE_GEMINI_MODEL" | openssl base64 -A
printf '\n'
printf '%s' "$AI_GATEWAY_ACCEPTANCE_VIDEO_MODEL" | openssl base64 -A
printf '\n'
printf '%s' "$AI_GATEWAY_ACCEPTANCE_REAL_IMAGE_URLS" | openssl base64 -A
printf '\n'
} |
remote_kubectl exec -i -n "$namespace" "$load_pod" -- \
sh -c "$remote_script" -- "$profile" >"$report_path"
}
kill_one_worker_during_recovery() {
@@ -1216,10 +1263,6 @@ ensure_acceptance_model_access
deploy_protocol_emulator
create_and_activate_run
wait_for_existing_tasks_to_drain
(
cd "$cluster_root/apps/api"
go build -trimpath -o "$load_binary" ./cmd/acceptance-load
)
for profile in P24 P28 P32; do
if ! apply_capacity_profile "$profile"; then