当前位置: 代码网 > it编程>编程语言>Java > 负载均衡器 OpenELB ARP 欺骗技术解析

负载均衡器 OpenELB ARP 欺骗技术解析

2024年08月02日 Java 我要评论
作者:大飞哥,视源电子运维工程师,KubeSphere 用户委员会广州站站长,KubeSphere Ambassador。K8S 对集群外暴露服务有三种方式:NodePort,Ingress 和 Loadbalancer。NodePort 用于暴露 TCP 服务(4 层),但限于对集群节点主机端口的占用,不适合大规模使用;Ingress 用于暴露 HTTP 服务(7 层),可对域名地址做路由分发;Loadbalancer 则专属于云服务,可动态分配公网网关。对于私有云集群,没有用到公有云服务,能否使

k8s 对集群外暴露服务有三种方式:nodeport,ingress 和 loadbalancer。nodeport 用于暴露 tcp 服务(4 层),但限于对集群节点主机端口的占用,不适合大规模使用;ingress 用于暴露 http 服务(7 层),可对域名地址做路由分发;loadbalancer 则专属于云服务,可动态分配公网网关。

对于私有云集群,没有用到公有云服务,能否使用 loadbalancer 对外暴露服务呢?

答案当然是肯定的,openelb 正是为裸金属服务器提供 loadbalancer 服务而生的!

应用安装与配置

安装 openelb

$ kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml

添加 eip 池

apiversion: network.kubesphere.io/v1alpha2
kind: eip
metadata:
  name: eip-sample-pool
  annotations:
    eip.openelb.kubesphere.io/is-default-eip: "true"
spec:
  address: 192.168.0.91-192.168.0.100
  protocol: layer2
  interface: eth0
  disable: false

配置 service 为 loadbalancer

把 service 类型修改为 loadbalancer,同时 annotations 中添加如下三行:

lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
eip.openelb.kubesphere.io/v1alpha2: layer2-eip

总体配置清单如下:

kind: service
apiversion: v1
metadata:
  name: layer2-svc
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
spec:
  selector:
    app: layer2-openelb
  type: loadbalancer
  ports:
    - name: http
      port: 80
      targetport: 8080
  externaltrafficpolicy: cluster

layer2 模式中的黑客技术

openelb 正是利用 arp 欺骗技术,从而获取路由器流量,再由 kube-proxy 将流量转发到 service 网络。openelb layer2 模式需要配置 eip,如上图所示的 eip 为 192.168.0.91

当请求 eip 地址时,路由器会在局域网内发起 arp 协议广播,哪个终端设备响应,就把数据包发送给谁;配置 eip 时有要求,eip 地址不能绑定任何网卡,也就是说正常情况下,不会有任何物理硬件设备响应。此时的 openelb,就趁虚而入,捕获到 arp 广播信息后,对路由器广播进行响应,把自己伪装成终端设备。openelb 获得流量后,再经由 kube-proxy 转发入 service 网络。

可以在其中一台 node 上面抓包看一下:

$ tcpdump -i any arp -nn -vvv | grep 192.168.0.91

17:33:01.398722 arp, ethernet (len 6), ipv4 (len 4), request who-has 192.168.0.91 (ff:ff:ff:ff:ff:ff) tell 192.168.0.91, length 46
17:33:01.398793 arp, ethernet (len 6), ipv4 (len 4), reply 192.168.0.91 is-at 52:54:22:3a:e6:6e, length 46

路由器的 arp 缓存每过一段时间就会失效,重新发起 arp 协议广播,使用 tcpdump 一直监听就可以抓到相关的数据包。可以看到 openelb 响应的 mac 地址是 kubernetes 的其中一台节点的 mac 地址。

改善与建议

openelb layer2 模式因其实现简单,而且对物理硬件和网络没有额外要求,所以实际生产中经常会用到。但目前仍存在单点故障风险,即如果 openelb 实例因资源不足故障,则整个对外流量将中断。

万幸的是 openelb 官方已有新的解决方案,即 layer2 vip 模式,该模式的使用方式可以参考官方文档。有时间我会再写一篇 layer2 vip 模式的详细使用方案,敬请期待。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com