【问题标题】:Kubernetes 1.18.6 ServiceTopology and Ingress SupportKubernetes 1.18.6 ServiceTopology 和 Ingress 支持
【发布时间】:2020-12-03 12:48:36
【问题描述】:

我已经在自托管的 Kubernetes 集群中设置和配置了 Service Topology 功能。当我使用 ClusterIP 或 NodePort 将流量直接路由到配置的服务时,一切都按预期工作。尊重拓扑键,选择正确的节点路由到 pod 等。

但是,当使用映射到服务的入口时(尝试使用 haproxy 和 traefik 入口),拓扑感知路由将被忽略。我不确定这是否只是不受支持、错误或我缺少的某些配置。以下是我尝试过的方法。

1r) 客户端 curl -> 拓扑键控服务 -> 部署 -> Pod

结果:按预期工作。

2r)busybox pod curl -> 拓扑键控服务 -> 部署 -> Pod

结果:按预期工作。

3r) 客户端 curl -> Traefik Service Ingress 的路由 clusterIP -> Topology Keyed Service -> Deployment -> Pod

结果:所选节点 pod 是随机的,并且与节点上的拓扑键不对齐。

4r) client curl -> Host Networked Haproxy Ingress DaemonSet -> Topology Keyed Service -> Deployment -> Pod

结果:所选节点 pod 是随机的,并且与节点上的拓扑键不对齐。

据我所知,haproxy 和 traefik 入口似乎都将流量直接路由到 pod 并绕过服务。

我已经通过如下配置拓扑键对此进行了测试(没有 * catch-all,如果不匹配应该会失败):

topologyKeys:
  - "kubernetes.io/hostname"
  - "topology.kubernetes.io/zone"
  - "topology.kubernetes.io/region"

在使用 ingresses 进行测试时,服务将始终响应,但仍会在副本集中随机选择一个 pod。在使用服务进行测试时,如果没有 pod 满足接收入站请求的节点上的拓扑标签(如预期的那样),它将失败。

我已经查看了所有文档,并且已经花了很多时间在谷歌上搜索和查看 Github 问题,但找不到任何提到此作为问题或不受支持的配置等的内容。

-- 编辑--

感谢@Rico,我能够使用nginxhaproxy-ingress 在 Ingresses 上进行这项工作。该修复需要在入口上添加以下注释。

nginx:

annotations:
  nginx.ingress.kubernetes.io/service-upstream: "true"

代理入口:

annotations:
  ingress.kubernetes.io/service-upstream: "true"

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    这里的答案是,通常入口控制器与Endpoint API 对话,而不是服务 API。它记录在nginx ingress controller pageTraefik ingress controller 上。 (也许其他一些入口上没有)

    另一种选择是使用EndpointSlices,但截至今天,入口控制器还不支持。

    我相信这里的前进道路是让入口控制器到达start supporting EndpointSlices

    更新:

    nginx 入口控制器有一种方法可以使用nginx.ingress.kubernetes.io/service-upstream 注释绕过端点行为。 “但是你不能有自定义的 LB 算法或粘性会话”。

    ✌️

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-03
      • 2020-05-16
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多