我有一个使用Kuberadm在裸机上设置的kubernetes 1.13版本集群(目前是一个节点)。该节点有2个网络接口连接到该节点以进行测试。理想情况下,将来,一个接口应面向Intranet,另一个接口应面向公共网络。届时节点数也将大于1。
对于Intranet入口,我使用具有以下配置的HAProxy舵图(https://github.com/helm/charts/tree/master/incubator/haproxy-ingress)设置:
rbac:
create: true
serviceAccount:
create: true
controller:
ingressClass: "intranet-ingress"
metrics:
enabled: true
stats:
enabled: true
service:
type: LoadBalancer
externalIPs:
- 10.X.X.X # IP of one of the network interfaces
service:
externalIPs:
- 10.X.X.X # IP of the same interface
流量随后按以下方式到达haproxy:
1. Client's browser, workstation has an IP from 172.26.X.X range
--local network, no NAT -->
2. Kubernetes server, port 443 of HAProxy's load balancer service
--magic done by kube-proxy, possibly NAT(which shoudn't have been here)-->
3. HAProxy's ingress controller pod
HAProxy访问日志显示源IP 10.32.0.1。这是来自kubernete网络层的IP。 Kubernetes pod CIDR为10.32.0.0/12。但是,我需要访问日志来显示连接的实际源IP。
我尝试手动编辑HAProxy创建的负载均衡器服务并设置externalTrafficPolicy: Local
。那没有帮助。
如何在此配置中获取客户端的源IP?
答案 0 :(得分:0)
我已经解决了问题,原来在我的原始配置中有几个问题。
首先,我没有提到我的网络提供商是什么。我正在使用weave-net,事实证明,即使kubernetes文档指出要保留源IP足以将externalTrafficPolicy: Local
添加到负载均衡器服务中,除非专门启用它,否则它不适用于weave-net。 。因此,在我使用的编织网版本(2.5.1)中,您必须将以下环境变量添加到编织网DeamonSet NO_MASQ_LOCAL=1
中。有关更多详细信息,请参见其documentation。
老实说,此后,我的记忆有些模糊,但我认为您在现阶段所获得的是一个集群,其中:
第二,关键是kubernetes不支持真正的LoadBalancer服务。如果您决定坚持使用“标准”设置而没有其他任何设置,则必须限制Pod使其仅在绑定了LB IP地址的群集节点上运行。由于您非常依赖节点上组件的特定排列,因此管理群集非常麻烦。您还将失去冗余。
要解决第二个问题,您必须为裸机设置配置一个负载平衡器实现提供程序。我个人使用过MetalLB。对其进行配置后,就可以为负载均衡器服务提供虚拟IP地址列表,从某种意义上说,这些IP地址未附加到特定节点。每次kubernetes启动一个pod来接受LB服务的流量;它将虚拟IP地址之一附加到同一节点。因此,LB IP地址始终随Pod一起移动,而您不必通过kubernetes网络路由外部流量。结果,您可以100%保留源IP。