0

我正试图在裸机 k8s 集群上将内部负载平衡暴露给外部世界。

假设我们有一个基本集群:

  1. 一些主节点和一些工作节点,有两个接口,一个面向公众 (eth0) 和一个本地 (eth1),ip 在 192.168.0.0/16 网络内

  2. 部署 MetalLB 并为其内部 ips 配置 192.168.200.200-192.168.200.254 范围

  3. 入口控制器及其服务类型为 LoadBalancer

根据我目前的理解,MetalLB 现在应该将 192.168.200.200-192.168.200.254 中的一个 ip 分配给入口服务。

但我有以下几个问题:

在每个节点上,我可以卷曲入口控制器 externalIP(只要它们在 eth1 上可访问)并附加主机头,并从在对应入口资源中配置的服务获得响应,还是仅在当前放置入口 pod 的节点上有效?

将传入的外部流量传递到 eth0 到在 eth1 网络上侦听的入口有哪些选择?

是否可以转发保存源 IP 地址的请求或附加 X-Forwarded-For 标头是唯一的选择?

4

1 回答 1

2

假设我们正在谈论Metallb使用Layer2.

解决以下问题:

在每个节点上,我可以卷曲入口控制器 externalIP(只要它们在 eth1 上可访问)并附加主机头,并从在对应入口资源中配置的服务获得响应,还是仅在当前放置入口 pod 的节点上有效?

是否可以转发保存源 IP 地址的请求或附加 X-Forwarded-For 标头是唯一的选择?

在保留源IP的前提下划分解决方案,这个问题可以是双向的:


保留源 IP 地址

为此,您需要通过设置(在您的清单中)设置Service of type LoadBalancerIngress 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
于 2021-05-10T15:27:25.950 回答