目录

一、什么是MetalLB

1.1 基本概述       

2.1 工作原理

 1.3 工作模式

1.3.1 Layer2

1.3.2 BGP

二、MetalLB的安装

三、基本的操作命令

3.1 layer2模式

3.2 BGP模式

3.3 服务应用


一、什么是MetalLB

1.1 基本概述       

在使用kubenetes的过程中,主要解决将服务开放到集群外部访问的重要的问题。当使用云平台(阿里云、腾讯云、AWS等)的容器服务时,我们可以通过配置service为LoadBalancer模式来绑定云平台的负载均衡器,从而实现外网的访问。对于自建的kubernetes裸机集群我们一般使用MetalLB。

        祼机集群不支持负载均衡的方式,可用的不外乎NodePort、HostNetwork、ExternalIPs等方式来实现外部访问。但这些方式并不完美,而MetalLB旨在通过提供与标准网络设备集成的Network LB实施来解决这个痛点,从而使裸机群集上的外部服务也尽可能“正常运行”,减少运维上的管理成本。

官网地址:https://metallb.universe.tf/

2.1 工作原理

        Metallb包含两个组件,Controller(Deployment方式部署)和Speaker(daemonset方式部署)。

        具体的工作原理:

        Controller负责监听service变化,当service配置为LoadBalancer模式时,从IP池分配给到相应的IP,并进行IP的生命周期管理。

        Speaker则依据Service的变化,按具体的协议发起相应的广播或应答,根据工作模式(Layer2/BGP)的不同,可采用Leader的方式或负载均衡的方式来响应请求。

        当业务流量通过TCP/UDP协议到达指定的Node时,由Node上面运行的Kube-Proxy组件对流量进行处理,并分发到对应的Pod上面。

图 1 Metallb的工作原理

 1.3 工作模式

1.3.1 Layer2

运行方式:       

        第2层模式下,Metallb在Node节点中选一台主机为Leader,使与服务IP相关的所有流量都会流向Leader节点。在该节点上, kube-proxy将流量传播到所有服务的Pod,而当leader节点出现故障时,会由另一个节点接管。

缺点:单点瓶颈、故障转移慢

        单点瓶颈:

        单个leader选举节点接收服务IP的所有流量。这意味着服务的入口带宽被限制为单个节点的带宽,单节点的流量处理能力将成为整个集群的接收外部流量的瓶颈。

        故障转移:

        在实际工作环境中,节点之间的故障转移取决于客户端的合作。当发生故障转移时,MetalLB发送许多2层数据包,以通知客户端与服务IP关联的MAC地址已更改。大多数操作系统能正确处理数据包,并迅速更新其邻居缓存。在这种情况下,故障转移将在几秒钟内发生。在计划外的故障转移期间,在有故障的客户端刷新其缓存条目之前,将无法访问服务IP。对于生产环境如果要求毫秒性的故障切换,目前Metallb可能会比较难适应要求。

1.3.2 BGP

运行方式:

        群集中的每个节点都与网络路由器建立BGP对等会话,并使用该对等会话通告外部群集服务的IP。假设您的路由器配置为支持多路径,则可以实现真正的负载均衡(MetalLB发布的路由彼此等效)。这意味着路由器将一起使用所有下一跳,并在它们之间进行负载平衡。数据包到达节点后,kube-proxy负责流量路由的最后一跳,将数据包送达服务中的一个特定容器。

        负载平衡的方式取决于您特定的路由器型号和配置,但是常见的行为是基于数据包哈希值来平衡每个连接,这意味着单个TCP或UDP会话的所有数据包都将定向到群集中的单个计算机。

局限性:

        基于BGP的路由器实现无状态负载平衡。他们通过对数据包头中的某些字段进行哈希处理,并将该哈希值用作可用后端数组的索引,将给定的数据包分配给特定的下一跳。
        但路由器中使用的哈希通常不稳定,因此,只要后端集的大小发生变化(例如,当节点的BGP会话断开时),现有连接就会被随机有效地重新哈希,这意味着大多数现有连接连接最终将突然转发到另一后端,而该后端不知道所讨论的连接。

二、MetalLB的安装

官方指南:https://metallb.universe.tf/installation/

##设置kubernetes的kube-proxy的ARP模式
[root@server1 ingress]# kubectl edit configmap -n kube-system kube-proxy
configmap/kube-proxy edited
...
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true
...

##获取两个配置文件
[root@server1 metallb]#  kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
[root@server1 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml

##设置登录加密方式
[root@server1 metallb]# kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
secret/memberlist created

 

 

三、基本的操作命令

基本使用:https://metallb.universe.tf/usage/

3.1 layer2模式

##编写yml文件:
[root@server1 metallb]# vim layer2.yml

  1 apiVersion: v1
  2 kind: ConfigMap
  3 metadata:
  4   namespace: metallb-system
  5   name: config
  6 data:
  7   config: |
  8     address-pools:
  9     - name: default
 10       protocol: layer2
 11       addresses:
 12       - 192.168.43.200-192.168.43.230   #分配给LB的IP段

##文件生效
[root@server1 metallb]# kubectl apply -f layer2.yml 

3.2 BGP模式

BGP模式需要四个相应的参数:

(1)MetalLB应该连接的路由器IP地址;

(2)路由器的AS号;

(3)MetalLB应该使用的AS号;

(4)以CIDR前缀表示的IP地址范围。

##编写配置文件
[root@server1 metallb]# vim bgp.yml
  
  1 piVersion: v1
  2 kind: ConfigMap
  3 metadata:
  4   namespace: metallb-system
  5   name: config
  6 data:
  7   config: |
  8     peers:
  9     - peer-address: 10.0.0.1     (1)
 10       peer-asn: 64501            (2)
 11       my-asn: 64500              (3)
 12     address-pools:
 13     - name: default
 14       protocol: bgp
 15       addresses:                    (4)
 16       - 192.168.43.0/24

##文件生效
[root@server1 metallb]# kubectl apply -f bgp.yml 

3.3 服务应用

##创建服务,使用layer2模式
[root@server1 metallb]# vim demo.yml 

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer    #类型选择LoadBalancer
 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

[root@server1 metallb]# kubectl apply - f demo.yml 
[root@server1 metallb]# kubectl get svc
[root@server1 metallb]# kubectl describe  pod -n metallb-system
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐