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/speaker
daemonset。这是说出您选择的协议以使服务可达的组件。 - 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.240
到192.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网站上的标签文档。
例如,这是一个只有机器使用的对等体(有点人为的)定义:
- 使用主机名
hostA
或hostB
,或 - 有
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