Kubernetes下实现单客户端/IP绑定独立STT模型Pod的方案咨询
针对单会话STT模型的Kubernetes部署方案
核心思路
要实现每个客户端独占一个Pod,需从「路由调度规则」和「Pod扩缩容触发逻辑」两个核心维度解决问题:
方案1:会话亲和性+KEDA连接数扩缩容(推荐)
步骤1:配置服务的客户端IP亲和性
修改Service配置,确保同一客户端的所有请求始终路由到同一个Pod,避免跨Pod会话混淆:
apiVersion: v1 kind: Service metadata: name: stt-service spec: selector: app: stt-model ports: - port: 80 targetPort: 5000 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 3600 # 可根据会话时长调整超时时间
步骤2:用KEDA基于连接数触发扩缩容
KEDA支持自定义指标驱动的HPA,通过监听Pod的TCP连接数,当现有Pod都达到单会话上限时自动扩容,无连接时缩容到0:
- 部署KEDA后,创建
ScaledObject配置,对接Prometheus采集的TCP连接指标:
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: stt-scaler spec: scaleTargetRef: name: stt-deployment minReplicaCount: 0 maxReplicaCount: 10 triggers: - type: prometheus metadata: serverAddress: http://prometheus-k8s.monitoring.svc:9090 metricName: pod_tcp_connections query: sum(container_tcp_connections{pod=~"stt-model-.*"}) by (pod) threshold: "1"
- 确保集群已部署Prometheus并开启容器TCP连接指标采集,KEDA会实时感知每个Pod的连接状态,自动完成扩缩容动作。
方案2:StatefulSet+Headless Service(长会话场景适配)
如果客户端会话持续时间较长,可采用StatefulSet配合Headless Service,让客户端直接绑定独立Pod:
- 部署Headless Service,不做负载均衡,直接暴露每个Pod的独立访问地址:
apiVersion: v1 kind: Service metadata: name: stt-headless spec: selector: app: stt-model clusterIP: None ports: - port: 80 targetPort: 5000
- 客户端侧维护可用Pod列表,新会话直接请求未被占用的Pod地址;会话结束后,通过KEDA基于Pod活跃度触发缩容,销毁闲置Pod。
方案3:Sidecar代理做会话隔离
给每个STT模型Pod添加Sidecar代理,负责会话管理和流量控制:
- Sidecar接收所有客户端连接,检测到Pod已有会话时,拒绝新连接或触发Pod扩容;
- 代理同时上报当前会话数指标到Prometheus,配合KEDA完成扩缩容逻辑。
关键配置注意事项
- 配置就绪探针,当模型被占用时标记Pod为「未就绪」,避免负载均衡器将新请求路由过来:
readinessProbe: exec: command: ["curl", "-f", "http://localhost:5000/session-status"] # 模型需提供会话状态接口,返回是否空闲 initialDelaySeconds: 5 periodSeconds: 3
- 调整Pod终止等待时间,避免强制销毁正在处理会话的Pod:
terminationGracePeriodSeconds: 60 # 根据会话最长处理时间设置
内容的提问来源于stack exchange,提问作者Mahmoud Hossam
相关产品推荐
相关产品推荐

