一 Kubernetes網絡政策
1.1 政策說明
為實作細粒度的容器間網絡通路隔離政策,Kubernetes釋出Network Policy,目前已更新為networking.k8s.io/v1穩定版本。
Network Policy的主要功能是對Pod間的網絡通信進行限制和準入控制,設定方式為将Pod的Label作為查詢條件,設定允許通路或禁止通路的用戶端Pod清單。目前查詢條件可以作用于Pod和Namespace級别。
為了使用Network Policy,Kubernetes引入了一個新的資源對象Network Policy,供使用者設定Pod間網絡通路的政策。但僅定義一個網絡政策是無法完成實際的網絡隔離的,還需要一個政策控制器(Policy Controller)進行政策的實作。
政策控制器由第三方網絡元件提供,目前Calico、Cilium、Kube-router、Romana、WeaveNet等開源項目均支援網絡政策的實作。Network Policy的工作原理如下所示,policy controller需要實作一個API Listener,監聽使用者設定的Network Policy定義,并将網絡通路規則通過各Node的Agent進行實際設定(Agent則需要通過CNI網絡插件實作)。
1.2 網絡政策配置
網絡政策的設定主要用于對目标Pod的網絡通路進行限制,在預設情況下對所有Pod都是允許通路的,在設定了指向Pod的Network Policy網絡政策之後,通路Pod将會被限制。
示例1:
[root@k8smaster01 study]# vi networkpolicy_01.yaml
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: test-network-policy
5 namespace: default
6 spec:
7 podSelector:
8 matchLabels:
9 role: db
10 policyTypes:
11 - Ingress
12 - Egress
13 ingress:
14 - from:
15 - ipBlock:
16 cidr: 172.17.0.0/16
17 except:
18 - 172.17.1.0/24
19 - namespacesSelector:
20 matchLabels:
21 project: mopoject
22 - podSelector:
23 matchLabels:
24 role: frontend
25 ports:
26 - protocol: TCP
27 port: 6379
28 egress:
29 - to:
30 - ipBlock:
31 cidr: 10.0.0.0/24
32 ports:
33 - protocol: TCP
34 port: 5978
參數解釋:
- podSelector:用于定義該網絡政策作用的Pod範圍,本例的選擇條件為包含“role=db”标簽的Pod。
- policyTypes:網絡政策的類型,包括ingress和egress兩種,用于設定目标Pod的入站和出站的網絡限制。
- ingress:定義允許通路目标Pod的入站白名單規則,滿足from條件的用戶端才能通路ports定義的目标Pod端口号。
- -from:對符合條件的用戶端Pod進行網絡放行,規則包括基于用戶端Pod的Label、基于用戶端Pod所在的Namespace的Label或者用戶端的IP範圍。
- -ports:允許通路的目标Pod監聽的端口号。
- egress:定義目标Pod允許通路的“出站”白名單規則,目标Pod僅允許通路滿足to條件的服務端IP範圍和ports定義的端口号。
- -to:允許通路的服務端資訊,可以基于服務端Pod的Label、基于服務端Pod所在的Namespace的Label或者服務端IP範圍。
- -ports:允許通路的服務端的端口号。
如上示例的最終效果如下:
- 該網絡政策作用于Namespace“default”中含有“role=db”Label的全部Pod。
- 允許與目标Pod在同一個Namespace中的包含“role=frontend”Label的用戶端Pod通路目标Pod。
- 允許屬于包含“project=myproject”Label的Namespace的用戶端Pod通路目标Pod。
- 允許從IP位址範圍“172.17.0.0/16”的用戶端Pod通路目标Pod,但是不包括IP位址範圍“172.17.1.0/24”的用戶端。
- 允許目标Pod通路IP位址範圍“10.0.0.0/24”并監聽5978端口的服務。
注意:關于namespaceSelector和podSelector的說明:在from或to的配置中,namespaceSelector和podSelector可以單獨設定,也可以組合配置。如果僅配置podSelector,則表示與目标Pod屬于相同的Namespace,而組合設定則可以設定Pod所屬的Namespace,例如:
1 - from:
2 - namespacesSelector:
3 matchLabels:
4 project: mopoject
5 - podSelector:
6 matchLabels:
7 role: frontend
如上表示允許通路目标Pod的來源用戶端Pod應具有如下屬性:屬于有“project=myproject”标簽的Namespace,并且有“role=frontend”标簽。
1.3 Namespace級别政策
在Namespace級别還可以設定一些預設的全局網絡政策,以友善管理者對整個Namespace進行統一的網絡政策設定。
示例1:預設禁止任何用戶端通路該Namespace中的所有Pod。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: default-deny
5 spec:
6 podSelector: {}
7 policyTypes:
8 - Ingress
示例2:預設允許任何用戶端通路該Namespace中的所有Pod。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: allow-all
5 spec:
6 podSelector: {}
7 ingress:
8 - {}
9 policyTypes:
10 - Ingress
示例3:預設禁止該Namespace中的所有Pod通路外部服務。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: default-deny
5 spec:
6 podSelector: {}
7 policyTypes:
8 - Egress
示例4:預設允許該Namespace中的所有Pod通路外部服務。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: allow-all
5 spec:
6 podSelector:{}
7 egress:
8 - {}
9 policyTypes:
10 - Egress
示例5:預設禁止任何用戶端通路該Namespace中的所有Pod,同時禁止通路外部服務。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: default-deny
5 spec:
6 podSelector: {}
7 policyTypes:
8 - Ingress
9 - Egress