从 Pod 到由负载均衡器支持的公有 IP 的连接,该 IP 可返回到 k8s



我已经部署了nginx Ingress,该入口使用公共IP部署LoadBalancer类型的服务。externalTrafficPolicy设置为Local以保留客户端 IP。

Azure 负载均衡器配置良好,将对所有节点进行配置,运行状况检查可用于"禁用"没有 LB Pod 的节点。

从互联网=>豆荚的方向来看,它运行良好。但是,当 POD 尝试使用与 LB 的公共 IP 关联的域发出请求时,当 POD 与 LB 的其中一个 POD 不在同一节点上运行时,它会失败。

对于该节点,ipvsadm -Ln命令返回:

TCP  PUBLICIP:80 rr
TCP  PUBLICIP:443 rr

对于运行 POD 的节点

TCP  PUBLICIP:80 rr
-> 10.233.71.125:80             Masq    1      4          0         
TCP  PUBLICIP:443 rr
-> 10.233.71.125:443            Masq    1      0          0         

根据文档,IPVS 配置似乎是合法的:

  • https://kubernetes.io/docs/concepts/services-networking/service/#aws-nlb-support(它适用于AWS,但我想它应该对Azure有效(
  • https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport

这是一个问题还是一个限制?

如果这是一个限制,如何解决这个问题?例如。

  • 将 LB 部署为守护程序集,缺点是 LB pod 与节点一样多
  • 不要使用公共领域,而是使用 kubernetes fqdn(不容易实现(

还有其他解决方案吗?

谢谢!

版本/其他详细信息:

  • K8S:1.14.4
  • 云提供商:Azure(非AKS(

我最终实现了本期和本文中的建议。

我将以下代码片段添加到 CoreDNS 配置映射中

rewrite stop {
name regex example.com nginx-ingress-controller.my-ns.svc.cluster.local
answer name nginx-ingress-controller.my-ns.svc.cluster.local example.com
}

它使用了重写插件。运行良好,唯一的缺点是它依赖于入口控制器 fqdn 的静态定义。

最新更新