Openshift Route无法从Service Pod进行负载平衡

时间:2019-02-06 12:00:38

标签: kubernetes openshift openshift-origin openshift-3

我以前在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在单个Service中运行。 现在,当我呼叫路线时,它始终显示Podip 1.1.1.1 我的路线从未碰到第二个吊舱。

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

但是它没有发生。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

这很简单:

  1. 如果从外部呼叫Pod,则它会从Router到Service再到Pod。如果在路由器上未将haproxy.router.openshift.io/disable_cookies批注设置为true,则服务将始终转发到同一吊舱。

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

  2. 如果要从另一个Pod内部调用Pod。它从服务到Pod。使用默认配置,服务可以很好地进行循环负载均衡。

所以您应该:

  • 如果您希望路由器公开服务,请在路由器上添加上述注释。
  • 如果只希望在内部访问服务,则不执行任何操作

(在Openshift 4.2.28上测试)

答案 2 :(得分:1)

  

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

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

# 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用于请求。

您可以通过round robincurl响应主体来监视pods(如果内容为不同)。

oc logs

答案 3 :(得分:0)

服务不会在Pod之间进行负载平衡,这是完全随机的。 RedHat支持已向我们确认了这一点。更重要的是,上面的答案仅在对curl进行不同调用的情况下进行了测试。

如果您在相同的curl上进行后续调用,您将看到正在重用连接。只需尝试:

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

与其进行交互,您将看到保持活动将重用连接,并且每次都在同一个Pod上结束