使用metalLB来实现负载均衡Load Balancer

本地集群如何使用LoadBalancer

Posted by 飞云 on September 17, 2021

本地自己安装的k8s集群, 默认是不支持LoadBlancer的, 需要自己安装一个组件来支持. 而云上的k8s, 肯定是都支持LoadBalancer的. 如果自己公司搭建集群, 那肯定也是需要安装LoadBlancer的, 我们看看都有哪些支持本地集群的实现哪:

  • metalLB: Netlify是一家位于旧金山的云计算公司,为Web应用程序和静态网站提供托管和无服务器后端服务.
  • openelb: 之前是PorterLB, KubeSphere公司开源的, 是有中文文档的, 不过改名的过程中, 有点乱.

然后这是 OpenELB写的对比: https://github.com/kubesphere/openelb/blob/master/doc/zh/compared_with_metallb.md

最终我测试了metalLB

  • openelb的文档太乱了
  • metalLB使用ConfigMap来配置IP池, openELB使用 eip来配置IP池–方便监控
  • metaLB声明的时候无需特殊设置, openELB必须使用 annotations: lb.kubesphere.io/v1alpha1: porter

我们来看看如何安装使用metalLB, (其实步骤都很简单, 切换为openELB也很容易)

确认strictARP模式

如果你的网络是运行在IPVS模式下(默认是iptables), 那么需要设置strictARP模式:

kubectl edit configmap -n kube-system kube-proxy

修改其中的strictARP为true:

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

安装 metalLB:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

如果镜像来不下来, 就用vpn…. 我发现用k8s就必须学会用vpn或者迁移大法才行…因为好多镜像都拉不下来…也没警告!!

手工检查Pod是否启动正常, 会不会卡在拉镜像的步骤?

[root@centos1 ~]# k get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS   AGE
controller-6b78bff7d9-84cvr   1/1     Running   0          16d
speaker-5n8pm                 1/1     Running   0          16d
speaker-5zsbb                 1/1     Running   0          16d
speaker-wc47c                 1/1     Running   0          16d

如果看到metallb-system命名空间下有controller, speaker等进程已经在Running状态, 说明正常.

配置IP池

这里我们使用layer2协议, 毕竟本地测试没有BGP设备, 如果是正式用, 还是要上BGP设备的.

先找网络管理员申请预留的IP端, 配置如下:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.18.0.203-172.18.0.210
      

然后配置上去

kubectl apply -f metallb.ip.yaml

如果是BGP的话, 文档在这: https://metallb.universe.tf/configuration/

测试效果

现在我们来部署一个Nginx来看看

kubectl apply -f nginx.test.yaml

其中内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-metallb-test
spec:
  selector:
    matchLabels:
      app: nginx-metallb-test
  template:
    metadata:
      labels:
        app: nginx-metallb-test
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - name: http
          containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-metallb-test
  type: LoadBalancer

上面声明的Service的类型为LoadBalancer, 无其他特殊设置.

服务创建之后, 我们来看看效果:

[root@centos1 metalLB]# kubectl get svc -o wide
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE   SELECTOR
apple-service   ClusterIP      10.98.221.159   <none>         5678/TCP       17h   app=apple
kubernetes      ClusterIP      10.96.0.1       <none>         443/TCP        23h   <none>
nginx-service   LoadBalancer   10.103.59.125   172.18.0.203   80:32046/TCP   3s    app=nginx-metallb-test

打开浏览器, 访问 172.18.0.203 即可访问nginx.

如果是正式环境, 则使用DNS解析到此IP, 使用域名访问服务即可.

当然如果你有多个服务, 你也可以使用Nginx Ingress来通过域名和路径区分不同的服务, 那就是另外的话题了.

Page PV: