Openshift使用openvswitch實現多租戶網路隔離的理解
前 言
我們在使用openshift的過程中,當調整網路,偶爾會遇到曾經能通的namespace突然間不通了。這個問題一直困擾著我們。後來通過調研,發現這是網路隔離方式導致的。這篇文章希望能對遇到類似困惑的同學帶來幫助。
正 文
當前我們使用openshift提供的ovs-multitenant plugin作為網路解決方案。它具備基於VXLAN的多租戶隔離能力。每個專案(projects)被分配一個唯一的ID,對應VXLAN的VNID, 預設專案之間的POD是不能互相通訊的。使用者可以通過 oc adm pod-network 子命令對租戶網路進行管理。
每個project對應一個NETID (即VXLAN VNID),建立新project也會分配一個新的VNID。
# oc get netnamespaces NAMENETIDEGRESS IPS project14296943[] project25910689[] project38988879[]
要打通兩個project之間的網路連線,使用 join-projects 子命令。執行後它們的NETID設定成相同, project2 的NETID被改成project1的。這樣具備相同VNID的兩個專案就可以互相通訊了。
# oc adm pod-network join-projects --to=project1 project3 # oc get netnamespaces|grep project project18988879[] project24296943[] project38988879[]
然而, 這種處理方式有可能導致原來與project2互通的另外一個專案,無法繼續通訊了。比如project1與project2原來是互通的,有一樣的NETID。如果讓project2加入project3, 後果是1跟2變成不通了。解決辦法是把1也加入3。也許我們本來並不希望1, 3之間能夠相互可見。所以在操作時,必須對這種組網方式有所瞭解。在規劃網路時,應該以環境型別作為隔離標準,把具有相互通訊需求的專案規劃使用相同的NETID, 區分 開發/測試/預釋出/正式環境。
要把兩個project重新隔離起來, 使用 isolate-projects 子命令。執行後 project2 NETID不變, project1 被分配新的NETID。假如還有一個或多個project在使用這個NETID,那麼project1, project2都被分配新的NETID。
# oc adm pod-network isolate-projects project1 project2 # oc get netnamespaces|grep project project114486461[] project24296943[] project38988879[]
假如某個專案(例如日誌),需要被所有專案訪問,那麼使用 make-projects-global 子命令。執行後把專案的NETID設成0, 相當於可被VXLAN無條件轉發。
# oc adm pod-network make-projects-global project1 # oc get netnamespaces|grep project project10[] project24296943[] project38988879[]
叢集服務基礎元件適用這種場景,例如日誌,統計,呼叫鏈,等等。