本文共 8957 字,大约阅读时间需要 29 分钟。
Kubernetes旨在与主要云提供商的负载平衡器集成,以提供公共IP地址并将流量定向到群集中。 一些专业的网络设备制造商还提供控制器,以将其物理负载平衡产品集成到专用数据中心的Kubernetes安装中。 但是,对于在家中运行Kubernetes集群的发烧友来说,这两种解决方案都不会有帮助。
Kubernetes没有内置的网络负载均衡器实现。 裸机集群,例如集群,或者实际上是部署在公共云外部且缺少昂贵的专业硬件的任何集群,都需要另一种解决方案。 无论对于发烧友还是大规模部署, 都能满足这一需求。
MetalLB是一个网络负载平衡器,可以在网络上的专用IP地址上公开群集服务,从而允许外部客户端连接到Kubernetes群集中的服务。 它通过使用 (ARP)的 或使用 (BGP)的来完成此操作。
虽然Kubernetes确实有一个称为东西,它允许将HTTP和HTTPS流量公开到群集之外,但它仅支持HTTP或HTTPS流量,而MetalLB可以支持任何网络流量。 但是,这更像是一个橘子的比较,因为MetalLB为未分配的IP地址提供了对特定群集节点的解析,并将该IP分配给了服务,而Ingress使用了特定的IP地址并在内部路由HTTP或HTTPS流量根据路由规则连接到一个或多个服务。
MetalLB只需几个步骤即可设置,在私有homelab集群中特别有用,在Kubernetes集群中,它的行为与公共云负载均衡器集成相同。 这对于教育目的(即,学习技术的工作原理)非常有用,并且可以更轻松地在内部部署和云环境之间“提升和转移”工作负载。
如前所述,MetalLB通过ARP或BGP来将IP地址解析为特定主机。 简而言之,这意味着当客户端尝试连接到特定IP时,它将询问“哪个主机拥有此IP?”。 响应会将其指向正确的主机(即主机的MAC地址)。
使用ARP,请求将被广播到整个网络,并且知道该IP地址的主机会响应该请求。 在这种情况下,MetalLB的答案会将客户端定向到正确的节点。
使用BGP,每个“对等”维护一个路由信息表,将客户端定向到处理IP的特定IP的主机以及对等方知道的主机,并将此信息发布给对等方。 为BGP配置后,MetalLB将群集中的每个节点与网络的路由器对等,从而允许路由器将客户端定向到正确的主机。
在下面的练习中,您将使用ARP。 消费者级路由器不(至少很容易)不支持BGP,甚至支持BGP的高端消费者或专业路由器也可能难以设置。 ARP(特别是在小型家庭网络中)可能同样有用,并且不需要网络上的任何配置即可工作。 实施起来相当容易。
安装MetalLB非常简单。 从下载或复制两个清单, 其应用于Kubernetes。 这两个清单创建了名称空间,MetalLB的组件将被部署到这些组件以及组件本身:MetalLB控制器,“发言人”守护程序集和服务帐户。
一旦创建了组件,就会生成一个随机秘密,以允许扬声器之间进行加密通信(即,“说出”协议以使服务可访问的组件)。
(注意:这些步骤也可以在MetalLB的网站上找到。)
具有必需的MetalLB组件的两个清单是:
可以使用kubectl apply
命令将它们下载到本地或直接从Web上应用到Kubernetes集群:
# Verify the contents of the files, then download and pipe then to kubectl with curl # (output omitted) $ kubectl apply -f https: // raw.githubusercontent.com / metallb / metallb / v0.9.3 / manifests / namespace.yaml $ kubectl apply -f https: // raw.githubusercontent.com / metallb / metallb / v0.9.3 / manifests / metallb.yaml
应用清单后,为讲话者创建一个随机的Kubernetes机密,以用于加密通信:
# Create a secret for encrypted speaker communications $ kubectl create secret generic -n metallb-system memberlist --from-literal = secretkey = " $(openssl rand -base64 128) "
完成上述步骤将创建并启动所有MetalLB组件,但是在配置它们之前它们不会做任何事情。 要配置MetalLB,请创建一个configMap来描述负载均衡器将使用的IP地址池。
MetalLB需要最后设置:一个configMap,其中包含可以分配给Kubernetes Service LoadBalancers的地址的详细信息。 但是,有一个小考虑。 使用中的地址不需要绑定到网络中的特定主机,但是对于MetalLB来说,它们必须是免费的,并且不能分配给其他主机。
在我的家庭网络中,IP地址是由路由器正在运行的DHCP服务器分配的。 此DHCP服务器不应尝试分配MetalLB将使用的地址。 大多数消费类路由器允许您决定子网的大小,并且可以将其配置为通过DHCP仅将该子网中IP的子集分配给主机。
在我的网络中,我使用的子网为192.168.2.1/24
,因此我决定将一半的IP分配给MetalLB。 子网的前半部分由192.168.2.1
到192.168.2.126
的IP地址组成。 此范围可以用/25
子网表示: 192.168.2.1/25
。 子网的后半部分可以类似地用/25
子网表示: 192.168.2.128/25
。 每个部分包含126个IP,足以容纳主机和Kubernetes服务。 确保确定适合您自己网络的子网,并适当配置路由器和MetalLB。
在配置路由器以忽略192.168.2.128/25
子网(或您使用的任何子网)中的地址之后,创建一个configMap来告诉MetalLB使用该地址池:
# Create the config map $ cat << EOF | kubectl create -f - apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: address-pool- 1 protocol: layer2 addresses: - 192.168.2.128 / 25 EOF
上面的示例configMap使用表示法,但是地址列表也可以指定为范围:
addresses : - 192.168.2.128-192.168.2.254
创建configMap之后,MetalLB将处于活动状态。 是时候尝试一下!
您可以通过创建示例Web服务来测试新的MetalLB配置,并且可以使用本系列中的一个:Kube Verify。 使用同一张图片测试MetalLB是否按预期工作: quay.io/clcollins/kube-verify:01
: quay.io/clcollins/kube-verify:01
。 该映像包含一个Nginx服务器,该服务器在端口8080上侦听请求。您可以用于创建映像 。 如果需要,可以改为从Containerfile构建自己的容器映像并将其用于测试。
如果您以前在Raspberry Pis上创建了Kubernetes集群,则可能已经在运行Kube Verification服务,并且可以创建LoadBalancer类型的服务的部分。
如果您还没有kube-verify
命名空间,请使用kubectl
命令创建一个:
# Create a new namespace $ kubectl create namespace kube-verify # List the namespaces $ kubectl get namespaces NAME STATUS AGE default Active 63m kube-node-lease Active 63m kube-public Active 63m kube-system Active 63m metallb-system Active 21m kube-verify Active 19s
创建名称空间后,在该名称空间中创建一个部署:
# Create a new deployment $ cat << EOF | kubectl create -f - apiVersion: apps / v1 kind: Deployment metadata: name: kube-verify namespace: kube-verify labels: app: kube-verify spec: replicas: 3 selector: matchLabels: app: kube-verify template: metadata: labels: app: kube-verify spec: containers: - name: nginx image: quay.io / clcollins / kube-verify:01 ports: - containerPort: 8080 EOF deployment.apps / kube-verify created
现在,通过创建LoadBalancer类型的Kubernetes服务公开部署。 如果您已经有一个名为kube-verify
的服务,它将替换该服务:
# Create a LoadBalancer service for the kube-verify deployment cat << EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: kube-verify namespace: kube-verify spec: selector: app: kube-verify ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer EOF
您可以使用kubectl expose
命令完成同样的事情:
kubectl expose deployment kube-verify -n kube-verify --type =LoadBalancer --target-port = 8080 --port = 80
MetalLB正在侦听LoadBalancer类型的服务,并立即分配一个外部IP(从设置MetalLB时选择的范围中选择的IP)。 使用kubectl get service
命令查看新服务以及分配给它的外部IP地址MetalLB:
# View the new kube-verify service $ kubectl get service kube-verify -n kube-verify NAME TYPE CLUSTER-IP EXTERNAL-IP PORT ( S ) AGE kube-verify LoadBalancer 10.105.28.147 192.168.2.129 80 : 31491 / TCP 4m14s # Look at the details of the kube-verify service $ kubectl describe service kube-verify -n kube-verify Name: kube-verify Namespace: kube-verify Labels: app =kube-verify Annotations: < none > Selector: app =kube-verify Type: LoadBalancer IP: 10.105.28.147 LoadBalancer Ingress: 192.168.2.129 Port: < unset > 80 / TCP TargetPort: 8080 / TCP NodePort: < unset > 31491 / TCP Endpoints: 10.244.1.50: 8080 ,10.244.1.51: 8080 ,10.244.2.36: 8080 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal IPAllocated 5m55s metallb-controller Assigned IP "192.168.2.129" Normal nodeAssigned 5m55s metallb-speaker announcing from node "gooseberry"
在kubectl describe
命令的输出中,请注意底部的事件,其中MetalLB已分配了IP地址(您的情况会有所不同),并且正在“宣布”集群中节点之一的分配(同样,您的情况也会有所不同) 。 它还描述了端口,可从中访问服务的外部端口(80),容器内的目标端口(端口8080)以及通信将通过其路由的节点端口(31491)。 最终结果是,可以从家庭网络中的任何位置从端口80上的负载平衡IP访问在kube-verify
服务的kube-verify
运行的Nginx服务器。
例如,在我的网络上,该服务在http://192.168.2.129:80
公开,并且我可以从同一网络上的笔记本电脑curl
该IP:
# Verify that you receive a response from Nginx on the load-balanced IP $ curl 192.168.2.129 < html xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "en" lang = "en" > < head > < title > Test Page for the HTTP Server on Fedora ( further output omitted )
MetalLB是家用Kubernetes集群的出色负载平衡器。 它允许您将家庭网络中的真实IP分配给群集中运行的服务,并从家庭网络中的其他主机访问它们。 通过家庭路由器的端口转发流量,这些服务甚至可以暴露在网络外部(但请注意这一点!)。 MetalLB可以轻松地在裸机,基于Raspberry Pi的集群甚至是虚拟机上在家中复制类似云提供商的行为,从而轻松地将工作负载“转移”到云中,或者只是熟悉它们的工作方式工作。 最重要的是,MetalLB简便易行,使访问群集中运行的服务变得轻而易举。
您使用过MetalLB,还是使用其他负载平衡器解决方案? 您主要使用Nginx还是HAProxy Ingress? 在评论中让我知道!
翻译自:
转载地址:http://updzd.baihongyu.com/