作者: 趙怡
1. Service Function Chain概述
Neutron的SFC (Service Function Chaining, SFC, 業務鏈)是由華爲主導並開發的一個neutron下的服務框架。
其目的是動態建立服務鏈使不同租戶的流量可以按照不同順序導向不同的服務功能模塊。其概念類似於策略路由, 即SFC使網絡報文流量走特定的路徑,而不是通過IP目的地址來查看路由表得最終目的地。
SFC主要應用於SDN網絡技術中, 通常用來聯同NetworkFunction Virtualization(網絡功能虛擬化)來實現特定功能。舉個例子, 我們可以強制某流量從A到B必須經過中間的防火牆, 或者不經過防火牆,而不管當前的路由表。
2. Service Chain操作和API
Service Function:服務功能, 在這裏可以認爲就是提供業務的虛擬機。虛擬機上會有1個或多個的網絡端口(port)。
Port chain(即Service Function Path)包括:
1.neutron ports的列表, 用於定義服務功能的順序
2.flow classifiers(流分類器)的列表, 指定分類後的流進入哪個port chain
如果一個service function有1對port,那麼第一個port爲入口, 第二個port爲出口。
Port Pair: port chain在實際使用中會以一連串port-pair(端口對)來呈現。 如下圖:
SF1,SF2, SF3爲三個不同的Service Function, 其port chain可以表示爲: [{'p1': 'p2'}, {'p3':'p4'}, {'p5': 'p6'}]
{'p1','p2'}即爲一個port-pair, 其中第1個端口爲入端口, 第2個端口爲出端口。
p1爲整條port-chain的頭部, 而p6爲port-chain的尾部。
+------+ +------+ +------+ | SF1 | | SF2 | | SF3 | +------+ +------+ +------+ p1| |p2 p3| |p4 p5| |p6 | | | | | | ->---+ +---------+ +-----------+ +----> |
Port Pair Group: 在實際使用中, port-chain較多較複雜的時候, 爲了簡化操作, 把某些可以複用的多個port-pair定義爲 port-pair-group, 類似於防火牆或qos中的policy。
同時,port-pair-group可指定lb_fields, 用來做多條業務鏈的負載均衡。
如: 有2條port-chain, port-chain-1定義爲[{'p1': 'p2'}, {'p3': 'p4'}, {'p5': 'p6'}, {'p7': 'p8'}]
port-chain-2定義爲[{'p5': 'p6'}, {'p7': 'p8'},{'p1': 'p2'}, {'p3': 'p4'}]
我們可以把其中相同部分: [{'p1': 'p2'}, {'p3': 'p4'}]定義爲一個port-pair-group:port-pair-group-1
[{'p5':'p6'}, {'p7': 'p8'}]定義爲一個port-pair-group:port-pair-group-2
那麼: port-chain-1可以簡化爲: [port-pair-group-1,port-pair-group-2]
port-chain-2可以簡化爲: [port-pair-group-2, port-pair-group-1]
Flow classifier: 其作用在於選擇能夠訪問port-chain的流量, 只要有流量匹配到了flow classifier則會被重定向到 port-chain的第 1個端口。
目前可以匹配的報文字段有: ethertype, protocol, source-port, dest-port. source-ip-prefix, dest-ip-prefix, logical-source-port(neutron中的port端口),logical-dest-port(neutron中的port端口), L7層某些字 段。
目前在openstack client上已經可以使用SFC相關命令行:
創建port-pair openstack sfc port pair create [-h] [--description DESCRIPTION] --ingress INGRESS --egress EGRESS [--service-function-parameters [correlation=CORRELATION_TYPE, weight=WEIGHT]] PORT-PAIR-NAME * 注: --service-function-parameters可指定參數: correlation:默認none,目前還可選擇mpls。由用戶定義該port-pair上的報文與業務鏈的關聯機制, 即底層如何實現業務鏈封裝。 weight:經過該port-pair的流量權重, 默認1, 可以配置正整數
創建port-pair group openstack sfc port pair group create [-h] [--description DESCRIPTION] [--port-pairs PORT-PAIR] [--port-pair-group-parameters [lb_fields=LB_FIELDS]] PORT-PAIR-GROUP-NAME * 注: --port-pairs可連續指定多個port-pair --port-pair-group-parameters可指定參數: 默認空列表,可選擇loadbalance的報文字段: eth_src, eth_dst, ip_src, ip_dst, tcp_src, tcp_dst, udp_src, udp_dst, 可自由組合, 通過'&'連接。如eth_src&tcp_src。
創建flow-classifier openstack sfc flow classifier create [-h] [--description DESCRIPTION] [--protocol PROTOCOL] [--ethertype {IPv4, IPv6}] [--source-port SOURCE_PORT] [--destination-port DESTINATION_PORT] [--source-ip-prefix SOURCE_IP_PREFIX] [--destination-ip-prefix DESTINATION_IP_PREFIX] [--logical-source-port LOGICAL_SOURCE_PORT] [--logical-destination-port LOGICAL_DESTINATION_PORT] [--l7-parameters type=TYPE[,url=URL_PATH]] FLOW-CLASSIFIER-NAME * 注: --logical-source-port必須要指定 --l7-parameters目前還未實現。估計以後可指定http報頭中的相關字段, 如: uri path, cookie, hostname, file_type, header中的字段等等。 從實際行爲上來看, flow classifier會應用在每一跳的入口處
創建port-chain openstack sfc port chain create [-h] [--description DESCRIPTION] --port-pair-group PORT-PAIR-GROUP [--flow-classifier FLOW-CLASSIFIER] [--chain-parameters [correlation=CORRELATION_TYPE, symmetric=BOOLEAN_TYPE]] PORT-CHAIN-NAME * 注: --port-pair-group可連續指定多個 --chain-parameters可指定參數: correlation:默認: mpls,目前只能選擇mpls。由用戶定義該port-chain上的報文與業務鏈的關聯機制, 即底層如何實現業務鏈封裝。 symmetric:是否爲對稱port chain,默認False。如果爲symmetric, 則該業務鏈底層的數據層面會自動雙向都打通, 否則只打通單個方向。 |
c) API規範
由於篇幅限制, API規範不再詳細列出, 與命令行對應, 可參考官方文檔: https://docs.openstack.org/developer/networking-sfc/api.html