Kubernetes 1.18.6 ServiceTopology 和 Ingress 支持
Kubernetes 1.18.6 ServiceTopology and Ingress Support
我已经在自托管 Kubernetes 集群中设置并配置了 Service Topology 功能。当我使用 ClusterIP 或 NodePort 将流量直接路由到配置的服务时,一切都按预期工作。遵守拓扑键,选择正确的节点路由到 pod,等等
但是,当使用映射到服务的入口时(尝试使用 haproxy 和 traefik 入口),拓扑感知路由将被忽略。我不确定这是否不受支持、错误或我缺少的某些配置。以下是我试过的方法
1r) client curl -> Topology Keyed Service -> Deployment -> Pod
结果:按预期工作。
2r) busybox pod curl -> Topology Keyed Service -> Deployment -> Pod
结果:按预期工作。
3r) client 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 入口都将流量直接路由到 pods 并绕过该服务。
我已经通过如下配置拓扑键进行了测试(没有 * catch-all,如果不匹配则应该失败):
topologyKeys:
- "kubernetes.io/hostname"
- "topology.kubernetes.io/zone"
- "topology.kubernetes.io/region"
在使用入口进行测试时,服务将始终响应,但仍会在副本集中随机选择一个 pod。使用该服务进行测试时,如果没有 pods 对接收入站请求的节点上的拓扑标签感到满意(如预期),它将失败。
我查看了所有文档并花了很多时间在谷歌上搜索和查看 Github 问题,但找不到任何提及此问题或不受支持的配置等的信息。
-- 编辑--
感谢@Rico,我能够通过 nginx and haproxy-ingress 在 Ingresses 上进行这项工作。该修复程序需要在入口处添加以下注释。
nginx:
annotations:
nginx.ingress.kubernetes.io/service-upstream: "true"
haproxy-入口:
annotations:
ingress.kubernetes.io/service-upstream: "true"
这里的答案是通常入口控制器与 Endpoint API and not the service API. It's documented on the nginx ingress controller page and the Traefik ingress controller 对话。 (也许不在其他一些入口处)
另一种选择是使用 EndpointSlices,但截至目前,入口控制器尚不支持。
我相信这里的前进道路是入口控制器 start supporting EndpointSlices。
更新:
nginx 入口控制器有一种方法可以通过 nginx.ingress.kubernetes.io/service-upstream 注释绕过端点行为。 “但是你不能有自定义的 LB 算法或粘性会话”。
✌️
我已经在自托管 Kubernetes 集群中设置并配置了 Service Topology 功能。当我使用 ClusterIP 或 NodePort 将流量直接路由到配置的服务时,一切都按预期工作。遵守拓扑键,选择正确的节点路由到 pod,等等
但是,当使用映射到服务的入口时(尝试使用 haproxy 和 traefik 入口),拓扑感知路由将被忽略。我不确定这是否不受支持、错误或我缺少的某些配置。以下是我试过的方法
1r) client curl -> Topology Keyed Service -> Deployment -> Pod
结果:按预期工作。
2r) busybox pod curl -> Topology Keyed Service -> Deployment -> Pod
结果:按预期工作。
3r) client 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 入口都将流量直接路由到 pods 并绕过该服务。
我已经通过如下配置拓扑键进行了测试(没有 * catch-all,如果不匹配则应该失败):
topologyKeys:
- "kubernetes.io/hostname"
- "topology.kubernetes.io/zone"
- "topology.kubernetes.io/region"
在使用入口进行测试时,服务将始终响应,但仍会在副本集中随机选择一个 pod。使用该服务进行测试时,如果没有 pods 对接收入站请求的节点上的拓扑标签感到满意(如预期),它将失败。
我查看了所有文档并花了很多时间在谷歌上搜索和查看 Github 问题,但找不到任何提及此问题或不受支持的配置等的信息。
-- 编辑--
感谢@Rico,我能够通过 nginx and haproxy-ingress 在 Ingresses 上进行这项工作。该修复程序需要在入口处添加以下注释。
nginx:
annotations:
nginx.ingress.kubernetes.io/service-upstream: "true"
haproxy-入口:
annotations:
ingress.kubernetes.io/service-upstream: "true"
这里的答案是通常入口控制器与 Endpoint API and not the service API. It's documented on the nginx ingress controller page and the Traefik ingress controller 对话。 (也许不在其他一些入口处)
另一种选择是使用 EndpointSlices,但截至目前,入口控制器尚不支持。
我相信这里的前进道路是入口控制器 start supporting EndpointSlices。
更新:
nginx 入口控制器有一种方法可以通过 nginx.ingress.kubernetes.io/service-upstream 注释绕过端点行为。 “但是你不能有自定义的 LB 算法或粘性会话”。
✌️