0

我想问你一些帮助:

http/https 集群的入口点是 NGINX:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0 作为 deamonset 运行

我想实现两件事:

  1. 保留客户端的源IP
  2. 将流量直接发送到当前服务器上的 nginx 副本(因此,如果请求被发送到服务器 A,列为外部 IP 地址,节点 A 上的 nginx 应该处理它)

问题:

  • 这怎么可能?
  • 没有nodeport可以吗?控制平面可以使用自定义 --service-node-port-range 启动,因此我可以为 80 和 443 添加 nodeport,但它看起来有点像 hack(在阅读了关于 nodeport 的预期用途之后)

我正在考虑使用metallb,但是 layer2 配置会导致瓶颈(集群上的高流量)。我不确定BGP是否会解决这个问题。

  • Kubernetes v15
  • 裸机
  • Ubuntu 18.04
  • Docker (18.9)和 WeaveNet (2.6)
4

1 回答 1

1

您可以使用externalTrafficPolicyset to保留客户端的源 IP local,这会将请求代理到本地端点。这在Source IP for Services with Type=NodePort中进行了解释。

还可以看看Using Source IP

MetalLB的情况下:

MetalLB 尊重服务的 externalTrafficPolicy 选项,并根据您选择的策略实施两种不同的公告模式。如果您熟悉 Google Cloud 的 Kubernetes 负载均衡器,您可能可以跳过此部分:MetalLB 的行为和权衡是相同的。

“本地”流量策略

使用 Local 流量策略,节点只有在本地运行一个或多个服务的 Pod 时才会吸引流量。BGP 路由器将仅在当前托管服务的那些节点之间对传入流量进行负载平衡。在每个节点上,流量仅通过 转发到本地 Pod kube-proxy,节点之间没有“水平”流量。

此策略为您的服务提供最有效的流量。此外,由于 kube-proxy 不需要在集群节点之间发送流量,您的 Pod 可以看到传入连接的真实源 IP 地址。

该策略的缺点是它将每个集群节点视为一个负载平衡的“单元”,而不管该节点上运行了多少服务的 pod。这可能会导致您的 pod 的流量不平衡。

例如,如果您的服务在节点 A 上运行 2 个 Pod,在节点 B 上运行一个 Pod,则 Local 流量策略会将服务流量的 50% 发送到每个 节点。节点 A 将在其两个 pod 之间平均分配其接收的流量,因此节点 A 的每个 pod 的最终每个 pod 负载分配为 25%,节点 B 的 pod 为 50%。相反,如果您使用 Cluster 流量策略,每个 Pod 将接收到总流量的 33%。

一般来说,在使用 Local 流量策略时,建议对 Pod 到节点的映射进行精细控制,例如使用node anti-affinity,以便将跨节点的均匀流量转换为跨 Pod 的均匀流量。

您需要考虑到MetalLB的BGP 路由协议的限制。

另请查看这篇博客文章Using MetalLb with Kind

于 2019-08-27T10:20:40.843 回答