為標準叢集建立 Kubernetes 網路政策

本頁提供操作說明,說明如何在 Google Distributed Cloud (GDC) 實體隔離環境中,使用 Kubernetes 網路政策為標準叢集設定叢集內流量。

Kubernetes NetworkPolicy 可指定 Pod 群組如何與彼此及其他網路端點通訊。NetworkPolicy 資源會使用標籤選取 Pod,並定義規則,指定允許哪些流量傳送至所選 Pod。這些政策的適用範圍僅限於本機,且只適用於定義政策的叢集內流量,除非建立允許所有流量的政策,否則無法與其他標準和共用叢集的端點通訊。

事前準備

如要設定 Kubernetes 網路政策,您必須在叢集中具備必要權限,才能在相關命名空間中建立、修改及刪除 NetworkPolicy 資源。

建立叢集內 Pod 對 Pod 政策

這些政策可控管相同標準叢集中 Pod 之間的流量。

建立叢集內 Pod 對 Pod 的輸入政策

  • 如要允許叢集內 Pod 對 Pod 的輸入流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • PEER_NAMESPACE:標準叢集中的對等互連命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,且 SUBJECT_LABEL_VALUE 為 backend,則標籤為 app: backend 的工作負載會接收流量。
    • PEER_LABEL_KEY:用於選取對等工作負載的標籤鍵。
    • PEER_LABEL_VALUE:與 PEER_LABEL_KEY 相關聯的值。
    • PORT:允許流量的主體工作負載通訊埠。

建立叢集內 Pod 對 Pod 的輸出政策

  • 如要允許叢集內 Pod 對 Pod 的輸出流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-intra-cluster-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • PEER_NAMESPACE:標準叢集中的對等互連命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 是 app,且 SUBJECT_LABEL_VALUE 是 backend,則標籤為 app: backend 的工作負載會傳送流量。
    • PEER_LABEL_KEY:用於選取對等工作負載的標籤鍵。
    • PEER_LABEL_VALUE:與 PEER_LABEL_KEY 相關聯的值。
    • PORT:允許流量的對等互連工作負載通訊埠。

使用負載平衡器建立叢集內 Pod 對 Pod 的政策

如果流量是透過外部負載平衡器轉送,這些政策會控管同一叢集內 Pod 之間的流量。

使用負載平衡器建立叢集內 Pod 對 Pod 的 Ingress 政策

  • 如要使用負載平衡器允許叢集內 Pod 對 Pod 的輸入流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EGRESS_NAT_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,且 SUBJECT_LABEL_VALUE 為 backend,則標籤為 app: backend 的工作負載會接收流量。
    • EGRESS_NAT_IP:來源 Pod 的輸出 NAT IP。
    • PORT:允許流量的主體工作負載通訊埠。

使用負載平衡器建立叢集內 Pod 對 Pod 的輸出政策

  • 如要使用負載平衡器允許叢集內 Pod 對 Pod 的輸出流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-egress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: ELB_EXTERNAL_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 是 app,且 SUBJECT_LABEL_VALUE 是 backend,則標籤為 app: backend 的工作負載會傳送流量。
    • ELB_EXTERNAL_IP:負載平衡器的外部 IP 位址。
    • PORT:允許流量傳輸的外部端點通訊埠。

建立叢集內節點政策

叢集內節點政策可控管 Pod 之間,以及相同標準叢集內特定節點 (例如控制層 (API 伺服器) 節點或工作站節點) 的 Ingress 和 Egress 流量。

您可以在 NetworkPolicy 資源中使用 ipBlock 欄位,指定個別節點 IP 位址或節點 CIDR 範圍 (預先發布版)。

從叢集節點建立連入 Pod 的政策

您可以建立輸入政策,允許來自特定叢集節點的流量傳送至 Pod。舉例來說,您可以允許控制層 (API 伺服器) 節點連線至執行自訂 Kubernetes 准入 Webhook 的 Pod。

  • 如要允許從叢集節點到 Pod 的輸入流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ingress-from-node-to-pod
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: NODE_IP_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一文瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,且 SUBJECT_LABEL_VALUE 為 webhook,則標籤為 app: webhook 的工作負載會接收流量。
    • NODE_IP_CIDR:來源叢集節點的 IP 位址或 CIDR 範圍,例如採用 /32 標記法的控制層節點 IP (例如 10.200.0.10/32)。如要列出控制層節點 IP 位址,請執行 kubectl --kubeconfig CLUSTER_API_SERVER get nodes -l node-role.kubernetes.io/control-plane -o wide。
    • PORT:允許流量通過的主體工作負載上的連接埠 (例如 8443 或 443)。

從 Pod 建立叢集節點的出站政策

您可以建立輸出政策,允許 Pod 與特定叢集節點通訊。舉例來說,您可以允許 Pod 的輸出流量前往控制層 (API 伺服器) 節點,同時預設拒絕規則會封鎖前往工作站節點的輸出流量。

  • 如要允許 Pod 將輸出流量傳送至特定叢集節點,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-from-pod-to-node
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: NODE_IP_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一文瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,且 SUBJECT_LABEL_VALUE 為 controller,則標籤為 app: controller 的工作負載會傳送流量。
    • NODE_IP_CIDR:目的地叢集節點的 IP 位址或 CIDR 範圍,例如採用 /32 標記法的控制層節點 IP (例如 10.200.0.10/32)。如要列出控制層節點 IP 位址,請執行 kubectl --kubeconfig CLUSTER_API_SERVER get nodes -l node-role.kubernetes.io/control-plane -o wide。
    • PORT:允許流量傳輸的目標節點通訊埠 (例如 6444 或 443)。

規模注意事項

設定 Kubernetes 網路政策時,如果指定特定節點或使用廣泛的 CIDR 範圍,政策設定選項可能會影響擴充性和效能:

  • 0.0.0.0/0 的行為:在 ipBlock 規則中使用廣泛的 CIDR 範圍 (例如 0.0.0.0/0),除了外部 IP 位址外,還會比對叢集中的所有節點。
  • 規模:叢集中的每個節點都有專屬的 CIDR 身分,每個 Pod 端點都有內部政策表,用於儲存網路規則。在大型叢集中,廣泛的 ipBlock 規則 (例如 0.0.0.0/0) 會根據節點數量,成比例增加政策表格用量,因為系統必須為每個不重複的節點 CIDR 身分建立項目。
  • 警告:如果叢集節點數量多或有許多複雜的政策,請避免在 ipBlock 規則中使用過於廣泛的 CIDR 範圍,否則可能會達到端點的政策表上限。如果端點超過這個限制,新的網路政策就無法套用,這可能會中斷網路連線,或導致該 Pod 無法強制執行政策。

建立機構外部政策

這些政策可控管標準叢集中的 Pod 與外部端點 (叢集外的任何 IP 位址) 之間的流量。

為機構外部流量建立 Ingress 政策

  • 如要允許來自機構外部端點的輸入流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ingress-from-organization-external-to-standard-cluster-pod
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 為 app,且 SUBJECT_LABEL_VALUE 為 backend,則標籤為 app: backend 的工作負載會接收流量。
    • EXTERNAL_CIDR:外部 CIDR,例如:20.0.0.0/16。
    • PORT:允許流量的主體工作負載通訊埠。

為機構外部流量建立輸出政策

  • 如要允許輸出流量傳送至機構外部端點,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-from-standard-cluster-pod-to-organization-external
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。
    • SUBJECT_LABEL_KEY:用於選取主體工作負載的標籤鍵。例如:app、tier 或 role。
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEY 是 app,且 SUBJECT_LABEL_VALUE 是 backend,則標籤為 app: backend 的工作負載會傳送流量。
    • EXTERNAL_CIDR:外部 CIDR,例如:20.0.0.0/16。
    • PORT:允許流量傳輸的外部端點通訊埠。

建立允許所有要求的政策

您可以使用下列政策明確允許所有流量。這樣一來,您就能與其他標準和共用叢集的端點通訊。

建立允許所有連入流量的政策

  • 如要允許所有傳入流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - {}
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。

建立允許所有輸出流量的政策

  • 如要允許所有傳出流量,請建立並套用下列資源:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-egress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      egress:
      - {}
    EOF
    

    更改下列內容:

    • CLUSTER_API_SERVER:叢集 API 伺服器的 kubeconfig 路徑。如果尚未為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一節瞭解詳情。
    • SUBJECT_NAMESPACE:標準叢集中的主體命名空間。