ALB流控功能Target Optimizer Agent逆向原理分析
请注意本文部分内容经过AI辅助生成虽然经过笔者检查但是并不保证内容的正确性请自行判断准确性本文对相关后果不承担责任AWS ALB Target Optimizer 是 2025 年底发布的新功能允许用户为 ALB Target Group 配置容量感知的负载均衡。其核心依赖一个轻量级的 Target Control Agent以 Sidecar 形式部署在应用旁边。本文通过拉取官方镜像public.ecr.aws/aws-elb/target-optimizer/target-control-agent:latest对二进制进行逆向分析并结合官方文档还原其真实工作原理。基础信息项目实际值镜像地址public.ecr.aws/aws-elb/target-optimizer/target-control-agent:latest版本0.0.1-beta.1202512280148Z基础系统Amazon Linux 2023 (x86_64)二进制路径/opt/alb-target-control-agent/bin/alb-target-control-agent二进制大小15 MB编程语言Rust构建工具链brazil-rustup/toolchains/stable-x86_64-unknown-linux-gnu内部 crate 名amzn-alb-target-control-0.1.1388异步运行时tokio 1.48.0gRPC 框架tonic 0.12.3TLS 库s2n-tlsAWS 自研非 OpenSSLHTTP 框架hyper axum运行时内存占用~2.5 MB运行时线程数5动态链接库仅 libc、libm、libgcc_s极简依赖Agent 采用双平面分离架构数据流量和控制信号走不同的端口和协议控制平面 (gRPC over TLS) ALB Proxy Node ◄══════════════════════════════► Agent (controlAddress :3000) │ │ │ 数据平面 (HTTP/HTTP2) │ └────────────────────────────────────────► Agent (dataAddress :80) ──► App (:8080)端口职责端口环境变量协议用途dataAddressTARGET_CONTROL_DATA_ADDRESSHTTP/HTTP2接收 ALB 转发的应用流量controlAddressTARGET_CONTROL_CONTROL_ADDRESSgRPC over TLS与 ALB 交换管理信号destinationAddressTARGET_CONTROL_DESTINATIONHTTP代理到实际后端应用命令行参数Usage: alb-target-control-agent [OPTIONS] --data-address LISTEN --control-address GRPC_LISTEN DEST Arguments: DEST 上游应用地址 (IP:PORT) Options: --data-address LISTEN 数据监听地址 --control-address GRPC_LISTEN 控制通道监听地址 --max-concurrency N 最大并发数 (默认 1范围 0-1000) --tls-cert-path PATH TLS 证书路径 (PEM)默认自动生成自签名证书 --tls-key-path PATH TLS 私钥路径 (PEM) --tls-security-policy POLICY TLS 安全策略 --protocol-version VERSION 协议版本 (HTTP1/HTTP2/GRPC) --pid-file PATH PID 文件路径支持的 TLS 安全策略ELBSecurityPolicy-TLS13-1-0-2021-06ELBSecurityPolicy-TLS13-1-0-FIPS-2023-04ELBSecurityPolicy-TLS13-1-0-FIPS-PQ-2025-09后量子密码学ELBSecurityPolicy-2016-08核心工作原理Agent 是一个内联反向代理inline proxy。所有从 ALB 到应用的流量都必须经过 Agent。Agent 通过直接代理流量来精确计数并发请求数“The agent serves as an inline proxy between the load balancer and your application.”“The agent tracks the number of requests the target is processing.”gRPC 控制协议从二进制 strings 提取出的 gRPC service 定义service TargetController { rpc WorkProbe(stream WorkStats) returns (stream WorkUpdate); }这是一个双向流式 RPC。ALB 作为 gRPC client 连接 AgentgRPC server双方在同一个长连接上持续互发消息。WorkStats — ALB → Agent 方向message WorkStats { timestamp recorded_at // 统计时间戳 int work_queue_length // ALB 侧排队等待分配给此 target 的请求数 int idle_targets // 当前空闲的 target 数量全局视角 int total_requests // 累计总请求数 int accepted_requests // 累计被接受的请求数 int rejected_requests // 累计被拒绝的请求数 int total_work_tokens // 累计收到的 work token 总数 }ALB 周期性地把自己观察到的全局状态发送给 Agent状态同步与对账Agent 发出 AssignWork 后不知道 ALB 是否收到。ALB 通过total_work_tokens回传我一共收到了多少个令牌让双方账本对齐。全局视角补充Agent 只知道自己这一个 target 的情况ALB 通过idle_targets、work_queue_length等字段提供集群全局视角。一致性校验Agent 要求这些计数器单调递增如果出现倒退会记录异常日志。Agent 的校验逻辑Received a Stats update with reduced total_work_tokens, was X and received Y which is invalid Received a Stats update with reduced total_requests, was X Received a Stats update with an out of order timestamp Received a Stats update with the same timestamp as the last updateWorkUpdate — Agent → ALB 方向message WorkUpdate { oneof update { AssignWork assign_work CancelWork cancel_work } } message AssignWork { string work_id // 工作令牌 ID duration expires_in // 令牌过期时间 } message CancelWork { string work_id // 要取消的令牌 ID }Agent 根据自己的并发余量主动向 ALB 发放或回收令牌AssignWork“我有空位了给你一个 work_id你可以在 expires_in 时间内用它发一个请求过来”CancelWork“这个 work_id 作废了别用了”应用压力变大、令牌超时未使用等完整请求流程1. ALB 连接 Agent 的 controlAddress建立 gRPC 双向流 2. ALB 开始发送 WorkStats 流周期性状态同步 3. Agent 检查max_concurrency5当前并发2还有 3 个空位 4. Agent 发送 AssignWork{work_idabc, expires_in30s} 5. Agent 发送 AssignWork{work_iddef, expires_in30s} 6. Agent 发送 AssignWork{work_idghi, expires_in30s} 7. ALB 收到 3 个 work_id放入可用令牌池 8. 用户请求到达 ALBALB 取出 work_idabc 9. ALB 通过 dataAddress 发送 HTTP 请求header 带上 x-amzn-target-control-work-id: abc 10. Agent 收到请求用 work_id 创建 WorkPermit 对象并发计数 1 11. Agent 将请求代理转发给后端应用 127.0.0.1:8080 12. 应用处理完毕响应返回 13. WorkPermit 对象被 DropRust RAII 机制并发计数 -1 14. Agent 通过 gRPC 流发送 WorkUpdate 通知 ALB 令牌已释放 15. Agent 又有空位继续发送新的 AssignWork这是一个具名令牌桶机制Agent 是令牌的发放者ALB 是令牌的消费者每个令牌有唯一 IDwork_id和过期时间expires_in令牌不是简单的数字计数而是可追踪、可取消、可过期的具名对象WorkPermit 的 RAII 生命周期从 Rust 符号表提取的关键类型amzn_alb_target_control::agent::work_permit::WorkPermit impl Drop for WorkPermit // 请求完成时自动释放WorkPermit 实现了 Rust 的 Drop trait这意味着请求进来 → 创建 WorkPermit → 并发 1请求结束无论成功、失败、超时→ WorkPermit 自动 Drop → 并发 -1 → 通知 ALB这种 RAII 模式保证了并发计数的绝对准确性不会出现泄漏。Proxy Manager — 多 ALB 节点管理从符号表提取的关键类型amzn_alb_target_control::agent::main::ProxyManager amzn_alb_target_control::agent::main::ProxyAgent 内部有 ProxyManager 管理多个 Proxy即多个 ALB 节点。每个 ALB 节点独立建立 gRPC 连接Agent 跟踪每个 proxy 的并发状态。相关日志字符串No proxies currently registered, exiting maxcon check assigned to proxy X, concurrency is Y/Z (N active work_ids) cancelling work_id X for proxy Y because it was being hoarded Goodbye Proxy from X!注意 “hoarding” 检测 — Agent 会防止某个 ALB 节点囤积 work_id 不使用。优雅关闭Agent 支持优雅关闭从日志字符串可以看到Ctrl-C received, starting shutdown Gracefully shutdown - all connections completed! Waited 10 seconds for graceful shutdown, aborting...流程收到 SIGTERM/SIGINT停止接受新连接等待存量请求处理完毕10 秒超时后强制退出TLS 安全控制通道默认启用 TLSAgent 自动生成自签名证书使用 AWS 自研的 s2n-tls 库非 OpenSSL支持 TLS 1.3、FIPS 合规、后量子密码学PQ安全策略数据通道支持 HTTP/1.1 和 HTTP/2Kubernetes 部署部署方式官方支持两种部署方式方式一手动 SidecarinitContainers:-name:alb-target-control-agentimage:public.ecr.aws/aws-elb/target-optimizer/target-control-agent:latestrestartPolicy:Alwaysenv:-name:TARGET_CONTROL_DATA_ADDRESSvalue:0.0.0.0:80-name:TARGET_CONTROL_CONTROL_ADDRESSvalue:0.0.0.0:3000-name:TARGET_CONTROL_DESTINATIONvalue:127.0.0.1:8080-name:TARGET_CONTROL_MAX_CONCURRENCYvalue:100ports:-containerPort:80-containerPort:3000方式二自动注入通过 AWS Load Balancer Controller 的 Mutating Webhook 自动注入类似 Istio sidecar 注入机制。需要安装 ALBTargetControlConfig CRD配置 Mutating Webhook给 Namespace 或 Pod 打标签启用注入Ingress 配置annotations:alb.ingress.kubernetes.io/target-type:ip# 必须使用 ip 模式alb.ingress.kubernetes.io/target-control-port.${serviceName}.${servicePort}:3000Service 的 targetPort 指向 Agent 的 dataAddress如 80而非应用端口。参考资料AWS Load Balancer Controller - Target Control Agent 官方文档ALBTargetControlConfig SpecIngress Annotations - target-control-portALB Target Optimizer 发布公告ECR Gallery - target-control-agenthttps://aws.amazon.com/cn/blogs/networking-and-content-delivery/drive-application-performance-with-application-load-balancer-target-optimizer/