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

在 Kubernetes 中實施網路策略

編者按:這篇博文是關於Kubernetes 1.8新功能的系列深度文章之一。

Kubernetes 現在提供使用網路策略來強制執行 Pod 之間通訊規則的功能。此功能已在 Kubernetes 1.7 中變得穩定,並可在受支援的網路外掛中使用。Kubernetes 1.8 版本增強了此功能。

網路策略:它意味著什麼?

在配置了預設設定的 Kubernetes 叢集中,所有 Pod 都可以無限制地相互發現和通訊。新的 Kubernetes 物件型別 NetworkPolicy 允許您允許和阻止流向 Pod 的流量。

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

我如何向我的叢集新增網路策略?

網路策略由網路外掛實現。這些外掛通常在您的叢集中安裝一個疊加網路以強制執行配置的網路策略。許多網路外掛,包括 CalicoRomanaWeave Net,都支援使用網路策略。

Google Container Engine (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。

要實現此設定,請使用以下清單建立 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 叢集中應用以下清單來啟用此類策略:

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny

spec:

  podSelector:

其他網路策略功能

除了前面的示例,您還可以讓網路策略 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 的 Pod 訪問埠 80 的許可權,而無需建立額外的 NetworkPolicy 資源。

瞭解更多