开源k8slb工具Metallb

本文最后更新于 1678 天前, 如有失效请评论区留言.

本文主要讲述穷人如何使用 LoadBalancer

简介

kubernetes 本身并没有实现 LoadBalancer, 如果是云上用户,可以使用云服务商提供 k8s 的 LoadBalancer, 如阿里云的 slb。

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

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

核心特性:

  • 地址分配 MetalLB 会为用户的 lb 类型 service 分配 IP 地址,该 IP 地址需要用户预先分配
  • 外部申明 地址分配后还需要通知到网络中的其他主机, 有两种方式基于 ARP 的 Layer2 和 BGP

原理

  • Layer2 (默认使用)
  • BGP

Layer2

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

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

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

BGP

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

安装

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update 
helm upgrade -i metallb bitnami/metallb  --create-namespace -n metallb-system

# 默认空配置
kubectl get cm/metallb-config  -n metallb-system -o yaml 
kubectl apply -f https://sh.ysicing.me/k8s/helm/metallb/lbconfig.yaml

配置说明

# https://sh.ysicing.me/k8s/helm/metallb/lbconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: metallb-config
data:
  config: |
    address-pools:
    - name: lbpool
      protocol: layer2
      addresses:
      - 11.11.11.150-11.11.11.200

测试

# 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

Sponsor

Like this article? $1 reward

Comments