返回文章列表

Kubernetes 網路安全 eBPF 實戰

本文探討 Kubernetes 網路模型和安全策略,涵蓋網路基礎、Kubernetes 網路模型、網路策略、eBPF 與 Calico 整合,以及最佳實踐。從底層網路概念到進階 eBPF 技術,提供全面的 Kubernetes 網路安全,並解析 Calico 網路選項、DNS、NAT 和 MTU

容器技術 網路安全

Kubernetes 網路模型的簡潔性與可移植性是其核心優勢,但同時也需要深入理解其運作機制才能確保網路安全。本文從基礎網路概念出發,逐步解析 Kubernetes 網路模型的各個層面,包含 Pod 間通訊、服務發現、網路策略等。接著,文章探討 Calico 作為網路方案的優勢,特別是其與 eBPF 的整合,如何提升網路效能和安全性。最後,文章提供網路策略的最佳實踐,協助讀者建構更安全的 Kubernetes 叢集。

Kubernetes 網路與安全:從基礎到進階 eBPF 實戰

Kubernetes 已成為管理容器化工作負載和服務的事實標準。透過宣告式組態和自動化,Kubernetes 大幅簡化了可靠協調運算、儲存和網路的複雜性。Kubernetes 網路模型是簡化的核心基礎,定義了一套通用的行為,使微服務之間的通訊變得簡單且可跨環境移植。

網路基礎概念

在探討 Kubernetes 網路之前,我們需要了解一些基本的網路概念,包括網路層、網路封包結構、IP 位址、子網路和 IP 路由、疊加網路、DNS、NAT 和 MTU 等。

網路層與封包結構

網路層是 OSI 模型的第三層,負責資料包的路由和轉發。網路封包結構包括來源和目的 IP 位址、來源和目的埠號、協定型別等資訊。

IP 位址與子網路

IP 位址是用於識別網路上裝置的唯一位址。子網路是將一個大的 IP 網路劃分為多個小的網路,以提高網路管理和安全性。

Kubernetes 網路模型

Kubernetes 網路模型定義了一套通用的行為,使 Pod 之間的通訊變得簡單且可跨環境移植。Kubernetes 網路模型主要包括以下幾個方面:

Kubernetes 網路實作

Kubernetes 網路實作有多種選擇,包括 Calico、Flannel、Cilium 等。這些實作都遵循 Kubernetes 網路模型的基本原則,但各自有不同的優缺點和適用場景。

Kubernetes 服務

Kubernetes 服務(Service)是一種抽象,用於將 Pod 暴露給外部流量。服務可以分為 Cluster IP 服務、NodePort 服務和 LoadBalancer 服務等型別。

網路安全與策略

網路安全是 Kubernetes 網路中的一個重要方面。Kubernetes 提供了網路策略(Network Policy)機制,用於控制 Pod 之間的流量。

網路策略

網路策略是一種宣告式組態,用於定義 Pod 之間的通訊規則。網路策略可以根據來源和目的 Pod 的標籤、埠號和協定型別等資訊進行匹配。

Calico 網路策略

Calico 是一種流行的 Kubernetes 網路實作,提供了豐富的網路策略功能。Calico 網路策略支援根據標籤、埠號和協定型別等資訊進行匹配,並提供了預設拒絕(Default Deny)和階層式策略(Hierarchical Policy)等功能。

eBPF 與 Calico

eBPF(Extended Berkeley Packet Filter)是一種 Linux 核心技術,用於高效地處理網路封包。Calico 使用 eBPF 作為其資料平面,提供了高效的網路效能和豐富的網路功能。

eBPF 的優勢

eBPF 提供了多種優勢,包括高效的封包處理、豐富的程式設計能力和良好的安全特性。eBPF 可以用於實作各種網路功能,包括負載平衡、防火牆和網路監控等。

網路基礎概念解析

在現代企業或公有雲網路環境中,理解網路基礎概念對於深入掌握Calico等網路技術至關重要。本章節將介紹網路分層、網路封包結構、MTU、IP位址、子網路、IP路由、Overlay網路、DNS和NAT等關鍵概念。

網路分層(OSI模型)

網路通訊過程通常被劃分為7個層級,稱為OSI模型(L1-L7)。資料在傳輸過程中會依次透過這些層級,每一層負責特定的處理任務。

  • L5-7: 應用層協定,如HTTP、FTP、SSH、SSL、DNS等,多數應用開發者熟悉此範圍內的協定。
  • L4: 傳輸層協定,如TCP或UDP,包括來源和目的埠號。
  • L3: 網路層協定,涉及IP封包和IP路由。
  • L2: 資料鏈路層協定,如乙太網路封包和乙太網路交換。

網路封包剖析

在資料傳輸過程中,每一層網路堆積疊都會新增自己的標頭,包含該層所需的控制資訊或後設資料。這樣,最終形成的封包包含了所有層級所需的控制資訊,而無需任何一層理解其他層的資料或控制資訊。

IP位址、子網路與IP路由

IP位址

IP位址用於標識網路中的裝置,主要分為IPv4和IPv6兩種。

  • IPv4位址: 長度為32位元,通常表示為四個以點分隔的十進位制位元組(每個0-255之間)。例如:192.168.27.64。IPv4位址分為私有位址和公有位址,私有位址僅能在本地網路中使用,不可在網際網路上路由。
  • IPv6位址: 長度為128位元,通常表示為8組以冒號分隔的四位十六進位制數。例如:1203:8fe0:fe80:b897:8990:8a7c:99bf:323d。由於其長度,IPv6位址空間遠大於IPv4,能夠滿足未來網路擴充套件的需求。

子網路與IP路由

  • 子網路: 在單一L2網路內的一組IP位址稱為子網路。在子網路內,裝置之間可以直接透過L2標頭進行通訊,無需經過路由器。
  • IP路由: 要將封包傳送到不同子網路,需要透過L3路由。每個作為路由器的網路裝置根據L3路由規則決定封包的下一跳目的地。例如,在Linux系統中,路由表項10.48.0.128/26 via 10.0.0.12 dev eth0表示目的地IP在10.48.0.128/26範圍內的封包應透過eth0介面傳送到下一跳路由器10.0.0.12

路由協定

路由可以靜態組態或透過路由協定動態學習。常見的路由協定包括BGP(邊界閘道器協定),它廣泛應用於大型企業和資料中心網路,並作為網際網路的主要路由協定之一,具有良好的擴充套件性和廣泛的支援。

Overlay網路

Overlay網路允許網路裝置在底層網路(underlay)上進行通訊,而無需底層網路瞭解Overlay網路的拓撲結構。Overlay網路透過將原始封包(inner packet)封裝在外層封包(outer packet)中傳輸,對底層網路呈現為外層封包,從而實作跨越不同底層網路的通訊。例如,VXLAN將原始封包封裝在UDP封包中傳輸。

內容解密:

  1. Overlay網路的工作原理: Overlay網路透過封裝技術,將原始封包包裝在外層封包中,使其能夠在底層網路中傳輸。這種機制使得Overlay網路能夠跨越不同的物理網路基礎設施。
  2. Overlay網路的型別: 有多種Overlay網路技術,如VXLAN、Geneve等,它們在封裝方式和控制協定上有所不同,但都旨在實作跨越底層網路的虛擬化網路連線。
  3. Overlay網路的優勢: Overlay網路提供了更大的靈活性,允許虛擬化網路的建立和管理獨立於底層物理網路架構。

綜上所述,理解這些基礎概念對於深入掌握現代網路技術,包括Calico等雲原生網路方案,具有重要意義。這些知識有助於更好地設計、實施和管理複雜的網路環境。

Kubernetes 網路基礎與 Calico 網路選項解析

Kubernetes 網路模型提供了一套簡潔且一致的網路環境,跨足多種網路實作與基礎設施。理解此模型有助於掌握容器、Pod 及服務之間的通訊機制。本章將探討 Kubernetes 網路模型的關鍵概念及其相互關聯。

覆疊網路(Overlay Network)與其效能影響

覆疊網路具有對底層網路基礎設施依賴性低的優勢,但同時也存在一些缺點:

  • 相較於非覆疊網路,覆疊網路會帶來些微的效能影響。若執行網路密集型工作負載,這種影響可能需要被避免。
  • 覆疊網路中的工作負載不容易被外部網路直接存取,因此需要 NAT 閘道器或負載平衡器來橋接覆疊網路與底層網路,以實作輸入或輸出流量的管理。

Calico 網路選項提供了極大的靈活性,可以選擇是否使用覆疊網路或非覆疊網路。詳細的選擇可參考 Calico 的最佳網路選項。

DNS 在網路中的角色

雖然底層網路封包流動是透過 IP 位址來決定的,但使用者和應用程式通常希望使用穩定的名稱來識別網路目標,即使底層 IP 位址發生變化。DNS(網域名稱系統)負責將名稱轉換為 IP 位址。每個連線到網路的裝置通常會被組態一個或多個 DNS 伺服器的 IP 位址。當應用程式嘗試連線到某個網域名稱時,會向 DNS 伺服器傳送 DNS 請求,伺服器隨後回應對應的 IP 位址,應用程式便可據此建立連線。

NAT 與 MTU 的重要性

NAT(網路位址轉譯)

NAT 是將封包中的 IP 位址對映到不同 IP 位址的過程,取決於使用情境,可以對來源或目的 IP 位址進行轉換。常見的使用情境包括允許具有私有 IP 位址的裝置與具有公有 IP 位址的裝置在網際網路上通訊,以及負載平衡。


#### NAT 工作流程範例:
1. 來源 NAT(SNAT):私有 IP 位址裝置連線公有 IP 位址時,路由器將來源 IP 轉換為自己的公有 IP。
2. 目的 NAT(DNAT):負載平衡器將輸入連線的目的 IP 轉換為後端裝置的 IP。

MTU(最大傳輸單元)

MTU 定義了網路鏈路中可傳輸的最大封包大小。通常,所有網路鏈路會被組態為相同的 MTU,以減少封包碎片化的需求,從而提升網路效能。TCP 會嘗試學習路徑 MTU,並根據路徑中的最小 MTU 調整封包大小。


#### MTU 對網路效能的影響:
- 大多數網路鏈路的 MTU 為 1500 位元組,但某些網路支援高達 9000 位元組的 MTU。
- 在 Linux 系統中,更大的 MTU 可以降低 CPU 使用率,因為需要處理的封包數量減少。

Kubernetes 網路模型詳解

Kubernetes 網路模型定義了以下基本行為:

  • 每個 Pod 獲得自己的 IP 位址。
  • Pod 內的容器分享 Pod 的 IP 位址,可以自由通訊。
  • Pod 可以使用其他 Pod 的 IP 位址直接通訊,無需 NAT。
  • 網路隔離透過網路策略來定義。

此模型使得 Pod 可以被視為虛擬機器或主機,而 Pod 內的容器則類別似於在同一虛擬機器或主機內執行的行程。這種設計簡化了應用程式從傳統環境遷移到 Kubernetes 的過程。

Kubernetes 網路實作

Kubernetes 內建的 kubenet 可以提供基本的網路連線,但更常見的是使用第三方網路實作,它們透過 CNI(容器網路介面)API 與 Kubernetes 整合。

CNI 的重要性:

CNI 提供了一個標準化的介面,讓不同的網路實作可以與 Kubernetes 無縫整合,從而提供了豐富的網路功能選擇。

Kubernetes 網路架構深度解析

Kubernetes 的網路架構是其核心功能之一,提供了一個扁平化的網路模型,讓每個 Pod 都能直接與其他 Pod 進行通訊。本章將探討 Kubernetes 網路服務、DNS 解析、網路策略等關鍵概念,並分析其安全性和實作細節。

Kubernetes 服務與 DNS 解析

Kubernetes 服務(Service)提供了一種抽象化的網路服務,能夠將一組 Pod 暴露為單一的網路介面。這組 Pod 通常透過標籤選擇器(Label Selector)進行定義。在叢集內部,服務通常以虛擬 IP(Virtual IP)的形式呈現,而 kube-proxy 負責將連線請求負載平衡到後端的 Pod。

虛擬 IP 可以透過 Kubernetes DNS 服務進行解析。DNS 名稱和虛擬 IP 在服務的生命週期內保持不變,即使後端的 Pod 可能會被建立或銷毀。

服務存取控制

Kubernetes 服務也定義瞭如何從叢集外部存取服務,例如:

  • 使用節點埠(Node Port),服務可以透過每個節點上的特定埠進行存取。
  • 使用負載平衡器(Load Balancer),網路負載平衡器提供了一個虛擬 IP,服務可以透過該 IP 從叢集外部進行存取。

DNS 解析機制

每個 Kubernetes 叢集都提供了一個 DNS 服務。每個 Pod 和每個服務都可透過 Kubernetes DNS 服務進行解析。例如:

  • 服務:my-svc.my-namespace.svc.cluster-domain.example
  • Pod:pod-ip-address.my-namespace.pod.cluster-domain.example

DNS 服務是以 Kubernetes 服務的形式實作的,對映到一個或多個 DNS 伺服器 Pod(通常是 CoreDNS)。這些 Pod 與其他 Pod 一樣被排程,並且叢集內的 Pod 都組態為使用 DNS 服務。

網路策略與安全性

網路策略(Network Policy)是 Kubernetes 網路安全性的重要工具。它允許使用者限制叢集內的網路流量,只允許所需的流量透過。

為什麼需要網路策略?

在傳統的企業網路中,網路安全性通常是透過設計特定的網路拓撲結構和組態網路裝置(如交換器、路由器和防火牆)來實作的。然而,在 Kubernetes 的扁平化網路模型中,網路安全性是透過網路策略來定義的,而不是依賴於網路拓撲結構。

網路策略使用標籤選擇器作為其主要機制來定義哪些工作負載可以與哪些工作負載進行通訊,而不是使用 IP 位址或 IP 位址範圍。

網路策略的最佳實踐

在本章中,您將學習到:

  • 網路策略的基本概念及其重要性。
  • Kubernetes 和 Calico 網路策略之間的差異,以及何時使用每種策略。
  • 使用網路策略的最佳實踐。

CNI 外掛與網路實作

Kubernetes 網路模型支援多種 CNI(Container Network Interface)外掛。主要的 CNI 外掛分為兩類別:

  • 網路外掛:負責將 Pod 連線到網路。
  • IPAM(IP 位址管理)外掛:負責分配 Pod 的 IP 位址。

Calico 提供了網路和 IPAM 外掛,並且可以與其他 CNI 外掛無縫整合,例如 AWS、Azure 和 Google 網路 CNI 外掛。

NAT 出站流量與雙堆疊支援

Kubernetes 網路模型規定 Pod 之間必須能夠直接使用 Pod IP 位址進行通訊,但並未要求 Pod IP 位址在叢集外部可路由。許多 Kubernetes 網路實作使用覆寫網路(Overlay Network)。

當 Pod 發起與叢集外部 IP 位址的連線時,託管該 Pod 的節點會執行 SNAT(Source Network Address Translation),將封包的來源位址從 Pod IP 對映到節點 IP。這使得連線能夠跨越網路路由到目的地。

Calico 允許使用者選擇是否使用覆寫網路或完全可路由的 Pod IP 位址。此外,Calico 也支援對特定的 IP 位址範圍進行出站 NAT 組態。

Kubernetes 也支援雙堆疊模式(Dual Stack),允許 Pod 同時分配 IPv4 和 IPv6 位址,並且 Kubernetes 服務可以指定是否以 IPv4 或 IPv6 位址暴露。

Kubernetes 網路政策:強化叢集安全性的關鍵

Kubernetes 網路政策是現代微服務架構中不可或缺的安全元件,負責規範 Pod 之間的通訊規則。本章將探討 Kubernetes 網路政策的核心概念、Calico 的強化功能,以及如何透過網路政策提升叢集安全性。

Kubernetes 網路政策基礎

Kubernetes 網路政策透過 NetworkPolicy 資源定義,主要特性包括:

  1. 名稱空間範圍:網路政策在特定名稱空間內生效,與 Pod 的運作範圍一致。
  2. 標籤選擇器:透過標籤選擇器將政策套用到特定的 Pod。
  3. 精細的流量控制:可指定允許或拒絕特定來源/目的地的流量,包括其他 Pod、名稱空間或 CIDR。
  4. 多種協定支援:支援 TCP、UDP、SCTP 等協定,並可指定命名埠或埠號。

值得注意的是,Kubernetes 預設不強制執行網路政策,而是委派給網路外掛程式處理。大多數主流網路外掛程式(如 Calico)都實作了 Kubernetes 網路政策的主要功能。

程式碼範例:基本網路政策組態

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: sensitive-app
  policyTypes:
  - Ingestion
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: trusted-app
    - ports:
      - 80

內容解密:

  1. podSelector 指定此政策套用到標籤 app: sensitive-app 的 Pod。
  2. policyTypes 定義此政策同時控制輸入和輸出流量。
  3. ingress 規則允許來自標籤 app: trusted-app 的 Pod 對 80 埠的存取。
  4. 此組態展現了 Kubernetes 網路政策在微服務存取控制中的精細化能力。

Calico 網路政策的優勢

Calico 提供了超越原生 Kubernetes 網路政策的功能:

  1. 完整的 Kubernetes 網路政策支援:Calico 完整實作了 Kubernetes 網路政策的所有特性。
  2. 更豐富的網路政策功能:支援更靈活的匹配條件,如 ServiceAccount、加密身份等。
  3. 跨名稱空間的政策管理:透過 GlobalNetworkPolicy 資源實作跨名稱空間的統一管理。

Calico 的主要優勢在於:

  • 同時支援 Kubernetes 原生和 Calico 自有的網路政策
  • 提供更豐富的流量控制選項(deny、log 等動作)
  • 可套用到多種端點型別(Pod、VM、主機介面)

程式碼範例:Calico GlobalNetworkPolicy

apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: global-policy-example
spec:
  selector: 'app == "critical-service"'
  types:
  - Ingress
  - Egress
  ingress:
  - action: Allow
    protocol: TCP
    destination:
      ports:
      - 443

內容解密:

  1. selector 使用 Calico 的增強選擇器語法篩選目標工作負載。
  2. types 指定此全域政策同時控制輸入和輸出流量。
  3. ingress 規則明確允許特定流量,展現了 Calico 在安全預設下的精細控制能力。
  4. 此組態體現了 Calico 在跨名稱空間安全控管上的優勢。

網路政策的最佳實踐

  1. 分層安全架構:結合周邊防火牆和叢集內部的網路政策,形成縱深防禦體系。
  2. 動態安全管理:利用標籤選擇器實作動態的網路安全分組,避免依賴固定的 IP 位址。
  3. DevOps 整合:將網路政策的定義納入 Git 工作流程和 CI/CD 流程,實作安全即程式碼(Security as Code)。