假设我们正在谈论Metallb
使用Layer2
.
解决以下问题:
在每个节点上,我可以卷曲入口控制器 externalIP(只要它们在 eth1 上可访问)并附加主机头,并从在对应入口资源中配置的服务获得响应,还是仅在当前放置入口 pod 的节点上有效?
是否可以转发保存源 IP 地址的请求或附加 X-Forwarded-For 标头是唯一的选择?
在保留源IP的前提下划分解决方案,这个问题可以是双向的:
保留源 IP 地址
为此,您需要通过设置(在您的清单中)设置Service of type LoadBalancer
您Ingress controller
的支持“本地流量策略” :YAML
.spec.externalTrafficPolicy: Local
只要每个Node
都有您的副本,此设置就有效,因为Ingress controller
进入您的控制器的所有网络都将包含在单个Node
.
引用官方文档:
使用Local
流量策略,kube-proxy
在接收流量的节点上,仅将流量发送到同一节点上的服务 Pod。节点之间没有“水平”的流量。
因为kube-proxy
不需要在集群节点之间发送流量,所以你的 Pod 可以看到传入连接的真实源 IP 地址。
此策略的缺点是传入流量仅流向服务中的某些 pod。不在当前领导节点上的 Pod 不会接收流量,它们只是作为副本存在,以防需要故障转移。
Metallb.universe.tf:用法:本地流量策略
不保留源 IP 地址
如果您的用例不需要您保留源 IP 地址,则可以使用:
.spec.externalTrafficPolicy: Cluster
此设置不需要您的副本Ingress controller
出现在每个Node
.
引用官方文档:
使用默认Cluster
流量策略,kube-proxy
在接收到流量的节点上进行负载均衡,并将流量分发到服务中的所有 Pod。
此策略导致服务中所有 pod 的流量分布均匀。但是,kube-proxy
在进行负载平衡时会掩盖连接的源 IP 地址,因此您的 pod 日志将显示外部流量似乎来自服务的领导节点。
Metallb.universe.tf:用法:集群流量策略
解决第二个问题:
将传入的外部流量传递到 eth0 到在 eth1 网络上侦听的入口有哪些选择?
Metallb 默认监听所有接口,你需要做的就是eth
在 Metallb 配置中指定地址池。
您可以通过以下方式找到有关此主题的更多参考:
此类配置的示例如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools: # HERE
- name: my-ip-space
protocol: layer2
addresses:
- 192.168.1.240/28