您可以使用 ClusterNetworkPolicy 在整個叢集定義全域 GKE 安全防護機制。本文適用於需要強制執行必要安全防護機制或建立零信任基準的叢集管理員。
這項資源依賴嚴格的評估階層,其優先順序高於標準的命名空間範圍 NetworkPolicy 資源。您可以使用 ClusterNetworkPolicy 資源實作明確的「拒絕」、「接受」或「通過」動作。您可以透過這些動作設定全域允許或拒絕政策、將流量控管委派給特定命名空間,以及將輸出流量限制在 CIDR 區塊內。
事前準備
設定叢集網路政策前,請確保符合下列需求:
- 確認 GKE 叢集執行 1.36.0-gke.4447000 以上版本。
- 確認叢集使用 GKE Dataplane V2。
支援的通訊協定和通訊埠
ClusterNetworkPolicy 規則可根據 TCP、UDP 或 SCTP 通訊協定比對流量。您可以透過下列方式指定目的地連接埠:
- 特定通訊埠編號:使用
destinationPort.number設定指定單一通訊埠 (例如80)。 - 通訊埠範圍:使用
destinationPort.range設定指定通訊埠範圍 (例如8000至9000)。 - 具名通訊埠:使用
destinationNamedPort設定,指定 Pod 規格中定義的符號名稱。
政策評估階層
與標準的累加式 NetworkPolicy 不同,ClusterNetworkPolicy (CNP) 採用嚴格的評估階層,第一個相符的規則會優先套用。流量會依序流經三層管道:
- 層級:系統會先執行管理員規則,然後依序套用 NetworkPolicy 和 Baseline。
- CNP 優先順序:在同一層級中,系統會根據政策的明確數字優先順序進行評估。
- CNP 規則順序:在單一政策中,系統會由上而下處理規則,就像存取控制清單 (ACL) 一樣。

上圖說明 CNP 評估階層的決策流程:
- 管理員層級:系統會先根據
ClusterNetworkPolicyAdmin層級的規則評估流量。如果出現「允許」或「拒絕」相符項目,系統就會停止評估。如果沒有相符的規則或動作為「通過」,流量會繼續進入NetworkPolicy層級。 - NetworkPolicy 層級:系統會根據標準命名空間政策評估流量。如果找到相符項目,系統就會允許流量。如果沒有相符的規則,流量會繼續使用 Baseline 層級。
- 基準層級:系統會根據基準層級的
ClusterNetworkPolicy規則評估流量。如果相符結果為「允許」或「拒絕」,系統就會停止評估。如果沒有相符的規則,系統會採用預設行為。 - 預設 GKE 行為:如果任何層級都沒有相符的政策,系統會隱含允許流量。
判定動作:允許、拒絕和通過
封包比對成功後,每項規則都會觸發下列其中一個嚴格動作:
- 拒絕:立即封鎖流量。
- 「接受」:允許流量。這兩種動作都會立即中斷管道,並忽略所有剩餘政策。
- 傳遞:將控制權轉移至下一個層級,讓平台工程師將特定流量決策委派給標準命名空間層級的政策,同時保留整體管理控制權。
設定全域拒絕政策
如要將敏感命名空間與所有其他叢集內部流量隔離,請套用無法覆寫的拒絕規則。這項預設拒絕政策可確保系統在管理層級封鎖任何往返敏感命名空間的流量。這項政策可做為保護基準,不會因命名空間層級的規則而意外遭到略過。
將下列資訊清單儲存為
global-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: cluster-wide-deny-sensitive spec: tier: Admin priority: 10 subject: namespaces: matchLabels: kubernetes.io/metadata.name: sensitive-ns ingress: - action: Deny name: deny-all-ingress from: - namespaces: matchLabels: {} egress: - action: Deny name: deny-all-egress to: - namespaces: matchLabels: {}將資訊清單套用至叢集:
kubectl apply -f global-deny.yaml
設定全域允許政策
全域允許政策可確保所有 Pod 都能連上叢集 DNS 服務,不受開發人員建立的任何網路政策影響。
將下列資訊清單儲存為
global-allow-dns.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-kube-dns-admin spec: tier: Admin priority: 20 subject: namespaces: {} egress: - action: Accept name: allow-dns-egress to: - pods: namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns protocols: - udp: destinationPort: number: 53 - tcp: destinationPort: number: 53將資訊清單套用至叢集:
kubectl apply -f global-allow-dns.yaml
將流量委派給命名空間政策
將特定流量模式委派給標準命名空間範圍的 NetworkPolicy 物件。
將下列資訊清單儲存為
delegate-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: delegate-to-netpol spec: tier: Admin priority: 30 subject: namespaces: {} egress: - action: Pass name: delegate-web-traffic to: - namespaces: matchLabels: app: web-backend protocols: - tcp: destinationPort: number: 8080將資訊清單套用至叢集:
kubectl apply -f delegate-policy.yaml如要在目標命名空間內允許委派流量,請將下列標準
NetworkPolicy資訊清單儲存為allow-web-backend.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-web-backend namespace: backend-ns spec: podSelector: matchLabels: app: web-backend ingress: - from: - namespaceSelector: matchLabels: app: web-frontend ports: - protocol: TCP port: 8080將標準
NetworkPolicy資訊清單套用至叢集:kubectl apply -f allow-web-backend.yaml
設定基準防護機制
建立預設 GKE 安全性狀態,命名空間管理員可以使用標準網路政策覆寫。
將下列基準資訊清單儲存為
baseline-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: default-deny-baseline spec: tier: Baseline priority: 100 subject: namespaces: {} ingress: - action: Deny name: baseline-deny-all from: - namespaces: {}將基準資訊清單套用至叢集:
kubectl apply -f baseline-deny.yaml將下列開發人員覆寫資訊清單儲存為
developer-allow.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-access namespace: my-app-ns spec: podSelector: matchLabels: app: frontend ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginx將覆寫資訊清單套用至叢集:
kubectl apply -f developer-allow.yaml
使用具名通訊埠設定政策
如要從安全性政策中抽象化通訊埠編號,請參照 Pod 規格中定義的具名通訊埠。
將下列部署資訊清單儲存為
app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: my-webapp spec: template: spec: containers: - name: web-container image: nginx ports: - name: http-web containerPort: 8080將 Deployment 資訊清單套用至叢集:
kubectl apply -f app-deployment.yaml將下列政策資訊清單儲存為
named-port-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-web-named-port spec: tier: Admin priority: 40 subject: namespaces: {} egress: - action: Accept to: - namespaces: matchLabels: app: my-webapp protocols: - tcp: destinationNamedPort: http-web將政策資訊清單套用至叢集:
kubectl apply -f named-port-policy.yaml
將輸出流量限制在 CIDR 區塊內
指定 CIDR 區塊,控管外部資源或公司內部網路的存取權。
將下列資訊清單儲存為
cidr-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-egress-to-intranet spec: tier: Admin priority: 60 subject: namespaces: {} egress: - action: Accept name: allow-intranet to: - networks: - 10.0.0.0/8 - 192.168.0.0/16將資訊清單套用至叢集:
kubectl apply -f cidr-policy.yaml
設定優先順序
如要控管多項政策套用至相同 Pod 時的評估順序,請指定優先順序。優先順序範圍為 0 到 1000,數字越小代表優先順序越高。單一 ClusterNetworkPolicy 物件最多可包含 100 項輸入規則和 100 項輸出規則。
將下列資訊清單儲存為
priority-policies.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: deny-beta spec: tier: Admin priority: 10 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-beta-monitoring from: - pods: namespaceSelector: matchLabels: team: beta podSelector: matchLabels: app: monitoring - action: Deny name: deny-all-other-ingress-from-beta from: - namespaces: matchLabels: team: beta --- apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-beta spec: tier: Admin priority: 50 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-all-ingress-from-beta from: - namespaces: matchLabels: team: beta將資訊清單套用至叢集:
kubectl apply -f priority-policies.yaml
疑難排解
如要瞭解如何診斷及解決政策錯誤,請使用下列指令。
列出叢集中的所有叢集網路政策:
kubectl get clusternetworkpolicies
說明特定政策,檢查其狀態和評估層級:
kubectl describe clusternetworkpolicy/<policy-name>
輸出內容中的 status.conditions 欄位會提供資訊,說明叢集的網路實作是否已成功調解政策。
如要監控流量和政策決策,請使用 GKE Dataplane V2 可觀測性。
後續步驟
- 進一步瞭解 GKE Dataplane V2 觀測功能。
- 請參閱 Kubernetes Network Policy API 說明文件。