
Eco² vocabulary
- edge
- auth offload
- domain api
- task queue
- scan pipeline
- chat agent
- event bus
- cluster
- gitops
- autoscaling
- observability
- load test
- evaluation
Edge: ROUTE 53 · ALB · HTTPS 443 · internet-facing · external-dns · istio-ingressgateway · NodePort · eco2-gateway · VirtualService · x-canary · AuthorizationPolicy · ENVOY SIDECAR · kiali-serverAuth Offload: AuthorizationPolicy · action: CUSTOM · notPaths · envoyExtAuthzGrpc · failOpen: false · CheckRequest · x-user-id · BlacklistCache · BootstrapFromRedis · outbox:blacklist · blacklist.events · UsersServiceDomain API: VirtualService · x-user-id · /api/v1/scan · X-Idempotency-Key · job_id · stream_url · 202 ACCEPTED · Retry-After · ScanTask · UsersService · ImageService · ENVOY SIDECARTask Queue: outbox:blacklist · blacklist.events · RabbitmqCluster · scan.direct · reward.events · dlx · x-dead-letter-exchange · chat.process · AioPikaBroker · task_acks_late · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · QueueLength · inspect ping · QUEUE SATURATIONScan Pipeline: ScanTask · scan.direct · reward.events · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · RewardStep · item_class_list.yaml · situation_tags.yaml · LITE RAG · JsonRegulationRetriever · PipelineStage · waste_rag · XADD · domain: worker-ai · pipeline_duration · vision_stage_durationChat Agent: ImageService · chat.process · AioPikaBroker · create_chat_graph · route_by_intent · MULTI-INTENT FANOUT · waste_rag · recyclable_price · collection_point · image_generation · aggregator · thread_id · SyncableRedisSaver · AsyncPostgresSaver · LANGSMITH_TRACING · regenerateEvent Bus: job_id · stream_url · PipelineStage · XADD · scan:events:{shard} · XREADGROUP · XACK · XAUTOCLAIM · PendingReclaimer · STATE KV · scan:state:{job_id} · sse:events:{shard} · SSEBroadcastManager · Last-Event-ID · scan_sse_connections_active · ServiceMonitor · traceparentCluster: NodePort · kubeadm init · kubeadm join · vxlanMode · BGPConfiguration · module "vpc" · worker_ai · nodeSelector · domain: worker-ai · NoSchedule · 24-NODE CLUSTERGitOps: external-dns · x-canary · dev-root · ApplicationSet · sync-wave · selfHeal · ignoreDifferences · argocd-image-updater · update-strategy: digest · write-back-method · targetRevision · ci-services.ymlAutoscaling: ignoreDifferences · ScaledObject · QueueLength · cooldownPeriod · pollingInterval · fallback · maxReplicaCount · stabilizationWindowSeconds · HorizontalPodAutoscaler · scan_sse_connections_active · prometheus-adapterObservability: 24-NODE CLUSTER · prometheus-adapter · FLUENT BIT · Elasticsearch · Kibana · kube-prometheus-stack · AlertmanagerConfig · ServiceMonitor · JAEGER · OPENTELEMETRY · traceparent · kiali-server · LANGSMITH_TRACINGLoad Test: k6 · ramping-vus · thresholds · pipeline_duration · vision_stage_duration · poll_timeout · inspect ping · WORKER RESTART · POLLING TIMEOUT · QUEUE SATURATIONEvaluation: EvalConfig · eval_mode · eval_sample_rate · eval_cost_budget_daily_usd · EvalResult · EvalGrade · code_grader · llm_grader · CUSUM · regenerate · OpenAIBARSEvaluator
24 个节点实际如何连接,一次看一条流程。
用 kubeadm 搭建的自管 Kubernetes。结构图把 24 个物理节点及其上的工作负载放进 README 的五层之中,并以实际连接相连。选择一条流程后,只高亮该路径并标出步骤编号。
它从照片中识别废弃物并说明处理方法;在对话中调用地点、天气、再生资源价格与网页搜索等工具,并生成图像。在这个团队项目中,我从集群与部署基础做起,逐步把负责范围扩展到领域后端、异步处理、对话智能体与验证。
从比赛开发到后端与运维强化
服务已结束运营;演示录像与技术报告记录了它的运行情况。
Scan 请求 → 实时传递
照片分析请求成为队列中的工作,其进度事件返回到同一浏览器。
浏览器DNS 查询: DNS 查询Route 53
只从 Route 53 记录中解析名称。请求并不经过 DNS。
浏览器数据流: HTTPS 443AWS ALB
TLS 在 ALB 终止。
AWS ALB数据流: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gateway经 EC2 instance target 的 NodePort 交给 Istio ingress Envoy。
Istio ingress Envoy
k8s-ingress-gateway数据流: VirtualServiceScan APIk8s-api-scan路由到 Scan API,Scan API 将工作放入队列并立即返回 job_id;查询结果时,在作业完成前均返回 202。
Scan API
k8s-api-scan数据流: Celery 任务RabbitMQk8s-rabbitmqScan 任务进入 RabbitMQ。
RabbitMQ
k8s-rabbitmq数据流: consumescan-workerk8s-worker-ai · k8s-worker-ai-2AI 池中的 scan-worker(Celery · gevent)接收后运行 Vision → Rule → Answer → Reward。这四个阶段是以 chain 串联的 Celery 任务,不是节点。
AI 池
k8s-worker-ai · k8s-worker-ai-2数据流: HTTPSLLM APIscan 与 chat worker 调用 OpenAI 与 Google API。
scan-worker
k8s-worker-ai · k8s-worker-ai-2数据流: XADD scan:eventsStreamsk8s-redis-streams进度事件写入四个 Streams 分片之一。
Streams
k8s-redis-streams数据流: XREADGROUPEvent Routerk8s-event-routerEvent Router 以消费者组读取,处理后 XACK;pending 与 reclaim 保证 at-least-once 传递。
Event Router
k8s-event-router数据流: SETEX stateState KVk8s-redis-streams它将最新状态与重复处理标记写入同一 Redis 节点上的 State KV。
Event Router
k8s-event-router数据流: PUBLISHPub/Subk8s-redis-pubsub通过分片 Pub/Sub 中该作业的频道实时传递。
Pub/Sub
k8s-redis-pubsub数据流: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway 在每个进程中通过一个共享 listener 订阅,再分发给每个已连接的浏览器。
SSE Gateway
k8s-sse-gateway数据流: SSE 流浏览器经同一 ALB 与 ingress 路径打开的连接。传递为 at-least-once;重复以幂等方式处理。
State KV
k8s-redis-streams数据流: 重连恢复SSE Gatewayk8s-sse-gateway带 Last-Event-ID 重连时,由 State KV 与保留的 Streams 补齐错过的事件。
Chat · token 与存储
Chat token 与 Scan 走相同的事件路径;检查点与消息由两个不同的工作负载存储。
浏览器数据流: HTTPS 443AWS ALB
TLS 在 ALB 终止。
AWS ALB数据流: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gateway经 EC2 instance target 的 NodePort 交给 Istio ingress Envoy。
Istio ingress Envoy
k8s-ingress-gateway数据流: VirtualServiceChat APIk8s-api-chat路由到 Chat API。
Chat API
k8s-api-chat数据流: Taskiq 任务RabbitMQk8s-rabbitmqChat 任务进入 RabbitMQ。
RabbitMQ
k8s-rabbitmq数据流: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker(Taskiq · asyncio)用 LangGraph 分类意图,随后视需要运行 vision、选中的工具、aggregator,视需要再生成摘要,然后作答。每个请求只运行所需的分支。
AI 池
k8s-worker-ai · k8s-worker-ai-2数据流: HTTPSLLM APIscan 与 chat worker 调用 OpenAI 与 Google API。
chat-worker
k8s-worker-ai · k8s-worker-ai-2数据流: XADD chat:eventsStreamsk8s-redis-streamstoken 与阶段事件写入四个 Streams 分片;之后的传递路径与 Scan 相同。
Streams
k8s-redis-streams数据流: XREADGROUPEvent Routerk8s-event-routerEvent Router 以消费者组读取,处理后 XACK;pending 与 reclaim 保证 at-least-once 传递。
Event Router
k8s-event-router数据流: PUBLISHPub/Subk8s-redis-pubsub通过分片 Pub/Sub 中该作业的频道实时传递。
Pub/Sub
k8s-redis-pubsub数据流: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway 在每个进程中通过一个共享 listener 订阅,再分发给每个已连接的浏览器。
SSE Gateway
k8s-sse-gateway数据流: SSE 流浏览器经同一 ALB 与 ingress 路径打开的连接。传递为 at-least-once;重复以幂等方式处理。
chat-worker
k8s-worker-ai · k8s-worker-ai-2数据流: checkpointCachek8s-redis-cacheLangGraph 检查点保存在 Redis Cache 中。
Cache
k8s-redis-cache数据流: 读取检查点checkpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer 从 Redis 读取检查点。
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2数据流: 同步到 PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver 将其异步存入 PostgreSQL。
Streams
k8s-redis-streams数据流: chat-persistence grouppersistence consumerk8s-api-chatChat 节点上的 persistence consumer 以消费者组读取 done 事件。
persistence consumer
k8s-api-chat数据流: 保存消息PostgreSQLk8s-postgresqlChat 消息保存到 PostgreSQL。这与 checkpoint-syncer 是不同的工作负载。
入口 · 认证
从集群入口到达领域 API 的同步路径。只有受策略保护的路径会先检查认证;节点之间的 Pod 通信走 Calico VXLAN。
浏览器DNS 查询: DNS 查询Route 53
只从 Route 53 记录中解析名称。请求并不经过 DNS。
浏览器数据流: HTTPS 443AWS ALB
TLS 在 ALB 终止。
AWS ALB数据流: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gateway经 EC2 instance target 的 NodePort 交给 Istio ingress Envoy。
Istio ingress Envoy
k8s-ingress-gateway数据流: ext-authz · gRPC 50051ext-authzk8s-api-auth只有 CUSTOM 策略下的路径会先询问 Go ext-authz(超时 2 秒,failOpen false)。登录、health、docs 等路径被排除。
ext-authz
k8s-api-auth数据流: 黑名单查询blacklistk8s-redis-auth依据 Redis 黑名单检查 token。
Istio ingress Envoy
k8s-ingress-gateway数据流: VirtualServiceChat APIk8s-api-chat路由到 Chat API。
Chat API
k8s-api-chat数据流: gRPCimages APIk8s-api-imageREADME 中写明的 chat → images 同步调用。
auth API
k8s-api-auth数据流: gRPCusers APIk8s-api-usersREADME 中写明的 auth → users 同步调用。
storage 池 · 异步存储
认证黑名单与角色归属由 storage 池的 worker 存储,这些 worker 从 RabbitMQ 获取工作。
blacklist
k8s-redis-auth数据流: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay(README 中的 auth-Bus)读取 Redis outbox。
auth-relay
k8s-worker-storage · k8s-worker-storage-2数据流: blacklist.eventsRabbitMQk8s-rabbitmq它重新发布到 RabbitMQ,带重试与 DLQ。
RabbitMQ
k8s-rabbitmq数据流: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker 接收黑名单事件。
auth-worker
k8s-worker-storage · k8s-worker-storage-2数据流: 存储黑名单blacklistk8s-redis-auth存入 Redis 黑名单。
RabbitMQ
k8s-rabbitmq数据流: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker 批量接收角色归属工作。
users-worker
k8s-worker-storage · k8s-worker-storage-2数据流: UPSERTPostgreSQLk8s-postgresql应用到 PostgreSQL。
配置 · 扩缩 · 观测
Platform Layer 不是请求经过的步骤;它负责部署、配置、扩缩与观测其他各层。节点是 Terraform 创建的 EC2,由 Ansible 安装 kubeadm 与 Calico;CI 只验证 Terraform,从不自动 apply。
GitHub Actions · Docker Hub配置 · 扩缩: 镜像 · manifest revisionArgo CD image updater
k8s-masterArgo CD 通过 App-of-Apps 与 Sync Waves 使集群配置保持一致。仅确认了 image updater 部署在 control-plane 上。
ALB Controller · ExternalDNS
k8s-master配置 · 扩缩: Ingress → ALB · DNS 记录AWS 托管ALB Controller 与 ExternalDNS 配置 AWS 侧资源。这不是请求经过的路径。
Istiod
k8s-master配置 · 扩缩: xDS 配置Istio ingress Envoyk8s-ingress-gatewayIstiod 通过 xDS 将 Gateway、VirtualService 与 EnvoyFilter 配置推送到 ingress Envoy 与各 API 的 Envoy sidecar。
KEDA
k8s-monitoring配置 · 扩缩: Pod 数量AI 池k8s-worker-ai · k8s-worker-ai-2KEDA 调整 worker Pod 数量。节点数量不变。
KEDA
k8s-monitoring配置 · 扩缩: Pod 数量storage 池k8s-worker-storage · k8s-worker-storage-2storage 池的 worker Pod 也以同样方式扩缩。
Fluent Bit观测: 日志Elasticsearch
k8s-loggingFluent Bit 以 DaemonSet 运行在每个节点上,将日志发送到 Elasticsearch。
AI 池
k8s-worker-ai · k8s-worker-ai-2观测: LLM 运行追踪LangSmithLLM 调用追踪发送到外部 SaaS LangSmith。
所有连接以相同粗细显示。选择一个流程,即只突出显示其路径,并标出步骤编号。
- 实线 · 请求、工作、事件与写入的流向
- 点线 · DNS 查询;请求不经过此处
- 虚线 · 配置或扩缩;不是数据路径
- 长点划线 · 日志与运行追踪
- 粗黑线 · 所选流程;数字表示顺序
- 方框 · 物理节点,标题为主机名
- 内层小框 · 在该节点上运行的工作负载
- 虚线框 · 由两个节点组成的调度池
- 虚线框 · 位于集群之外,不计入节点数
- 橙色轮廓 · 模型作出判断之处
- Control plane1 个节点
- Domain API8 个节点
- AI 池2 个节点
- storage 池2 个节点
- Data5 个节点
- Platform6 个节点
README 的五层(层带)与物理分组(各节点标题栏的色调)以不同方式归组同样的 24 个节点。State KV 与 Streams 共用节点,不单独计数;Route 53、ALB 与集群外的服务不是节点。池是调度范围,并不表示每个 Pod 都在两个节点上运行。
24节点
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd,以及平台控制器。
- k8s-master
8Domain API
domain: <服务>每个领域一个节点。内部调用使用 gRPC。
- k8s-api-auth
- k8s-api-users
- k8s-api-scan
- k8s-api-character
- k8s-api-location
- k8s-api-image
- k8s-api-chat
- k8s-api-info
4Execution worker
两个调度池,各有两个节点。KEDA 改变 Pod 数量;节点数量保持不变。
storage 池
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI 池
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis 按用途拆分到四个节点。PostgreSQL 存储使用 EBS CSI · gp3。
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
消息、可观测性、入口与实时传递各有独立节点。
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- 每个节点
- Fluent Bit · DaemonSet
- Calico
已配置的模型 · 按提供商
该服务已关闭,因此这些是仓库中配置的模型,而非现在可选的模型。每个角色分开列出;这不是经过运行验证的清单。
OpenAI
Chat 默认提供商
Chat
openai/gpt-5.2默认
默认模型为 gpt-5.2;请求中指定了模型时,改用该模型。
Scan
gpt-5.2默认gpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
13 个模型映射之外的模型会被拒绝。
图像映射
gpt-image-1.5
与 Responses 编排模型 gpt-5.2 分开。图像生成默认关闭。
评测
gpt-4o-mini默认
对话评测所用的 LLM 评分器,与 Chat 模型分开。
Google
Chat 选择 Google 时
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
选择 Google 时,默认使用 gemini-3-flash-preview。
Scan
gemini-3-pro-previewgemini-3-flash-previewgemini-2.5-progemini-2.5-flashgemini-2.5-flash-litegemini-2.0-flashgemini-2.0-flash-lite
图像映射
gemini-3-pro-image-preview