如何通过Kubernetes原生API实现Deployment A、B的流量百分比拆分?
Kubernetes原生实现精准流量拆分的方法
标准的Ingress资源(networking.k8s.io/v1)不支持按百分比分配流量,要实现90%/10%的流量拆分且无需调整Deployment副本数,推荐使用Kubernetes官方的Gateway API——这是原生的新一代路由API,已纳入官方API组,不属于第三方扩展。
用Gateway API实现流量拆分的步骤
- 确认集群已启用Gateway API:主流K8s发行版(如EKS、GKE、AKS)默认支持,若未启用,可通过安装官方提供的Gateway CRDs完成初始化。
- 创建基础的GatewayClass和Gateway资源,定义集群的入口访问点。
- 创建HTTPRoute资源,通过
weight字段指定流量权重,将流量按比例导向两个Deployment对应的Service:
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: traffic-split-route spec: parentRefs: - name: my-gateway namespace: gateway-system # 对应你的Gateway所在命名空间 rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: service-a # Deployment A对应的Service名称 port: 80 weight: 90 - name: service-b # Deployment B对应的Service名称 port: 80 weight: 10
其他原生方案说明
如果暂时无法部署Gateway API,还有一种精度有限的原生方法:手动调整Service的Endpoint列表,通过增减对应Pod的Endpoint数量模拟流量比例,但这种方式维护成本高,且受kube-proxy负载均衡策略影响,无法保证精准的流量拆分,不推荐用于生产环境。
另外,通过调整副本数实现流量比例的方式不可靠:这种方式依赖kube-proxy的轮询策略,当副本数量较少时(如9个A、1个B),Pod健康状态、会话亲和性等因素都会导致实际流量比例偏离预期,无法达到精准的90/10拆分。
内容的提问来源于stack exchange,提问作者zappa
相关产品推荐
相关产品推荐

