王海庆的云笔记

本地集群使用OpenELB实现Load Balancer


        2021 年11 月 10 日,云原生计算基金会 (CNCF) 宣布由青云科技 KubeSphere 团队开源的负载均衡器插件 OpenELB 正式进入 CNCF 沙箱(Sandbox)托管。 

        OpenELB 项目在此前命名为 PorterLB,是为物理机(Bare-metal)、边缘(Edge)和私有化环境设计的负载均衡器插件,可作为 Kubernetes、K3s、KubeSphere 的 LB 插件对集群外暴露 “LoadBalancer” 类型的服务 。 

 

使用 layer2 模式的 OpenELB,首先需要保证所有 Kubernetes 集群节点必须在同一个二层网络(在同一个路由器下)。.

[root@zkxy ~]# kubectl get nodes 
NAME   STATUS   ROLES                  AGE   VERSION
zkxy   Ready    control-plane,master   70m   v1.22.6
[root@zkxy ~]#


首先需要为 kube-proxy 启用 strictARP,以便 Kubernetes 集群中的所有网卡停止响应其他网卡的 ARP 请求,而由 OpenELB 处理 ARP 请求。 

kubectl edit configmap kube-proxy -n kube-system
......
ipvs:
  strictARP: true
......


然后执行下面的命令重启 kube-proxy 组件即可 

kubectl rollout restart daemonset kube-proxy -n kube-system


安装 OpenELB,注意如果不能获取k8s.gcr.io镜像,需要替换其中的镜像

# 已经修改为阿里云的镜像
kubectl apply -f openelb.yaml 

# 官方镜像
kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml

openelb.yaml


安装完成后查看 Pod 的状态是否正常  

[root@zkxy ~]# kubectl get pods -n openelb-system    
NAME                                READY   STATUS      RESTARTS   AGE
openelb-admission-create--1-86kwh   0/1     Completed   0          34m
openelb-admission-patch--1-hxww7    0/1     Completed   1          34m
openelb-manager-54b897bb7c-sv7th    1/1     Running     0          34m
[root@zkxy ~]#


 

创建一个 Eip 对象来充当 OpenELB 的 IP 地址池 

cat > eip.yaml << EOF
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
  name: eip-pool
spec:
  address: 172.18.0.180-172.18.0.186
  protocol: layer2
  disable: false
  interface: ens192
EOF

kubectl apply -f eip.yaml

IP地址,例如 192.168.0.100 

IP地址/子网掩码,例如 192.168.0.0/24 

IP地址1-IP地址2,例如192.168.0.91-192.168.0.100


创建完成 Eip 对象后可以通过 Status 来查看该 IP 池的具体状态 

[root@zkxy ~]# kubectl get eip  
NAME       CIDR                        USAGE   TOTAL
eip-pool   172.18.0.180-172.18.0.186   0       7
[root@zkxy ~]#

 

创建nginx服务

cat > nginx.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:  
    matchLabels:
      app: nginx
  template:  
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

kubectl apply -f nginx.yaml
kubectl get pods


创建 LoadBalancer 类型的 Service 来暴露我们的 nginx 服务

cat > loadbalancer.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: eip-pool
spec:
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerIP: 172.18.0.180
  ports:
    - name: http
      port: 80
      targetPort: 80
EOF

kubectl apply -f loadbalancer.yaml
kubectl get svc nginx

如果字段loadBalancerIP没有指定,该负载均衡器会被指定一个短暂性的IP。 loadBalancerIP还必须要在之前设置的网段内才可以。

 

访问

http://172.18.0.180/


 参考

https://mp.weixin.qq.com/s/eB0oA5qWxJw3nypGNxhMow
https://github.com/openelb/openelb 
https://openelb.github.io/zh/docs/getting-started/usage/use-porter-in-layer-2-mode/

文章最后更新时间: 2022-05-25 10:01:50