Network Policy (NP) 作用
Network Policies用來限制Pod與Pod之間的輸入與輸出的溝通,可以限制哪些ip或者port給他人存取或溝通
避免有心人士可透過K8s cluster內其中一個Pod,就可以與同一座cluster的所有application pod去做溝通存取
基本上Network Policy控制的是OSI layer的layer 3 (IP address) 以及 layer 4 (TCP, port)
接下來提到Network Policy會簡稱NP
Network Policy範例
Network Policy的manifest如下
- 可以用
podSelector針對要對標註特定label的Pod套用NP - 限制Pod的輸入或輸出
- Ingress: 限制incoming traffic
- Egress: 限制outgoing traffic
ipBlock可以只允許哪些CIDR底下的pod可以通過該NPnamespaceSelector指定標註特定label的namespace可以通過該NPpodSelector: 允許哪些標註特定label的pod可以通過該NP
1 | apiVersion: networking.k8s.io/v1 |
Network Policy 範例
設置最基本的限制規則 default deny network policy
實務上通常都會先設置一個 default deny 的network policy來擋住未經許可的溝通
Scenario: client Pod因設置default deny network policy而無法存取nginx Pod
創建namespace, 以及部署一個deployment & (nginx) pod後,取得pod被分派的ip (192.168.194.65)

創建一個client pod就叫client, 定期去ping nginx pod的ip (192.168.194.65),先確認是否能夠存取nginx pod的服務

透過kubectl logs 看一下client nptest pod的logs,確認目前client是可以存取到nginx pod的歡迎首頁


接著要做限制,創建一個NetworkPolicy default-deny-all.yaml,會限制namespace底下所有ingree, egress的進出

該NP default-deny-all限制nptest底下所有pod的進出都不能溝通


創建一個NetworkPolicy後,就可以看到剛剛的client pod發生了connection timeout的狀態了

透過額外Network Policies來允許特定Pods之間的溝通
特別要注意的是,NetworkPolicies就像防火牆一樣,每一個規則都是疊加上去的
例如有一個NetworkPolicy是ingress, 一個是egress,兩個套用在pod上面,那就會有ingress與egress的限制規則
更進階的情況如下,像上述已經有限制default deny的Network Policy了
但我們額外創建一個可以允許client跟nginx pod溝通的NetworkPolicy,是可以額外疊加上NetworkPolicy去達成
Scenario: 設置Network Policy 允許client pod能夠與nginx pod溝通
該NP設置只允許同時符合以下兩點的pod,才能夠存取
- pod若有在namespace:
project:test底下,套用該NP - 若pod有
app:client這個label,也套用NP


要特別注意!!!!!!!
假如在from這邊把 podSelector獨立出來用array設置,代表只要符合以下其中一點就好,就能通過該NP
- pod若有在namespace:
project:test底下,套用該NP - 若pod有
app:client這個label,也套用NP

創建該NP,並為client所在的namespace設置對應的label project=test

要注意這時client pod還是沒辦法connect到nginx pod. 因為也要為client設置Egress NP!


這時為client pod設置可以outgoing traffic的NP

創建NP後,就可以看到client可以存取到nginx pod了


小結
可以看到Network Policy可以讓我們限制同一個namespace底下不同Pod之間的輸出與輸入的溝通,就像是VM的防火牆一樣,pod內提供了最基本的安全防護機制
設置Default Deny不僅能夠確保所有的Pods的連線是可控的,
且配置namespace底下的ingress與egress也要相輔相成,如為client設置egress的outgoing traffic 和 nginx pod的ingress incoming traffic的規則,才能夠算是讓Pods之間可進行溝通,達到Pod與Pod之間的傳輸控管