Kubernetes中如何实现首连调度至低CPU Pod并保持会话粘性?
解决方案
核心思路
要实现「首次连接优先调度到低负载Pod+后续请求保持会话粘性」,需要结合Nginx Ingress的负载均衡策略与已配置的会话粘性规则。默认轮询调度无法满足首连的负载感知需求,需切换为基于Pod负载的调度算法,同时保留原有cookie粘性配置即可达成目标。
具体配置步骤
1. 启用负载感知调度(二选一)
在现有Ingress的metadata.annotations中添加对应注解,替换默认的轮询策略:
选项1:优先调度到连接数最少的Pod(推荐,原生支持)
添加以下注解,Nginx会自动将首次请求分配给当前连接数最低的Pod,天然适配低负载调度需求:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
选项2:基于CPU/带宽的加权调度(需额外组件支持)
如果需要更精细的CPU、带宽负载感知,需借助集群指标采集组件(如Metrics Server)配合权重调度:
- 先确保集群已部署
metrics-server,能采集Pod的实时CPU、内存使用率 - 使用第三方工具(如kube-metrics-adapter)将Pod指标转化为Service Endpoint的权重
- 添加注解启用加权轮询:
nginx.ingress.kubernetes.io/load-balance: "weighted_round_robin"
此方式配置复杂,适合对负载均衡精度要求极高的场景。
2. 保留原有会话粘性配置
你已配置的cookie粘性注解无需修改:当客户端首次请求被调度到某Pod后,后续请求会通过携带的会话cookie直接转发到该Pod,自动保持会话粘性,且优先级高于负载均衡策略。
最终完整Ingress配置(以least_conn为例)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "stickounet" nginx.ingress.kubernetes.io/session-cookie-expires: "172800" nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" # 新增:启用最少连接数调度策略 nginx.ingress.kubernetes.io/load-balance: "least_conn" spec: rules: - host: hello-world.info http: paths: - path: / pathType: Prefix backend: service: name: my-service-svc port: number: 80
注意事项
least_conn是Nginx Ingress原生支持的策略,无需额外组件,配置简单高效- 若使用基于CPU/带宽的加权调度,必须保证集群能正常采集Pod的实时指标
- 会话粘性优先级高于负载均衡:客户端携带有效会话cookie时,会直接转发到绑定Pod,不再执行负载调度
内容的提问来源于stack exchange,提问作者Berkay Aktaş
相关产品推荐
相关产品推荐

