我已经部署了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 的静态定义。