Metallb--私有集群的LoadBalancer

背景

Kubernetes没有为裸机群集提供网络负载均衡器(LoadBalancer)的实现。Kubernetes提供的Network LB的实现都是粘合代码,可以调用各种IaaS平台(GCP,AWS,Azure ......)。如果您未在受支持的IaaS平台(GCP,AWS,Azure ...)上运行,则LoadBalancers将在创建时无限期地保持“挂起”状态。

裸机群集运营商留下了两个较小的工具来将用户流量带入其集群,“NodePort”和“externalIPs”服务。这两种选择都对生产使用具有重大缺点,这使得裸露的金属集群成为Kubernetes生态系统中的二等公民。

MetalLB旨在通过提供与标准网络设备集成的网络LB实现来纠正这种不平衡,以便裸机集群上的外部服务也“尽可能”地工作。

要求

MetalLB需要以下功能:

  • 一个Kubernetes集群,运行Kubernetes 1.13.0或更高版本。
  • 群集的网络配置可以与MetalLB共存。
  • MetalLB的一些IPv4地址可以分发。
  • 根据操作模式,可能需要一个或多个能够说BGP的路由器 。

依赖须知

网络插件兼容性

网络插件CompatibleCalico部分(查看known issues)CanalYesCiliumYesFlannelYesKube-router部分 (查看known issues)Romana是(查看guide for advanced integration)Weave Net是(查看known issues)

kube-proxy中的IPVS模式

从Kubernetes 1.9开始kube-proxy,除了默认的“iptables模式”之外,还支持更高效的“IPVS模式”.MetalLB 可以在kubenetes 1.13或更高版本的kube-proxy中使用IPVS模式。但是,它尚未明确测试,因此风险自负。请参阅跟踪错误了解详情

安装

安装MetalLB有两种支持的方法:使用Kubernetes清单或使用Helm包管理器。

使用 yaml 部署

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.1/manifests/metallb.yaml

这将在metallb-system 命名空间下将MetalLB部署到集群。清单中的组件是:

  • metallb-system/controller部署。这是处理IP地址分配的群集范围控制器。
  • metallb-system/speakerdaemonset。这是说出您选择的协议以使服务可达的组件。
  • controller和speaker的Service accounts,以及组件需要运行的RBAC权限。

安装清单不包含配置文件。MetalLB的组件仍将启动,但在您定义和部署configmap之前将保持空闲状态 。

使用 helm 部署

helm install --name metallb stable/metallb

配置

二层模式

第2层模式是最简单的配置:在许多情况下,您不需要任何特定于协议的配置,只需要IP地址。

第2层模式不要求将IP绑定到工作节点的网络接口。它的工作原理是直接响应本地网络上的ARP请求,将机器的MAC地址提供给客户端。

例如,下面的配置给出了由iPS MetalLB控制192.168.1.240192.168.1.250,并配置2层模式:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250

BGP配置

对于具有一个BGP路由器和一个IP地址范围的基本配置,您需要4条信息:

  • MetalLB应连接的路由器IP地址,
  • 路由器的AS号,
  • MetalLB应该使用的AS编号,
  • IP地址范围,表示为CIDR前缀。

例如,如果要为MetalLB提供范围192.168.10.0/24和AS号64500,并将其连接到10.0.0.1的AS号为64501的路由器,则您的配置将如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    peers:
    - peer-address: 10.0.0.1
      peer-asn: 64501
      my-asn: 64500
    address-pools:
    - name: default
      protocol: bgp
      addresses:
      - 192.168.10.0/24

advertisements配置

缺省情况下,BGP模式将每个分配的IP通告给配置的对等体,没有其他BGP属性。对等路由器将为/32每个服务IP 接收一个路由,BGP localpref设置为零,没有BGP社区。

您可以通过添加bgp-advertisements列出一个或多个自定义广告的部分来配置更精细的 广告。

除了指定localpref和community之外,您还可以使用它来通告聚合路由。该aggregation-length广告选项允许你“卷起的” / 32S到一个更大的前缀。结合多种广告配置,您可以创建与BGP网络其余部分互操作的精细广告。

例如,假设您租用/24了公共IP空间,并将其分配给MetalLB。默认情况下,MetalLB会将每个IP通告为/ 32,但您的运输提供商会拒绝更具体的路由/24。因此,您需要以某种方式/24向您的运输提供商宣传,但仍然能够在内部进行每IP路由。

这是一个实现这个的配置:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    peers:
    - peer-address: 10.0.0.1
      peer-asn: 64501
      my-asn: 64500
    address-pools:
    - name: default
      protocol: bgp
      addresses:
      - 198.51.100.0/24
      bgp-advertisements:
      - aggregation-length: 32
        localpref: 100
        communities:
        - no-advertise
      - aggregation-length: 24
    bgp-communities:
      no-advertise: 65535:65282

使用此配置,如果我们使用IP 198.51.100.10创建服务,则BGP对等方将接收两个路由:

  • 198.51.100.10/32,localpref = 100和no-advertise 社区,它告诉对等路由器他们可以使用这条路由,但他们不应该告诉其他人。
  • 198.51.100.0/24,没有自定义属性。

使用此配置,对等方将传输 198.51.100.0/24路由到您的传输提供程序,但是一旦流量显示在本地,该198.51.100.10/32路由将用于转发到您的群集。

当您定义更多服务时,路由器将为/32 每个服务接收一个“本地” 服务以及覆盖/24。您定义的每个服务都“生成” /24路由,但MetalLB会在与其对等方通信之前将它们全部重复删除到一个BGP广告。

上面的配置还展示了bgp-communities 配置部分,它允许您为可在广告配置中重用的BGP社区定义可读名称。这是完全可选的,您可以65535:65281直接在/24您喜欢的配置中指定 。

将对等端限制为某些节点

默认情况下,群集中的每个节点都连接到配置中列出的所有对等方。在更高级的集群拓扑中,您可能希望每个节点都连接到不同的路由器。例如,如果您具有“机架和主干”网络拓扑,则可能希望每台计算机与其架顶式路由器对等,而不是其他机架中的路由器。

MetalLB
SpeakerMetalLB
SpeakerMetalLB
SpeakerMetalLB
SpeakerToR RouterToR RouterSpine Router

您可以使用node-selectors 配置中的对等项属性将对等端限制为某些节点。这些选择器的语义与Kubernetes中其他地方使用的语义相同,因此请参阅 Kubernetes网站上的标签文档

例如,这是一个只有机器使用的对等体(有点人为的)定义:

  • 使用主机名hostAhostB,或
  • rack=frontend标签,但没有标签network-speed=slow
peers:
- peer-address: 10.0.0.1
  peer-asn: 64501
  my-asn: 64500
  node-selectors:
  - match-labels:
      rack: frontend
    match-expressions:
    - key: network-speed
      operator: NotIn
      values: [slow]
  - match-expressions:
    - key: kubernetes.io/hostname
      operator: In
      values: [hostA, hostB]

高级地址池配置

控制自动地址分配

在某些环境中,您将拥有一些“廉价”IP(例如RFC1918)的大型地址池,以及一些较小的“昂贵”IP池(例如租用的公共IPv4地址)。

默认情况下,MetalLB将从具有空闲地址的任何已配置地址池分配IP。对于不需要它的服务,这可能最终使用“昂贵”的地址。

若要防止此行为,您可以通过将auto-assign标志设置为以下来禁用池的自动分配false

# Rest of config omitted for brevity
address-pools:
- name: cheap
  protocol: bgp
  addresses:
  - 192.168.144.0/20
- name: expensive
  protocol: bgp
  addresses:
  - 42.176.25.64/30
  auto-assign: false

引用参考