目录

前言

以往,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?

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

Octavia Rocky UDP 负载均衡功能试验的更多相关文章

  1. Nginx stream(TCP/UDP)负载均衡

    Nginx-1.11.6编译安装 nginx编译安装,(平台:ubuntu 14.04); sudo apt-get install zlib1g-dev sudo apt-get install l ...

  2. lvs+keepalive实现主从效果,以及RS健康监测和tcp,udp实现非web的负载均衡

    前面文章讲到了tcp和udp负载均衡,但是没有健康监测,这几天我优化了一下上次的操作.当然,我也是用的跨网段的通讯,因为线上业务主要是海外业务,所以做了iptables流量转发 IP: lvs-mas ...

  3. octavia的实现与分析(一)·openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比

    [负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...

  4. openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比

    [负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...

  5. lvs+keepalive实现双主模式(采用DR),同时实现TCP和UDP检测实现非web端的负载均衡,同时实现跨网段的通讯

    因为公司领导需要,需要把lvs备机也使用上,故! 使用双主,相互是主的同时也相互是备机.本人用nat测试发现RS无法实现负载均衡,故采用DR模式来实现非web端的负载均衡 lvs1: DIP 10.6 ...

  6. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  7. 【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档

    本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量. 目录 介绍 先决条件 配置反向代理 配置TCP或UDP负载平衡被动健康监控 选择负载平衡方法 配置会话持久性 ...

  8. Nginx负载均衡之TCP/UDP流

    负载均衡是指在多个后端服务器之间有效地分配网络流量. 从NGINX Plus R5[1] 版本开始可以代理和负载均衡传输控制协议(Transmission Control Protocol,TCP)通 ...

  9. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

随机推荐

  1. PAT Basic 1003 我要通过! (20 分)

    “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: ...

  2. Oracle批量导出表数据到CSV文件

    需求:把oracle数据库中符合条件的n多表,导出成csv文本文件,并以表名.csv为文件名存放. 实现:通过存储过程中utl_file函数来实现.导出的csv文件放入提前创建好的directory中 ...

  3. Floyed(floyd)算法详解

    是真懂还是假懂? Floyed算法:是最短路径算法可以说是最慢的一个. 原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径): 但它适合算多源最短路径,即任意两点间的距离. 但sp ...

  4. Springboot项目全局异常统一处理

    转自https://blog.csdn.net/hao_kkkkk/article/details/80538955 最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项 ...

  5. 搭建web服务器---Apache服务器

    一.安装Apache 尽管xampp appserv等提供了方便的集成环境,但实际上部署环境还是下载单独安装的Apache,以避免那些安全问题 二.加载php解析模块,并指定模块处理文件的类型 编辑h ...

  6. hiho #1474 拆字游戏(dfs,记录状态)

    #1474 : 拆字游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Kui喜欢把别人的名字拆开来,比如“螺”就可以拆成“虫田糸”,小Kui的语文学的不是很好,于是 ...

  7. js 数组的forEach 函数

    var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("item:" + ite ...

  8. Linux培训教程lgzip命令详解和使用实例

    gzip不仅可以用来压缩大的.较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式.据统计,gzip命令对文本文件有60%-70%的压缩率. 1.命令格式 ...

  9. Nowcoder 练习赛26 D xor序列 ( 线性基 )

    题目链接 题意 : 中文题.点链接 分析 : 对于给定的 X 和 Y 假设存在一个 Z 使得 X (xor) Z = Y 做一个变形 X (xor) Z (xor) Y = 0 X (xor) Y = ...

  10. CDOJ 图论专题 A.不是图论 强连通分量+拓扑排序 经典

    题目链接  在其中纠错第一次wa代码 #include <cstdio> #include <cstring> #include <cstdlib> #includ ...