OpenFlow 初學之路(五) Group Table 基本設定與操作

OpenFlow 初學之路(五) Group Table 基本設定與操作

2022, Mar 14    

本篇簡單介紹基本的 Group Table 機制以及操作,並進行實做測試,預計是 Openflow 初學的最後一篇了

沒看過前幾篇的可以點這邊:

拓樸環境建立

sudo mn --topo single,4 --mac --switch ovsk --controller remote,ip=192.168.xx.xxx,port=6633 -x --ar

首先一樣來建立一個實驗用的拓樸,要注意的是這次拓樸我們給了 4 個 host,為了待會 group 的功能測試

預設 mininet 就能夠支援 group 了,這次就不需要額外設定了

Group

Group 的機制稍微有點複雜,這邊簡單介紹下,並附上 Group Table 的結構如下圖

Alt

  • 一個 Group 含有多個 Action Bucket
  • 一個 Action Bucket 含有多個 Action,概念上就是 Action 的集合
  • 根據 Group 的 Type 來決定 Action 執行的方式

Group Type

Group Type 是 Group 的一個重要設定,決定了 Group 的行為模式,總共有以下幾種

  • All: 複製封包送往執行全部的 Action Buckets
  • Select: 隨機選擇一個 Action Buckets,Load Balancing
  • Indirect: 只能有一個 Action Bucket,用途類似包裝 Action 在各個 Flow Table 重用
  • Fast Failover: 自動偵測進行故障轉移

假定一個情境,Group 的 Action Bucket 設定為 output 到 1~4 port,那各個 Group Type 的行為模式就如下圖

Alt

Group Table 建立

Type ALL

首先來測試一下 Group Table 的建立,先建立一個 Group,並設定 Group Type 為 All

/*
PUT http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/1
Basic Auth: admin/admin
*/

{
    "flow-node-inventory:group": [
        {
            "group-id": 1,
            "barrier": false,
            "group-name": "All Group",
            "group-type": "group-all",
            "buckets": {
                "bucket": [
                    {
                        "bucket-id": 1,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "1"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 2,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "2"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 3,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "3"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 4,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "4"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

建好 Group Table 之後也別忘了加上 Flow Table 才能套用

/*
PUT http://localhost:8181/restconf/config/opendaylight-inventory:nodes/openflow:1/table/0/flow/1
Basic Auth: admin/admin
*/

{
     "flow-node-inventory:flow": [
         {
             "id": "1",
             "table_id": 0,
             "priority": 2,
             "hard-timeout": 1200,
             "installHw": false,
             "cookie_mask": 255,
             "cookie": 106,
             "flow-name": "group demo",
             "strict": false,
             "instructions": {
                 "instruction": [
                     {
                         "order": 0,
                         "apply-actions": {
                             "action": [
                                 {
                                     "order": 0,
                                     "group-action": {
                                         "group-id": 1
                                     }
                                 }
                             ]
                         }
                     }
                 ]
             },
             "idle-timeout": 3400
         }
     ]
 }

這邊就不寫上 match 了,讓所有封包都能夠套用,讓我們簡單用 ping 來做測試,並且在每個 xterm 中都使用 tcpdump 來監控收到的封包

Alt

圖中可以看到雖然是從 h1 ping h2 但是所有的 host 都有收到 ICMP 的封包,可以知道 Group 的 All 的確會將封包傳送到所有的 Action Bucket,可以利用在封包廣播上

Type SELECT

接下來測試看看 Type 為 select 的時候會發生什麼情況,select 的 Group 設定要稍微更改一下

/*
PUT http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/group/1
Basic Auth: admin/admin
*/

{
    "flow-node-inventory:group": [
        {
            "group-id": 1,
            "barrier": false,
            "group-name": "Select Group",
            "group-type": "group-select",
            "buckets": {
                "bucket": [
                    {
                        "bucket-id": 1,
                        "weight": 1,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "1"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 2,
                        "weight": 1,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "2"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 3,
                        "weight": 1,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "3"
                                }
                            }
                        ]
                    },
                    {
                        "bucket-id": 4,
                        "weight": 1,
                        "action": [
                            {
                                "order": 1,
                                "output-action": {
                                    "output-node-connector": "4"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

除了 type 要修改成 group-select 之外,也必須為每個 Action Bucket 加上 weight,Switch 會根據 weight 的大小來決定將封包傳送到哪個 Action Bucket,而這邊全部都設置為 1,會根據 Switch 自身的演算法隨機傳送,如下圖

Alt

可以看到雖然是 h1 ping h2 但是卻是 h3 收到封包,而且每次由 h1 -> h2 都是 h3 收到,這功能也許可以用在 Load Balance 方面

其他

Indirect 以及 Fast Failover 這邊就不實做了,使用情境上沒有用到,Fast Failover 的實作也有點難操作,暫時先就做到這邊而已,非常懶惰XD


結語

至此 Openflow 的初階學習就到這裡,其實就是基本的應用而已,不過因為自己在接觸的時候幾乎是找不到 ODL 相關教學的,絕大多數文章都是用 Python 的 Ryu,也可以理解 Ryu 使用上比較簡便快速,ODL 實在不是個太親民的東西,也因此這幾篇文章的目的,是希望像我一樣使用 ODL 的使用者們可以比較快速了解如何在 ODL 中操作 Openflow 的東西,之後有機會再補上一些 Openflow 或是 ODL 的相關內容吧