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

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

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

事前準備

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

建立叢集內 Pod 對 Pod 政策

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

建立叢集內 Pod 對 Pod 的 Ingress 政策

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

    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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,而 SUBJECT_LABEL_VALUEbackend,則標籤為 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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,則具有 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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,而 SUBJECT_LABEL_VALUEbackend,則標籤為 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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,則具有 app: backend 標籤的工作負載會傳送流量。
    • ELB_EXTERNAL_IP:負載平衡器的外部 IP 位址。
    • PORT:允許流量傳輸的外部端點通訊埠。

建立機構外部政策

這些政策可控管標準叢集中 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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,而 SUBJECT_LABEL_VALUEbackend,則標籤為 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:用於選取主體工作負載的標籤鍵。例如 apptierrole
    • SUBJECT_LABEL_VALUE:與 SUBJECT_LABEL_KEY 相關聯的值。舉例來說,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,則具有 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:標準叢集中的主體命名空間。