bac*_*op7 1 load-balancing kubernetes google-kubernetes-engine kubernetes-ingress kubernetes-service
我有一个主服务和多个从服务。主服务使用来自 Google PubSub 的订阅者不断轮询主题。从属服务是 REST API。一旦主服务接收到消息,它将消息委托给从服务。目前我在 Kubernetes 中使用 ClusterIP 服务。我的一些请求很长,有些很短。
我碰巧观察到,有时如果在处理长时间运行的请求时有一个短时间运行的请求,它必须等到长时间运行的请求完成,即使许多 pod 可用而没有提供任何流量。我认为这是由于循环负载平衡。我一直在尝试寻找解决方案,并研究了诸如使用入口和内部 HTTP 负载平衡器设置外部 HTTP 负载平衡器之类的方法。但是我真的很困惑这两者之间的区别以及哪一个适用于我的用例。你能建议哪种方法可以解决我的用例吗?
假设您希望 20% 的流量用于x
服务,其余 80% 用于y
服务。为 2 个目标中的每一个创建 2 个入口文件,具有相同的主机名,唯一的区别是其中一个将携带以下入口注释:
nginx.ingress.kubernetes.io/canary: "true" #--> tell the controller to not create a new vhost
nginx.ingress.kubernetes.io/canary-weight: "20" #--> route here 20% of the traffic from the existing vhost
Run Code Online (Sandbox Code Playgroud)
加权路由有点超出ClusterIP
. 正如你自己所说,是时候让新玩家进入游戏了——入口控制器。
这是一个 k8s 抽象load balancer
- 一个强大的服务器,位于您的应用程序前面并在ClusterIP
s之间路由流量。
安装并运行后,使用其金丝雀功能执行加权路由。这是使用以下注释完成的:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: http-svc
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
rules:
- host: echo.com
http:
paths:
- backend:
serviceName: http-svc
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
这是完整指南。
(这是来自 google cloud docs 的相关定义,但其他云提供商的概念相似)
GCP 的负载均衡器可以分为外部负载均衡器和内部负载均衡器。外部负载平衡器将来自互联网的流量分配到您的 GCP 网络。内部负载平衡器在您的 GCP 网络内分配流量。
https://cloud.google.com/load-balancing/docs/load-balancing-overview