本文暂时先介绍一下Neutron的SFC和OVN的整合。因为自己还未实践过,所以写的可能比较乱,也不严谨。
参照这里和这里。
Openstack Neutron SFC
Neutron的SFC (Service Function Chaining)动态建立服务链使不同租户的流量可以按照不同顺序导向不同的服务功能模块。其概念类似于策略路由, 即SFC使网络报文流量走特定的路径,而不是通过IP目的地址来查看路由表得最终目的地。举个简单的例子, 我们可以强制某流量从A到B必须经过中间的防火墙, 或者不经过防火墙,而不管当前的路由表。更复杂的例子是有序的一系列功能,每个功能都在多个虚拟机中实现,使得流量必须在链中的每一跳流过一个虚拟机,但是网络使用散列算法来在每个跳跃的多个虚拟机上分配不同的流。
所有的Openstack网络服务和Openstack计算实例通过端口连接到虚拟网络,将这些端口添加到端口链中,通过提供服务来指导流量。
端口链和服务路径包括以下两个内容:
- 一组定义有序服务的端口
- 一组流分类器,用来定义哪些流导入哪些服务
如果服务功能涉及一对端口,则第一个端口作为服务功能的入端口,第二个端口作为出端口。如果两个端口都使用相同的值,它们将作为单个虚拟双向端口。端口链是一个单向的服务链。第一个端口作为服务功能链的头,第二个端口作为服务功能的链尾。双向业务功能链由两个单向端口链组成。
流分类器只能属于一个端口链,以防止发生歧义,不确定哪个链应该处理流中的数据包。但可以将多个流分类与端口链关联,因为多个流可以请求相同的服务功能路径。
端口链插件支持服务提供商,包括OVS驱动程序和各种SDN控制器驱动程序。通用的驱动程序API使不同的驱动程序为服务链路径渲染提供不同的实现。框架如下图所示:
上图我们看到可以直接支持OVS和各种控制器,今天我们主要查看支持OVN的驱动。
networking-sfc/OVN Driver
驱动程序将向ovn-nb schema添加端口链、端口配对组、端口配对表,并且使用逻辑端口对来定义每个SF,并且使用ovn-nb ACLs作为流分类器。
最终结果就是在进入OVN逻辑流表的ACL的时候,就可以针对一些符合的流导入逻辑端口链,执行一系列的SFC的服务之后,最终导回某个逻辑端口。如下图所示:
network-sfc的OVN驱动程序如下所示。Neutron调用ovn-nbctl,然后sfc数据存入OVN NB DB,翻译为OVN SB SFC Logical Flows。
ovnnb.ovsschema中扩展的sfc信息如下
"Logical_Port_Chain": {
"columns": {
"port_pair_groups": {"type": {"key": {"type": "uuid",
"refTable": "Logical_Port_Pair_Group",
"refType": "strong"},
"min": 0, "max": "unlimited"}} },
"isRoot": true},
"Logical_Port_Pair_Group": {
"columns": {
"port_pairs": {"type": {"key": {"type": "uuid",
"refTable": "Logical_Port_Pair", "refType": "strong"},
"min": 0, "max": "unlimited"}} },
"isRoot": false},
"Logical_Port_Pair": {
"columns": {
"outport": {"type": {"key": {"type": "uuid",
"refTable": "Logical_Switch_Port", "refType": "strong"},
"min": 0, "max": 1}},
"inport": {"type": {"key": {"type": "uuid",
"refTable": "Logical_Switch_Port", "refType": "strong"},
"min": 0, "max": 1}},
"isRoot": false},
ACL表扩展的SFC信息如下:
"ACL": {
"columns": {
"priority": {"type": {"key": {"type": "integer",
"minInteger": 0,
"maxInteger": 32767}}},
"direction": {"type": {"key": {"type": "string",
"enum": ["set", ["from-lport", "to-port"]]}}},
"match": {"type": "string"},
"action": {"type": {"key": {"type": "string",
"enum": ["set", ["allow", "allow-related",
"drop", "reject", "sfc"]]}}},
"log": {"type": "boolean"},
"options": {"type": {"key": "string", "value": "string",
"min": 0, "max": "unlimited"}},
"external_ids": {"type": {"key": "string", "value": "string",
"min": 0, "max": "unlimited"}}},
ovn-nbctl SFC 相关命令
lchain-add lchain [lsp-pair-group] ...
lchain-del lchain
lchain-set-port-pair-group lchain [lsp-pair-group] ...
lchain-list lchain
lchain-set-options lchain key=value [key=value]...
lsp-pair-group-add port-pair-group [lsp-pair]...
lsp-pair-group-del lsp-pair-group
lsp-pair-group-set-port-pair lsp-pair-group [lsp-pair]
lsp-pair-group-list
lsp-pair-group-set-options lsp-pair-group key=value [key=value]...
lsp-pair-add lsp-pair [inport, outport]
lsp-pair-del lsp-pair
lsp-pair-list
lsp-pair-set-options lsp-pair key-value [key=value] ...
acl-add ls direction priority match sfc [sfc-port-chain=<lchain>]
如下图就是一个示例,这是在同一个逻辑交换的例子
接下来展示一个负载均衡到Port Pair Group的多个sf的例子
OVN Ingress Pipeline如下
L2 Port Security | Security of ports |
---|---|
IP Port Security | IP Port Security |
ND Port Security | Neighbor discover port security constraints on ARP and IPv6 Neighbor discover port security constraints on ARP and IPv6 |
Pre-ACL | Handle connection tracking ACL Packets |
Pre-LB | Deal with potentially fragmented packets for LB Deal with potentially fragmented packets for LB |
Pre-Stateful | Defragment connection tracking packets |
ACL | Apply ACL Rules |
Service Chain | Service chain steering Service chain steering |
LB | Apply LB rules Apply LB rules (extension for LSP balancing) |
Stateful | Continue stateful packets |
ARP Response | Send ARP Response |
DHCP Options | Set DHCP Options on packet |
DHCP Response | Send DHCP Response |