天天看點

Kubernetes叢集安全通信

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一般使用案例的簡單清單。

阻斷到應用程式的所有流量

Kubernetes叢集安全通信

限制到應用程式的流量

Kubernetes叢集安全通信

在命名空間中阻斷所有非白名單的流量

Kubernetes叢集安全通信

阻斷來自其他命名空間的所有流量

Kubernetes叢集安全通信

允許來自其他命名空間的流量

Kubernetes叢集安全通信

允許來自外部用戶端的流量

Kubernetes叢集安全通信

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有兩個主要部分:

  1. 目标Pod:哪些Pod有通過NetworkPolicy執行的ingress網絡連接配接?這些Pod通過它們的标簽被選擇。
  2. 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看起來比較複雜,我設法把它分解成幾個簡單的規則:

  1. 如果NetworkPolicy選擇了一個Pod,那麼到該Pod的流量将受到限制。
  2. 如果一個Pod沒有NetworkPolicy,命名空間下的所有Pod都可以連接配接到此Pod。這意味着如果沒有為一個Pod定義NetworkPolicy,就預設“允許所有”。
  3. 如果Pod A的流量被限制,但Pod B需要連接配接到Pod A,這應當至少有一個NetworkPolicy選擇Pod A,且它具有選擇Pod B的Ingress規則。

當包含跨命名空間網絡時,事情就變得有些複雜了,簡而言之,它是這樣工作的:

  1. NetworkPolicy可以強制執行與部署在同一命名空間下的Pod的連接配接的規則。
  2. Ingress規則的podSelector隻能選擇部署NetworkPolicy的同一命名空間中的pod。
  3. 如果Pod A需要連接配接另一命名空間下的Pod B,并且Pod B的網絡被強制執行,則需要在Pod B中有一個具有選擇Pod A的namespaceSelector的Policy。

NetworkPolicy是否安全

NetworkPolicy限制Pod到Pod的網絡,這是保護叢集流量和應用程式的一部分。它們不是進行深度包檢測的防火牆。

你不應該隻依賴于NetworkPolicy保證叢集pod間的安全通信。諸如TLS(傳輸層安全性)與互相認證的方法使你能夠加密流量并在微服務之間進行身份驗證。

本文轉自中文社群-

Kubernetes叢集安全通信

繼續閱讀