• Octavia Rocky UDP 负载均衡功能试验


    目录

    前言

    以往,Octavia 通过 HAProxy + Keepalived 的组合来提供高可用的 TCP、HTTP、HTTPS 和 TERMINATED_HTTPS 负载均衡服务。HAProxy 是一个著名的 L4-L7 负载均衡器,功能非常强大,但细心的你或许会发现 HAProxy 的官方定义是 HAProxy as TCP and HTTP proxy,这暗示着 “Not UDP”。没错,HAProxy does not support UDP load balancing

    UDP 协议经常被作为处理音频、视频数据流以及其他实时应用中的传输层,在物联网(IoT)、边缘计算等领域中被广泛使用。为了满足这些场景的需求,在最新发布的 Rocky 版本中,Octavia 加入了 keepalived_lvs Driver 支持 UDP 负载均衡。

    UDP 简述

    实际上 UDP 在并入 TCP/IP 协议族的时候,就是作为 IP 协议的第四层抽象而存在的,IP 的协议单元叫做 IP 数据报,UDP 的名字正是来源于此 —— 用户数据报协议。其中 “用户” 便有了端到端的意思。起初 UDP 只是作为 TCP 的补充存在,应用于一些无需维护连接,无需维护状态的场合,然而随着 TCP 越来越复杂,随着复杂性越来越往上层转移,很多应用程序开始在 UDP 之上自行处理连接状态,数据序列等,这样便可以自行控制好复杂度,比较典型的是 DTLS 协议(SSL 的 UDP 版本)以及 OpenVPN。

    UDP 作为 TCP 的补充而存在,是无连接、不可靠、无序、无流量控制的传输层协议。协议上的无连接性指的是一个 UDP 的 Endpoint1(IP, PORT),可以向多个 UDP 的 Endpointi(IP, PORT) 发送数据包,也可以接收来自多个 UDP 的 Endpointi(IP, PORT) 的数据包。

    功能验证

    网络拓扑

    在这里插入图片描述

    资源对象清单

    [root@control01 ~]# openstack loadbalancer list
    +--------------------------------------+------+----------------------------------+-------------+---------------------+----------+
    | id                                   | name | project_id                       | vip_address | provisioning_status | provider |
    +--------------------------------------+------+----------------------------------+-------------+---------------------+----------+
    | 4352c8af-1e9f-490d-a524-f303e7c9e98c | lb1  | 26a66ccfb7f04862a446e26aa4959d31 | 10.0.0.12   | ACTIVE              | amphora  |
    +--------------------------------------+------+----------------------------------+-------------+---------------------+----------+
    
    [root@control01 ~]# openstack loadbalancer listener list
    +--------------------------------------+--------------------------------------+--------------+----------------------------------+----------+---------------+----------------+
    | id                                   | default_pool_id                      | name         | project_id                       | protocol | protocol_port | admin_state_up |
    +--------------------------------------+--------------------------------------+--------------+----------------------------------+----------+---------------+----------------+
    | 6286ed6f-ec53-4182-ac5d-bedeb918e124 | 132bd0f0-2d71-4a6b-b322-317e5420a914 | listener_udp | 26a66ccfb7f04862a446e26aa4959d31 | UDP      |          1234 | True           |
    +--------------------------------------+--------------------------------------+--------------+----------------------------------+----------+---------------+----------------+
    
    [root@control01 ~]# openstack loadbalancer pool list
    +--------------------------------------+----------+----------------------------------+---------------------+----------+--------------+----------------+
    | id                                   | name     | project_id                       | provisioning_status | protocol | lb_algorithm | admin_state_up |
    +--------------------------------------+----------+----------------------------------+---------------------+----------+--------------+----------------+
    | 132bd0f0-2d71-4a6b-b322-317e5420a914 | pool_udp | 26a66ccfb7f04862a446e26aa4959d31 | ACTIVE              | UDP      | ROUND_ROBIN  | True           |
    +--------------------------------------+----------+----------------------------------+---------------------+----------+--------------+----------------+
    
    [root@control01 ~]# openstack loadbalancer healthmonitor list
    +--------------------------------------+--------+----------------------------------+-------------+----------------+
    | id                                   | name   | project_id                       | type        | admin_state_up |
    +--------------------------------------+--------+----------------------------------+-------------+----------------+
    | ee22ec1b-7290-490a-8386-aee793cc7e76 | hm_udp | 26a66ccfb7f04862a446e26aa4959d31 | UDP-CONNECT | True           |
    +--------------------------------------+--------+----------------------------------+-------------+----------------+
    
    [root@control01 ~]# openstack loadbalancer member list pool_udp
    +--------------------------------------+----------+----------------------------------+---------------------+--------------+---------------+------------------+--------+
    | id                                   | name     | project_id                       | provisioning_status | address      | protocol_port | operating_status | weight |
    +--------------------------------------+----------+----------------------------------+---------------------+--------------+---------------+------------------+--------+
    | 71a338d7-f9e2-4cef-8c74-db561b8fde7d | member-2 | 26a66ccfb7f04862a446e26aa4959d31 | ACTIVE              | 192.168.1.3  |          1234 | ONLINE            |      1 |
    | 32728ce4-14b2-453f-9313-c1562dfe054b | member-1 | 26a66ccfb7f04862a446e26aa4959d31 | ACTIVE              | 192.168.1.16 |          1234 | ONLINE            |      1 |
    +--------------------------------------+----------+----------------------------------+---------------------+--------------+---------------+------------------+--------+
    

    验证

    Amphorae 中的 octavia-keepalivedlvs-6286ed6f-ec53-4182-ac5d-bedeb918e124.conf 配置文件内容:

    # Configuration for Loadbalancer 4352c8af-1e9f-490d-a524-f303e7c9e98c
    # Configuration for Listener 6286ed6f-ec53-4182-ac5d-bedeb918e124
    
    net_namespace amphora-haproxy
    
    virtual_server 10.0.0.12 1234 {
        lb_algo rr
        lb_kind NAT
        protocol UDP
        delay_loop 3
        delay_before_retry 60
        retry 3
    
    
        # Configuration for Pool 132bd0f0-2d71-4a6b-b322-317e5420a914
        # Configuration for HealthMonitor ee22ec1b-7290-490a-8386-aee793cc7e76
        # Configuration for Member 32728ce4-14b2-453f-9313-c1562dfe054b
        real_server 192.168.1.16 1234 {
            weight 1
            delay_before_retry 60
            retry 3
            MISC_CHECK {
                misc_path "/var/lib/octavia/lvs/check/udp_check.sh 192.168.1.16 1234"
                misc_timeout 3
            }
        }
    
        # Configuration for Member 71a338d7-f9e2-4cef-8c74-db561b8fde7d
        real_server 192.168.1.3 1234 {
            weight 1
            delay_before_retry 60
            retry 3
            MISC_CHECK {
                misc_path "/var/lib/octavia/lvs/check/udp_check.sh 192.168.1.3 1234"
                misc_timeout 3
            }
        }
    
    }
    

    Amphorae 中的 IPVS 规则:

    root@amphora-e8b5a075-59a5-4fe3-9df1-603a64bb9b6f:~# ipvsadm
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    UDP  10.0.0.12:1234 rr
      -> 192.168.1.3:1234             Masq    1      0          0
      -> 192.168.1.16:1234            Masq    1      0          0
    

    在 member-1/2 启动 nc udp server:

    [root@member-1 ~]# nc -ul 192.168.1.16 1234
    
    [root@member-2 ~]# nc -ul 192.168.1.3 1234
    

    通过 nc 客户端在外部访问 LB VIP 的 Floating IP 两次:

    [root@control01 ~]# nc -u -w 1 172.24.4.5 1234 < file.txt
    [root@control01 ~]# nc -u -w 1 172.24.4.5 1234 < file.txt
    

    查看 Members 得知两次请求分别轮询到 member-1/2 接受处理了:

    [root@member-1 ~]# nc -ul 192.168.1.16 1234
    aaaaaaaaaaaaaaaaaaa
    
    
    [root@member-2 ~]# nc -ul 192.168.1.3 1234
    aaaaaaaaaaaaaaaaaaa
    

    Octavia UDP LB Working !!

    TS

    Amphorae UDP 包被非法篡改

    因为我是在 VMware 环境做的试验,所以所谓解决 OpenStack 启动虚拟机 Booting from Hard Disk 文件,将 Amphorae image 的网卡属性修改为 e1000 了。但是 Member image 因为没有遇见这个问题所以依旧使用的是 virtio 驱动。这导致了从 Amphorae 发出去的 UDP 包会被自动填充 “0” 然后被 OVS 判定为非法数据包,以至于将其拦截。开始使用 workaround 的方式是将两个 Amphorae 与两个 Members 通讯端口的安全组关闭掉之后是能够正常通信的。

    openstack port set --no-security-group --disable-port-security <port_id>
    

    后来将 Amphorae Image 的属性修改为 virtio 也就解决这个问题了。

    存疑

    1. Member 的网关不需要手动指向 DIP 也能正常工作?
    2. octavia-keepalivedlvs-6286ed6f-ec53-4182-ac5d-bedeb918e124.conf 的 VIP 和 DIP VRRP instance 在什么地方定义的?
    3. 为什么 Members 的 operating_status 在一段时候后会被置为 Error?

    这个问题,回头在分析实现、调试代码的时候重点关注吧。

  • 相关阅读:
    eslint 入门学习
    sqlite数据库 select 查询带换行符数据
    (ios)ARC常用设置,部分文件编译设置ARC
    (ios实战)ios调试总结(转载)
    IOS沙盒Files目录说明和常用操作
    (Ios 实战) 自定义UITableView
    iphone,pad等真机不被xcode识别,解决方法
    Xcode模拟器和真机生成的日志查看(转载)
    项目管理(转载)
    互联网教育,未来当有这10个特质(转载)
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589737.html
Copyright © 2020-2023  润新知