Kubernetes 服务上的加权路由

bac*_*op7 1 load-balancing kubernetes google-kubernetes-engine kubernetes-ingress kubernetes-service

我有一个主服务和多个从服务。主服务使用来自 Google PubSub 的订阅者不断轮询主题。从属服务是 REST API。一旦主服务接收到消息,它将消息委托给从服务。目前我在 Kubernetes 中使用 ClusterIP 服务。我的一些请求很长,有些很短。

我碰巧观察到,有时如果在处理长时间运行的请求时有一个短时间运行的请求,它必须等到长时间运行的请求完成,即使许多 pod 可用而没有提供任何流量。我认为这是由于循环负载平衡。我一直在尝试寻找解决方案,并研究了诸如使用入口和内部 HTTP 负载平衡器设置外部 HTTP 负载平衡器之类的方法。但是我真的很困惑这两者之间的区别以及哪一个适用于我的用例。你能建议哪种方法可以解决我的用例吗?

Efr*_*tan 6

TL; 博士

假设您希望 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- 一个强大的服务器,位于您的应用程序前面并在ClusterIPs之间路由流量。

在 gcp 集群上安装入口控制器

安装并运行后,使用其金丝雀功能执行加权路由。这是使用以下注释完成的:

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