Kubernetes - Network Policy學習紀錄

Posted by Kubeguts on 2022-04-05

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可以通過該NP
      • namespaceSelector 指定標註特定label的namespace可以通過該NP
      • podSelector: 允許哪些標註特定label的pod可以通過該NP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978

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

Reference