Please enable Javascript to view the contents

开源k8slb工具Metallb

 ·  ☕ 2 分钟  ·  🐶 ysicing · 👀... 阅读

简介

k8s的LoadBalancer类型的Service依赖云服务商的Load Balancer, 如阿里云的slb。

当我们把k8s部署在私有云时,需要简单的LoadBalancer来验证工作,开源的metallb就是一个不错的选择。

通过k8s原生的方式提供LB类型的Service支持,开箱即用。

原理

  • Layer2 (默认使用)
  • BGP

Layer2

只需要一段跟K8s管理网相同网段的地址即可, 通常这种就可以了。

在此模式下, 会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。

局限性: 单节点流量瓶颈和慢故障转移

BGP

需要上层路由器支持BGP,不在需要Leader节点。

安装

kubectl get ns | grep metallb-system && exit 0
kubectl apply -f https://gitee.com/ysicing/ergo/raw/master/hack/k8s/metallb/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
kubectl apply -f https://gitee.com/ysicing/ergo/raw/master/hack/k8s/metallb/lbconfig.yaml
# 或者使用ergo
ergo install mlb --pass vagrant

配置说明

# https://gitee.com/ysicing/ergo/raw/master/hack/k8s/metallb/lbconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: lbpool
      protocol: layer2
      addresses:
      - 11.11.11.150-11.11.11.200

测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# lb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: LoadBalancer

测试

root@k8s1:~# kubectl apply -f lb.yaml
root@k8s1:~# kubectl get pods,svc
NAME                                   READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-d46f5678b-hm7r6   1/1     Running   0          96s
pod/nginx-deployment-d46f5678b-zgfxd   1/1     Running   0          96s

NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes      ClusterIP      10.96.0.1      <none>         443/TCP        88m
service/nginx-service   LoadBalancer   10.98.184.75   11.11.11.150   80:32002/TCP   6s
分享

ysicing
作者
ysicing
云原生爱好者