在本文中,我們提供全面指南,以規劃、執行及驗證從網路原則管理員 (NPM) 移轉至 Cilium 網路原則。 目標是確保原則同位、將服務中斷降到最低,並符合 Azure CNI 針對 eBPF 型網路和增強可檢視性的戰略方向。
本指南僅適用於執行 Linux 節點的 AKS 叢集。 AKS 中的 Windows 節點目前不支援 Cilium 網路原則。
開始之前的重要考慮
原則兼容性:NPM 和 Cilium 在強制執行模型中有所不同。 在移轉之前,您需要驗證現有原則是否相容或識別必要的變更。 如需指引,請參閱移轉前驗證一節。
停機時間預期:在節點重新映像期間,策略執行可能會暫時不一致。
Windows 節點集區:AKS 中的 Windows 節點目前不支援 Cilium 網路原則。
移轉前驗證
從網路原則管理員 (NPM) 移轉至 Cilium 網路原則之前,請務必評估現有網路原則的相容性。 雖然大部分的政策在移轉後會繼續如預期般運作,但在 NPM 與 Cilium 之間可能會有行為不同的特定情境。 這些差異可能需要在移轉前後更新原則,以確保一致強制執行,並避免非預期的流量下降。
在本節中,我們將概述可能需要原則調整的已知案例。 我們會說明為何這很重要,並提供若有必要的所需採取的動作指引,以讓您的策略與 Cilium 相容。
帶有 endPort 的 NetworkPolicy
Cilium 從 Kubernetes NetworkPolicy 的 1.17 版開始支援
endPort
欄位。
endPort 字位可讓您在單一規則中定義埠範圍,而不是指定個別埠。
以下是使用 endPort 字段的 Kubernetes NetworkPolicy 範例:
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 32000
endPort: 32768
需要動作:
如果您的 AKS 叢集執行 Cilium 1.17 版或更新版本,則不需要進行任何變更,因為已完整支援 endPort。
如果您的叢集執行 1.17 之前的 Cilium 版本,請在移轉之前,先從任何原則中移除 endPort 字段。 改用明確的單一埠項目。
ipBlock的NetworkPolicy
Kubernetes NetworkPolicy 中的 ipBlock 欄位可讓您定義輸入來源或輸出目的地的 CIDR 範圍。 這些範圍可以包含外部IP、PodIP或節點IP。 不過,Cilium 不允許使用ipBlock輸出到Pod或節點IP,即使這些IP落在指定的CIDR範圍內也一樣。
例如,下列 NetworkPolicy 會使用 ipBlock 來允許所有輸出流量到 0.0.0.0/0:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-ipblock
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
在 NPM 下,此原則會允許輸出到所有目的地,包括 Pod 和節點。
移轉至 Cilium 之後,即使輸出屬於 0.0.0.0/0 範圍,也會封鎖輸出至 Pod 和節點 IP。
需要動作:
若要允許流量流向 Pod IP,在移轉之前,請先將 ipBlock 取代為 namespaceSelector 和 podSelector 的組合。
以下是使用 namespaceSelector 和 podSelector 的範例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-ipblock
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
- namespaceSelector: {}
- podSelector: {}
針對節點IP,沒有移轉前的因應措施。 移轉之後,您必須建立 CiliumNetworkPolicy,以明確允許輸出至主機和/或遠端節點實體。 在此原則就緒之前,節點IP的輸出流量會遭到封鎖。
以下是 CiliumNetworkPolicy 允許本機和遠端節點之間流出和流入網路流量的範例:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: allow-node-egress
namespace: ipblock-test
spec:
endpointSelector: {} # Applies to all pods in the namespace
egress:
- toEntities:
- host # host allows traffic from/to the local node’s host network namespace
- remote-node # remote-node allows traffic from/to the remote node’s host network namespace
具有具名埠的網路政策
Kubernetes NetworkPolicy 可讓您依名稱而非數位來參考埠。 如果您在 NetworkPolicies 中使用具名埠,Cilium 可能無法正確強制執行規則,並導致非預期的流量遭到封鎖。 當相同的埠名稱用於不同的埠時,就會發生此問題。
如需詳細資訊,請參閱 Cilium GitHub 問題 #30003。
以下是 NetworkPolicy 使用具名埠允許輸出流量的範例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
annotations:
name: allow-egress
namespace: default
spec:
podSelector:
matchLabels:
network-rules-egress: cilium-np-test
egress:
- ports:
- port: http-test # Named port
protocol: TCP
policyTypes:
- Egress
需要動作:
在移轉之前,請將原則中的所有具名的埠替換成其對應的數字值。
具有出口政策的網路政策
NPM 上的 Kubernetes NetworkPolicy 不會封鎖從 Pod 到其節點 IP 的輸出流量,因此隱含允許此流量。 移轉至 Cilium 之後,此行為將改變,會封鎖先前允許到本地節點的流量,除非明確允許。
例如,下列原則只允許輸出至內部 API 子網:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.20.30.0/24
使用 NPM:明確允許到 10.20.30.0/24 的出口流量,並隱含地允許到本地節點的出口流量。
使用 Cilium:只允許流量至 10.20.30.0/24;除非明確允許,否則會封鎖輸出至節點IP。
需要動作:
檢閱您工作負載的所有現有輸出原則。
如果您的應用程式依賴 NPM 的隱含允許行為來輸出至本機節點,您必須新增明確的輸出規則,以在移轉後維持連線。
您可以在移轉之後新增 CiliumNetworkPolicy,以明確允許輸出流量流向本機主機。
入口策略行為變更
在網絡原則管理員 (NPM) 下,透過具有“externalTrafficPolicy=Cluster”預設設定的 LoadBalancer 或 NodePort 服務抵達的入口流量不受輸入原則的強制執行。 此行為表示,即使 Pod 有限制性的輸入原則,來自外部來源的流量仍可能透過loadbalancer或 nodeport 服務到達。
相反地,Cilium 會對所有流量強制執行輸入策略,包括因 externalTrafficPolicy=Cluster 而在內部路由的流量。 因此,在移轉之後,如果未明確定義適當的輸入規則,原本允許的流量可能會被阻擋。
例如,客戶會建立網路原則來拒絕所有進入流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
使用 NPM:已封鎖對 Pod 或透過 ClusterIP 服務的直接連線。 即使有拒絕所有存取的策略,仍允許透過 NodePort 或 LoadBalancer 進行存取。
使用 Cilium:除非明確允許,否則會封鎖所有輸入流量,包括透過 NodePort 或 LoadBalancer 的流量。
需要動作:
使用 externalTrafficPolicy=Cluster 檢閱 LoadBalancer 或 NodePort 服務後方工作負載的所有輸入原則。
確定輸入規則明確允許來自預期外部來源的流量(例如IP範圍、命名空間或標籤)。
如果您的原則目前依賴 NPM 下的隱含允許行為,您必須新增明確的輸入規則,以在移轉之後維持連線。
升級至由 Cilium 提供的 Azure CNI
若要使用 Cilium 網路原則,您的 AKS 叢集必須執行由 Cilium 提供的 Azure CNI。 當您在目前使用 NPM 的叢集中啟用 Cilium 時,現有的 NPM 引擎會自動卸載並取代為 Cilium。
升級流程會觸發每個節點集區同時重新製作映像。 不支援個別升級每個節點集區。 叢集網路的任何中斷都類似於節點映射升級或 Kubernetes 版本升級 ,其中會重新映射節點集區中的每個節點。 只有在重新映像所有節點之後,Cilium 才會開始強制執行網路原則。
這些指示適用於將叢集從 Azure CNI 升級到包含 Cilium 數據平面的 Azure CNI。 此處未涵蓋從自備 CCI 升級或變更 IPAM 模式。 如需詳細資訊,請參閱 升級 Azure CNI 檔。
若要執行升級,您需要 Azure CLI 2.52.0 版或更新版本。 執行 az --version 以尋找目前安裝的版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。
使用下列命令,將現有叢集升級至由 Cilium 提供的 Azure CNI。 取代 clusterName 和 resourceGroupName 的值:
az aks update --name <clusterName> --resource-group <resourceGroupName> --network-dataplane cilium
如需在 AKS 上使用 Cilium FQDN 網路原則的詳細資訊,請參閱 在進階容器網路服務中設定容器網路安全性的 FQDN 篩選功能。
如需在 AKS 上使用 Cilium L7 網路原則的詳細資訊,請參閱 使用進階容器網路服務設定第 7 層原則。
如需 aks 上網路原則最佳做法的詳細資訊,請參閱 Azure Kubernetes Service 中網路原則的最佳做法 (AKS)