NetworkPolicy是Kubernetes的一個新特性,它負責配置 Pod
組如何與彼此和其他網絡端點進行通信。換句話說,它在運作于Kubernetes叢集上的Pod間建立防火牆。
該特性在
Kubernetes 1.7 版中已較為穩定。本文将闡述NetworkPolicy在理論與實踐中分别是如何工作的。使用NetworkPolicy你可以做些什麼
預設情況下,Kubernetes沒有限制叢集内pod之間的通信。這意味着叢集内任意Pod之間都可以像沒有防火牆一樣直接進行通信。NetworkPolicy讓我們可以規定有哪些Pod可以連接配接到其餘Pod。
這些Policy可以被描述的更為細節:你可以指定哪些命名空間可以進行通信,或者更具體地說,你可以選擇要執行每個Policy的端口号。
目前你不能使用這一特性強制執行來自pod的外發(出口)流量的Policy。這在Kubernetes 1.8的規劃中。
同時,Istio開源項目也是一個支援出口政策和其他更多功能的替代方案。
為什麼說NetworkPolicy很酷
數十年來,NetworkPolicy是用來計算ACL(通路控制清單)的獨特方式。這是Kubernetes在Pod之間進行ACL的方式。就像任何其他Kubernetes資源一樣,NetworkPolicy通過聲明式檔案配置。它們是應用程式的一部分,你可以在源存儲庫中對它們進行修改,并随着應用程式部署到Kubernetes中。
NetworkPolicy幾乎是實時應用的。如果你在Pod之間建立了連接配接,則應用組織連接配接的NetworkPolicy将會導緻連接配接立即被終止。這種近乎實時的好處是使網絡損耗非常小。
使用案例示例
以下是NetworkPolicy一般使用案例的簡單清單。
阻斷到應用程式的所有流量

限制到應用程式的流量
在命名空間中阻斷所有非白名單的流量
阻斷來自其他命名空間的所有流量
允許來自其他命名空間的流量
允許來自外部用戶端的流量
NetworkPolicy如何執行
NetworkPolicy的實作不是Kubernetes的核心功能。即使你可以送出一個NetworkPolicy對象到Kubernetes主節點,如果你的網絡插件不能實作網絡政策,它也不會被實作。
Google Container Engine (GCE)通過在叢集中預裝Calico網絡插件提供了對網絡政策的支援。
網絡政策适用于連接配接,而不是網絡資料包。請注意,一個連接配接允許網絡資料包的雙向傳輸。例如,如果Pod A可以連接配接到Pod B,那麼Pod B會在相同的連接配接中響應Pod A。這并不意味着Pod B可以啟動與Pod A的連接配接。
NetworkPolicy的結構
NetworkPolicy隻是Kubernetes API的另一個對象。你可以為一個叢集建立許多NetworkPolicy。一個NetworkPolicy有兩個主要部分:
- 目标Pod:哪些Pod有通過NetworkPolicy執行的ingress網絡連接配接?這些Pod通過它們的标簽被選擇。
- Ingress規則:哪些Pod可以連接配接到目标Pod?這些Pod通過它們的标簽或者命名空間被選擇。
如下是一個NetworkPolicy更具體的例子:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: api-allow
spec:
podSelector:
matchLabels:
app: bookstore
role: api
ingress: - from: - podSelector:
matchLabels:
app: bookstore
- from: - podSelector:
matchLabels:
app: inventory
這個樣例Policy允許擁有app=bookstore或app=inventory标簽的Pod連接配接到擁有app=bookstore和role=api标簽的Pod。你可以這樣解讀它:把bookstore應用程式通路的微服務指定給bookstore的API。
如何評價NetworkPolicy
NetworkPolicy的設計文檔和API reference看起來比較複雜,我設法把它分解成幾個簡單的規則:
- 如果NetworkPolicy選擇了一個Pod,那麼到該Pod的流量将受到限制。
- 如果一個Pod沒有NetworkPolicy,命名空間下的所有Pod都可以連接配接到此Pod。這意味着如果沒有為一個Pod定義NetworkPolicy,就預設“允許所有”。
- 如果Pod A的流量被限制,但Pod B需要連接配接到Pod A,這應當至少有一個NetworkPolicy選擇Pod A,且它具有選擇Pod B的Ingress規則。
當包含跨命名空間網絡時,事情就變得有些複雜了,簡而言之,它是這樣工作的:
- NetworkPolicy可以強制執行與部署在同一命名空間下的Pod的連接配接的規則。
- Ingress規則的podSelector隻能選擇部署NetworkPolicy的同一命名空間中的pod。
- 如果Pod A需要連接配接另一命名空間下的Pod B,并且Pod B的網絡被強制執行,則需要在Pod B中有一個具有選擇Pod A的namespaceSelector的Policy。
NetworkPolicy是否安全
NetworkPolicy限制Pod到Pod的網絡,這是保護叢集流量和應用程式的一部分。它們不是進行深度包檢測的防火牆。
你不應該隻依賴于NetworkPolicy保證叢集pod間的安全通信。諸如TLS(傳輸層安全性)與互相認證的方法使你能夠加密流量并在微服務之間進行身份驗證。
本文轉自中文社群-
Kubernetes叢集安全通信