博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用MetalLB在您的Raspberry Pi家庭实验室上安装Kubernetes负载均衡器
阅读量:2524 次
发布时间:2019-05-11

本文共 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集群中,它的行为与公共云负载均衡器集成相同。 这对于教育目的(即,学习技术的工作原理)非常有用,并且可以更轻松地在内部部署和云环境之间“提升和转移”工作负载。

ARP与BGP

如前所述,MetalLB通过ARP或BGP来将IP地址解析为特定主机。 简而言之,这意味着当客户端尝试连接到特定IP时,它将询问“哪个主机拥有此IP?”。 响应会将其指向正确的主机(即主机的MAC地址)。

使用ARP,请求将被广播到整个网络,并且知道该IP地址的主机会响应该请求。 在这种情况下,MetalLB的答案会将客户端定向到正确的节点。

使用BGP,每个“对等”维护一个路由信息表,将客户端定向到处理IP的特定IP的主机以及对等方知道的主机,并将此信息发布给对等方。 为BGP配置后,MetalLB将群集中的每个节点与网络的路由器对等,从而允许路由器将客户端定向到正确的主机。

在下面的练习中,您将使用ARP。 消费者级路由器不(至少很容易)不支持BGP,甚至支持BGP的高端消费者或专业路由器也可能难以设置。 ARP(特别是在小型家庭网络中)可能同样有用,并且不需要网络上的任何配置即可工作。 实施起来相当容易。

安装MetalLB

安装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.1192.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将处于活动状态。 是时候尝试一下!

测试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命名空间

如果您还没有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服务

现在,通过创建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
)

金属LB FTW

MetalLB是家用Kubernetes集群的出色负载平衡器。 它允许您将家庭网络中的真实IP分配给群集中运行的服务,并从家庭网络中的其他主机访问它们。 通过家庭路由器的端口转发流量,这些服务甚至可以暴露在网络外部(但请注意这一点!)。 MetalLB可以轻松地在裸机,基于Raspberry Pi的集群甚至是虚拟机上在家中复制类似云提供商的行为,从而轻松地将工作负载“转移”到云中,或者只是熟悉它们的工作方式工作。 最重要的是,MetalLB简便易行,使访问群集中运行的服务变得轻而易举。

您使用过MetalLB,还是使用其他负载平衡器解决方案? 您主要使用Nginx还是HAProxy Ingress? 在评论中让我知道!

翻译自:

转载地址:http://updzd.baihongyu.com/

你可能感兴趣的文章
fatal error C1853
查看>>
Ural 1001 - Reverse Root
查看>>
玩转webpack之webpack的entry output
查看>>
java 操作mongodb查询条件的常用设置
查看>>
黑马程序员_java基础笔记(02)...java语言基础组成
查看>>
对innodb 拷贝文件实现数据库的方式(转)
查看>>
python知识点 2014-07-09
查看>>
FloatingActionButton的一点学习感悟
查看>>
ABAP CDS ON HANA-(10)項目結合して一つ項目として表示
查看>>
网站地址信息
查看>>
产品经理 - 登录 注册
查看>>
Notepad++ 通过g++编译
查看>>
Ruby Gem 的基础知识和详解
查看>>
Vue学习
查看>>
html5的本地存储
查看>>
Java设计模式系列之中介者模式
查看>>
eclipse编译时过滤SVN版本控制信息方法(转)
查看>>
CSS3中使用calc()设置宽度和高度
查看>>
泉五培训Day5
查看>>
理解constructor属性
查看>>