Control Traffic with Network Policies:
- 預設Pods之間的溝通都是允許的(如下圖)
- 也就是沒有規則限制Pods之間的溝通
- 而K8s則提供一種元件來限制Pods之間的溝通 — NetworkPolicies
- NetworkPolicies用來限制Pod本身的IP與PORT層級的進出入,如下圖
- NetworkPolicy可由yaml檔來定義
- 但是實現NetworkPolicy實際上是CNI應用程式 — 我們裝的就是weavenet
- weavenet是為NetWork Plugin,其控管網路規則
- 所以透過NetworkPolicy的定義,weavenet則依據規則做網路限制
- 但是有一個重點是:
- 不是所有的CNI NetWork Plugin都能支援NetworkPolicy
- 例如另一個常見的CNI的NetWork Plugin — flannel
- flannel就沒辦法配合NetworkPolicy
- 所以若真有需要再Cluster內部建立Pods間的網路限制
- 就要特別挑選要安裝的CNI NetWork Plugin
如何建立NetworkPolicy元件?
- 首先要先決定到這個NetworkPolicy是為誰而定的
- 基本是透過Label決定:
- 其中若是podSelector為空值(如下圖)
- 則表示該NetworkPolicy生效於所有該NameSpace的全部Pods
- 當然上圖也可以更改另一個NameSpace
- 使上述空值的podSelector規則生效於另一個NameSpace
- 接著則是有哪些規則可以定義!?
- 基本有兩個:
- 1.進來的(Incoming rules = Ingress)規則,定義誰可以進到這個Pod
- 2.出去的(Outgoing rules = Egress)規則,定義誰可以離開這個Pod
- 首先簡單Ingress範例如下:
- 並且一般來說僅限定某個特殊PORT可供取用,mysql通常開3306
- 也就是單一個規則會有兩個限制(1.label ,2.PORT)
- 如上規則下,有一個php的Pod沒有帶app: backend label,則會:
- 除非規則異動為如下
- 則php Pod就能夠透過3306 PORT進到mysql的Pod內:
- 接著輪到簡單Egress範例要求如下圖依樣,允許連接到兩個不同DB系統:
- 則對應的設定如下圖:
- 另外不管進還出的NetworkPolicy,都要特別注意的點是:
- 若考量到兩種DB的Pods
- 都跟backend的Pod不同NameSpace的狀況,如何設定?
- 其實依樣看該NetworkPolicy是為誰而設定的為出發點:
- 並且完整的設定方式如下:
- 同理我們也可以手動自己給NameSpace增設label來使用!
- 上面圖上就簡單使用預設會自動產生的label來設定!
- 另外要特別注意兩個設定區塊:
- 1.podSelector區塊
- 2.namespaceSelector區塊
- 以下圖來說,這部分還算好理解:
- 但是考量到有一種疏忽的狀況,將會造成整個規則改變如下:
- 如上圖狀況來說
- 第二個label條件為NameSpace名為database的Pods全都符合
- 亦即該條件過於簡單
- 如上例子的問題,所以在設定時,要格外注意syntax(語法)
同時設定進/出的規則:
- 另外ingress與egress規則是可以同時設定的,參考下面:
- 實際條件設定在其下方:
- 其中上半部達成的條件示意圖如下:
- 再加上下半部egress條件得到如下示意圖:
如何設置廣域的規則(Deny/Allow All Traffic):
- 比如今天資安決定所有Pod不能有任何外部請求進去,則可以這樣設:
- 另外也有反過來,允許全部的Traffic,則要改為如下設定:
- 上述設定方式也可同理方式套用在egress設定
小總結:
- 經過上面各種NetworkPolicy設定
- 就可以知道如何根據需求定義適當的規則
- 例如我只想針對特定NameSpace裡面的Pods禁止隨意地連線
- 就可以照上面範例進行設定
下一篇就快速Demo如上的NetworkPolicy設定