本文已超過一年。較舊的文章可能包含過時的內容。檢查頁面中的資訊自發布以來是否已變得不正確。

在 Kubernetes 中實施網路政策

編輯註記: 這篇文章是關於 Kubernetes 1.8 新功能的系列深入文章之一。

Kubernetes 現在提供功能,可以使用網路政策來強制執行關於哪些 Pod 可以互相通信的規則。此功能在 Kubernetes 1.7 中已變得穩定,並且可以與支援的網路外掛程式一起使用。Kubernetes 1.8 版本為此功能新增了更好的功能。

網路政策:這是什麼意思?

在使用預設設定配置的 Kubernetes 叢集中,所有 Pod 都可以互相發現和通信,而沒有任何限制。新的 Kubernetes 物件類型 NetworkPolicy 讓您可以允許和封鎖到 Pod 的流量。

如果您在 Kubernetes 叢集中運行多個應用程式,或在多個團隊之間共享叢集,則安全最佳實務是建立防火牆,以允許 Pod 互相通信,同時封鎖其他網路流量。網路政策對應於虛擬機器世界中的安全群組概念。

如何將網路政策新增到我的叢集?

網路政策由網路外掛程式實作。這些外掛程式通常會在您的叢集中安裝覆蓋網路,以強制執行配置的網路政策。許多網路外掛程式,包括 CalicoRomanaWeave Net,都支援使用網路政策。

當您使用以下命令建立叢集時,Google 容器引擎 (GKE) 也提供使用 Calico 網路外掛程式的網路政策 Beta 支援

gcloud beta container clusters create --enable-network-policy

如何配置網路政策?

一旦您安裝了實作網路政策的網路外掛程式,您需要建立 NetworkPolicy 類型的 Kubernetes 資源。此物件描述兩組基於標籤的 Pod 選擇器欄位,匹配

  1. 網路政策應用於的一組 Pod(必填)
  2. 允許互相存取的一組 Pod(選填)。如果您省略此欄位,它將匹配到沒有 Pod;因此,不允許任何 Pod。如果您指定一個空的 Pod 選擇器,它將匹配到所有 Pod;因此,允許所有 Pod。

範例:限制到 Pod 的流量

以下網路政策範例封鎖所有叢集內到一組 Web 伺服器 Pod 的流量,除了政策配置允許的 Pod 之外。

為了實現此設定,請使用以下 Manifest 建立 NetworkPolicy

kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: access-nginx

spec:

  podSelector:

    matchLabels:

      app: nginx

  ingress:

  - from:

    - podSelector:

        matchLabels:

          app: foo

一旦您應用此配置,只有標籤為 app: foo 的 Pod 才能與標籤為 app: nginx 的 Pod 通信。如需更詳細的教學,請參閱 Kubernetes 文件

範例:預設情況下限制所有 Pod 之間的流量

如果您將 spec.podSelector 欄位指定為空,則網路政策匹配的 Pod 集合為命名空間中的所有 Pod,預設情況下封鎖所有 Pod 之間的流量。在這種情況下,您必須明確建立網路政策,將所有 Pod 之間的通信列入白名單。

您可以透過在您的 Kubernetes 叢集中應用以下 Manifest 來啟用這樣的政策

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny

spec:

  podSelector:

其他網路政策功能

除了先前的範例之外,您還可以使 Network Policy API 強制執行更複雜的規則

  • 對外網路政策:在 Kubernetes 1.8 中引入,您可以限制您的工作負載建立與指定 IP 範圍之外資源的連線。
  • IP 區塊支援:除了使用 podSelector/namespaceSelector 之外,您還可以指定具有 CIDR 區塊的 IP 範圍,以允許/拒絕入口或出口規則中的流量。
  • 跨命名空間政策:使用 ingress.namespaceSelector 欄位,您可以為叢集中特定或所有命名空間強制執行網路政策。例如,您可以建立特權/系統命名空間,即使預設政策是封鎖流量,這些命名空間也可以與 Pod 通信。
  • 限制到連接埠號碼的流量:使用 ingress.ports 欄位,您可以指定政策要強制執行的連接埠號碼。如果您省略此欄位,則政策預設匹配所有連接埠。例如,您可以使用它來允許監控 Pod 僅查詢應用程式的監控連接埠號碼。
  • 單一政策上的多個入口規則:由於 spec.ingress 欄位是一個陣列,因此您可以使用相同的 NetworkPolicy 物件,透過使用不同的 Pod 選擇器來授予對不同連接埠的存取權。例如,NetworkPolicy 可以有一個入口規則,授予具有 kind: monitoring 標籤的 Pod 對連接埠 9000 的存取權,以及另一個入口規則,授予標籤 app: foo 對連接埠 80 的存取權,而無需建立額外的 NetworkPolicy 資源。

瞭解更多