設定叢集網路政策

您可以使用 ClusterNetworkPolicy 在整個叢集定義全域 GKE 安全防護機制。本文適用於需要強制執行必要安全防護機制或建立零信任基準的叢集管理員。

這項資源依賴嚴格的評估階層,其優先順序高於標準的命名空間範圍 NetworkPolicy 資源。您可以使用 ClusterNetworkPolicy 資源實作明確的「拒絕」、「接受」或「通過」動作。您可以透過這些動作設定全域允許或拒絕政策、將流量控管委派給特定命名空間,以及將輸出流量限制在 CIDR 區塊內。

事前準備

設定叢集網路政策前,請確保符合下列需求:

  1. 確認 GKE 叢集執行 1.36.0-gke.4447000 以上版本。
  2. 確認叢集使用 GKE Dataplane V2。

支援的通訊協定和通訊埠

ClusterNetworkPolicy 規則可根據 TCP、UDP 或 SCTP 通訊協定比對流量。您可以透過下列方式指定目的地連接埠:

  • 特定通訊埠編號:使用 destinationPort.number 設定指定單一通訊埠 (例如 80)。
  • 通訊埠範圍:使用 destinationPort.range 設定指定通訊埠範圍 (例如 80009000)。
  • 具名通訊埠:使用 destinationNamedPort 設定,指定 Pod 規格中定義的符號名稱。

政策評估階層

與標準的累加式 NetworkPolicy 不同,ClusterNetworkPolicy (CNP) 採用嚴格的評估階層,第一個相符的規則會優先套用。流量會依序流經三層管道:

  • 層級:系統會先執行管理員規則,然後依序套用 NetworkPolicy 和 Baseline。
  • CNP 優先順序:在同一層級中,系統會根據政策的明確數字優先順序進行評估。
  • CNP 規則順序:在單一政策中,系統會由上而下處理規則,就像存取控制清單 (ACL) 一樣。

圖表:顯示 GKE 網路政策評估階層

上圖說明 CNP 評估階層的決策流程:

  1. 管理員層級:系統會先根據ClusterNetworkPolicyAdmin層級的規則評估流量。如果出現「允許」或「拒絕」相符項目,系統就會停止評估。如果沒有相符的規則或動作為「通過」,流量會繼續進入 NetworkPolicy 層級。
  2. NetworkPolicy 層級:系統會根據標準命名空間政策評估流量。如果找到相符項目,系統就會允許流量。如果沒有相符的規則,流量會繼續使用 Baseline 層級。
  3. 基準層級:系統會根據基準層級的ClusterNetworkPolicy規則評估流量。如果相符結果為「允許」或「拒絕」,系統就會停止評估。如果沒有相符的規則,系統會採用預設行為。
  4. 預設 GKE 行為:如果任何層級都沒有相符的政策,系統會隱含允許流量。

判定動作:允許、拒絕和通過

封包比對成功後,每項規則都會觸發下列其中一個嚴格動作:

  • 拒絕:立即封鎖流量。
  • 「接受」:允許流量。這兩種動作都會立即中斷管道,並忽略所有剩餘政策。
  • 傳遞:將控制權轉移至下一個層級,讓平台工程師將特定流量決策委派給標準命名空間層級的政策,同時保留整體管理控制權。

設定全域拒絕政策

如要將敏感命名空間與所有其他叢集內部流量隔離,請套用無法覆寫的拒絕規則。這項預設拒絕政策可確保系統在管理層級封鎖任何往返敏感命名空間的流量。這項政策可做為保護基準,不會因命名空間層級的規則而意外遭到略過。

  1. 將下列資訊清單儲存為 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: {}
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f global-deny.yaml
    

設定全域允許政策

全域允許政策可確保所有 Pod 都能連上叢集 DNS 服務,不受開發人員建立的任何網路政策影響。

  1. 將下列資訊清單儲存為 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f global-allow-dns.yaml
    

將流量委派給命名空間政策

將特定流量模式委派給標準命名空間範圍的 NetworkPolicy 物件。

  1. 將下列資訊清單儲存為 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f delegate-policy.yaml
    
  3. 如要在目標命名空間內允許委派流量,請將下列標準 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
    
  4. 將標準 NetworkPolicy 資訊清單套用至叢集:

    kubectl apply -f allow-web-backend.yaml
    

設定基準防護機制

建立預設 GKE 安全性狀態,命名空間管理員可以使用標準網路政策覆寫。

  1. 將下列基準資訊清單儲存為 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: {}
    
  2. 將基準資訊清單套用至叢集:

    kubectl apply -f baseline-deny.yaml
    
  3. 將下列開發人員覆寫資訊清單儲存為 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
    
  4. 將覆寫資訊清單套用至叢集:

    kubectl apply -f developer-allow.yaml
    

使用具名通訊埠設定政策

如要從安全性政策中抽象化通訊埠編號,請參照 Pod 規格中定義的具名通訊埠。

  1. 將下列部署資訊清單儲存為 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
    
  2. 將 Deployment 資訊清單套用至叢集:

    kubectl apply -f app-deployment.yaml
    
  3. 將下列政策資訊清單儲存為 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
    
  4. 將政策資訊清單套用至叢集:

    kubectl apply -f named-port-policy.yaml
    

將輸出流量限制在 CIDR 區塊內

指定 CIDR 區塊,控管外部資源或公司內部網路的存取權。

  1. 將下列資訊清單儲存為 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f cidr-policy.yaml
    

設定優先順序

如要控管多項政策套用至相同 Pod 時的評估順序,請指定優先順序。優先順序範圍為 0 到 1000,數字越小代表優先順序越高。單一 ClusterNetworkPolicy 物件最多可包含 100 項輸入規則和 100 項輸出規則。

  1. 將下列資訊清單儲存為 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f priority-policies.yaml
    

疑難排解

如要瞭解如何診斷及解決政策錯誤,請使用下列指令。

列出叢集中的所有叢集網路政策:

kubectl get clusternetworkpolicies

說明特定政策,檢查其狀態和評估層級:

kubectl describe clusternetworkpolicy/<policy-name>

輸出內容中的 status.conditions 欄位會提供資訊,說明叢集的網路實作是否已成功調解政策。

如要監控流量和政策決策,請使用 GKE Dataplane V2 可觀測性

後續步驟