我已经在自托管的Kubernetes集群中设置并配置了服务拓扑功能。当我使用ClusterIP或NodePort将流量直接路由到配置的服务时,一切都按预期进行。遵守拓扑密钥,选择正确的节点路由到吊舱等。
然而,当使用映射到服务的入口(尝试使用haproxy和traefik入口(时,会忽略拓扑感知路由。我不确定这是不是不受支持,是一个错误,还是我缺少了一些配置。以下是我尝试过的方法。
1r(客户端卷曲->拓扑键控服务->部署->吊舱
结果:工作符合预期。
2r(busybox吊舱卷曲->拓扑键控服务->部署->吊舱
结果:工作符合预期。
3r(客户端卷曲->Traefik服务入口的路由集群IP->拓扑键控服务->部署->吊舱
结果:选定的节点pod是随机的,并且不与节点上的拓扑关键帧对齐。
4r(客户端卷曲->主机网络化Haproxy入口DaemonSet->拓扑键控服务->部署->吊舱
结果:选定的节点pod是随机的,并且不与节点上的拓扑关键帧对齐。
据我所知,似乎haproxy和traefik入口都将流量直接路由到吊舱,并绕过服务。
我已经通过如下配置拓扑密钥来测试了这一点(没有*catch-all,如果不匹配就会失败(:
topologyKeys:
- "kubernetes.io/hostname"
- "topology.kubernetes.io/zone"
- "topology.kubernetes.io/region"
当使用入侵进行测试时,服务将始终做出响应,尽管仍然会在副本集中随机选择一个pod。在使用该服务进行测试时,如果没有pod对接收入站请求的节点上的拓扑标签感到满意(如预期(,则该服务将失败。
我已经查看了所有的文档,花了很多小时在谷歌上搜索和查看Github的问题,但找不到任何关于这是一个问题或不支持的配置等的信息。
--编辑--
多亏了@Rico,我能够用nginx和haproxy入口在ingress上完成这项工作。该修复程序需要在入口上添加以下注释。
nginx:
annotations:
nginx.ingress.kubernetes.io/service-upstream: "true"
haproxy入口:
annotations:
ingress.kubernetes.io/service-upstream: "true"
这里的答案是,入口控制器通常与Endpoint API而不是服务API对话。它记录在nginx入口控制器页面和Traefik入口控制器上。(可能不是在其他一些入侵上(
另一种选择是使用EndpointSlices,但到目前为止,入口控制器还不支持它。
我相信这里的前进道路是入口控制器开始支持EndpointSlices。
更新:
nginx入口控制器有一种方法可以通过nginx.ingress.kubernetes.io/service-upstream注释绕过Endpoint行为"但是你不能有自定义LB算法或粘性会话;。
✌️