【问题标题】:Openshift Route is not load balancing from Service podsOpenshift Route 不是来自 Service pod 的负载平衡
【发布时间】:2019-06-30 09:07:01
【问题描述】:

我之前在 Openshift Origin 3.9 和 Online 上尝试过。 我在 Openshift 上部署了一个简单的 hello world php 应用程序。它有一个服务和一个路由。

当我调用路由时,我得到了 Hello world 和 Pod IP 的预期输出。我们称这个 pod ip 为 1.1.1.1

现在我部署了相同的应用程序,在相同的服务下使用相同的标签进行小文本更改。我们称这个 pod ip 为 2.2.2.2

我可以看到两个 pod 在单个服务中运行。 现在当我调用路由时,它总是显示 Podip 1.1.1.1 我的路线从未到达第二个吊舱。

我的理解是 Route 会调用 Service,Service 会在可用的 Pod 之间进行负载平衡。

但这并没有发生。任何帮助表示赞赏。

【问题讨论】:

    标签: kubernetes openshift openshift-origin openshift-3


    【解决方案1】:

    服务不会在 pod 之间进行负载平衡,它是完全随机的。 RedHat 支持已经向我们证实了这一点。更重要的是,上面的答案只对 curl 进行了不同调用的测试。

    如果您在同一个 curl 上进行后续调用,您将看到它正在重用连接。试试看:

    curl http://172.30.177.72:8080/index.html http://172.30.177.72:8080/index.html
    

    您将看到 keep-alive 将重用连接,而不是进行交互,而您每次都在同一个 pod 上结束

    【讨论】:

      【解决方案2】:

      对于那些来这里寻找解决方案的人; Daein Park 和 Will Gordon 的回答都是正确的。

      这是一个简单的问题:

      1. 如果你在外部调用你的 Pod,它会从 Router 到 Service 再到 Pod。如果Router上的haproxy.router.openshift.io/disable_cookies注解没有设置为true,service总是转发到同一个pod。

        此外,在使用上面的注释禁用粘性路由后,您可以选择负载平衡算法: haproxy.router.openshift.io/balance 作为键,[source,roundrobin,leastconn] 之一作为值

      2. 如果您从另一个 pod 内部调用您的 pod。它从 Service 到 Pod。服务在默认配置下可以很好地进行循环负载平衡。

      所以你应该:

      • 如果您希望路由器公开您的服务,请将上述注释添加到您的路由器。
      • 如果您希望仅在内部访问您的服务,则什么也不做

      (在 Openshift 4.2.28 上测试)

      【讨论】:

        【解决方案3】:

        HAProxy 路由器的默认行为是使用 cookie 来确保“粘性”路由。这使会话可以保留在同一个 pod 中。 https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html

        如果您在到true 的路由上设置haproxy.router.openshift.io/disable_cookies 注释,它应该会禁用此行为。

        【讨论】:

          【解决方案4】:

          我的理解是 Route 会调用 Service,Service 会在可用的 Pod 之间进行负载平衡。

          通常您的知识是正确的。让我们在您的环境中进行如下测试。

          # oc describe svc web
          Name:              web
          Namespace:         test
          Labels:            app=web
          Annotations:       openshift.io/generated-by=OpenShiftNewApp
          Selector:          app=web,deploymentconfig=web
          Type:              ClusterIP
          IP:                172.30.6.8
          Port:              8080-tcp  8080/TCP
          TargetPort:        8080/TCP
          Endpoints:         1.1.1.1:8080,2.2.2.2:8080
          Session Affinity:  None
          Events:            <none>
          

          Session AffinityNone 作为默认值,这意味着round robin 用于请求。

          您可以通过循环curl 并使用oc logsindex.html 响应正文(如果内容不同)监视pods,以round robin 的方式检查请求访问。

          while :; do curl http://172.30.177.72:8080/index.html; sleep 1;  done
          1.1.1.1:8080
          2.2.2.2:8080
          1.1.1.1:8080 
          2.2.2.2:8080
          ...
          

          【讨论】:

            猜你喜欢
            • 2019-03-21
            • 2020-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多