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之間的傳輸控管