Kubernetes负载均衡器服务数据包源IP

时间:2019-04-21 13:41:20

标签: networking kubernetes kubernetes-ingress

我有一个使用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?

1 个答案:

答案 0 :(得分:0)

我已经解决了问题,原来在我的原始配置中有几个问题。

首先,我没有提到我的网络提供商是什么。我正在使用weave-net,事实证明,即使kubernetes文档指出要保留源IP足以将externalTrafficPolicy: Local添加到负载均衡器服务中,除非专门启用它,否则它不适用于weave-net。 。因此,在我使用的编织网版本(2.5.1)中,您必须将以下环境变量添加到编织网DeamonSet NO_MASQ_LOCAL=1中。有关更多详细信息,请参见其documentation

老实说,此后,我的记忆有些模糊,但我认为您在现阶段所获得的是一个集群,其中:

  • NodePort服务:不支持源IP保留。某种程度上,它可以在AWS上运行,但kubernetes本身不支持裸机,而weave-net则没有错。
  • IP绑定到另一个节点Y的IP的节点上的
  • LoadBalancer服务:不支持源IP保留,因为必须在kubernetes网络内部路由流量。
  • 在IP X绑定到同一IP X的节点上的
  • LoadBalancer服务:我不清楚,但是我认为这可行。

第二,关键是kubernetes不支持真正的LoadBalancer服务。如果您决定坚持使用“标准”设置而没有其他任何设置,则必须限制Pod使其仅在绑定了LB IP地址的群集节点上运行。由于您非常依赖节点上组件的特定排列,因此管理群集非常麻烦。您还将失去冗余。

要解决第二个问题,您必须为裸机设置配置一个负载平衡器实现提供程序。我个人使用过MetalLB。对其进行配置后,就可以为负载均衡器服务提供虚拟IP地址列表,从某种意义上说,这些IP地址未附加到特定节点。每次kubernetes启动一个pod来接受LB服务的流量;它将虚拟IP地址之一附加到同一节点。因此,LB IP地址始终随Pod一起移动,而您不必通过kubernetes网络路由外部流量。结果,您可以100%保留源IP。