创建组织外部网络政策

本页面介绍了如何在 Google Distributed Cloud (GDC) 网闸隔离配置中配置组织外部流量网络政策。

组织外部流量是指来自不同组织的服务和工作负载与外部端点之间的通信。

准备工作

如需配置组织外部流量网络政策,您必须具备以下条件:

创建组织外部政策

您可以定义入站或出站组织外部流量政策,以管理来自不同组织的服务和工作负载与外部端点之间的通信。

您可以创建适用于组织中所有可用区流量的全球组织外部流量项目网络政策。如需详细了解 GDC 领域中的全球资源,请参阅多可用区概览。

将服务和工作负载连接到其他组织中项目外部的目标位置需要获得明确批准。您必须停用数据渗漏防护,才能允许组织外部流量。

为组织外部流量创建全局入站防火墙规则

使用外部负载均衡器公开项目中的工作负载时,您还必须创建 ProjectNetworkPolicy 入站流量政策,以允许外部客户端 IP 地址访问工作负载。

此全球入站流量政策适用于贵组织中的所有可用区。

请按照以下步骤创建新的防火墙规则,并允许来自其他组织的项目的负载的入站流量:

控制台

  1. 在您要配置的项目的 GDC 控制台中,前往导航菜单中的网络 > 防火墙,打开防火墙页面。
  2. 点击操作栏中的创建,开始创建新的防火墙规则。
  3. 在防火墙规则详情页面上,填写以下信息:

    1. 在名称字段中,为防火墙规则输入一个有效名称。
    2. 在流量方向部分,选择入站,以允许来自其他组织中工作负载的入站流量。
    3. 在目标部分中,选择以下选项之一:
      • 所有用户工作负载:允许连接到您正在配置的项目的工作负载。
      • 服务:表示此防火墙规则针对您正在配置的项目中的特定服务。
    4. 如果您的目标是项目服务,请从服务下拉菜单中的可用服务列表中选择服务名称。
    5. 在来源部分中,选择组织外部,然后在 CIDR 字段中输入其他组织的 CIDR 块,以允许来自该组织网络的连接。
    6. 如果您的目标是所有用户工作负载,请在协议和端口部分中选择以下选项之一:
      • 全部允许:允许使用任何协议或端口进行连接。
      • 指定的协议和端口:仅允许使用您在入站防火墙规则的相应字段中指定的协议和端口进行连接。
  4. 在防火墙规则详情页面上,点击创建。

现在,您已允许来自其他组织的项目工作负载的连接。创建防火墙规则后,该规则会显示在防火墙页面上的表格中。

API

配置并应用您自己的自定义 ProjectNetworkPolicy 入站流量政策:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-inbound-traffic-from-external
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - ipBlock:
        cidr: CIDR
EOF

替换以下内容:

  • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
  • PROJECT:GDC 项目的名称。
  • CIDR:另一个组织的 CIDR 块。

此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能会保留来源外部 IP 地址,并在返回路径上绕过负载均衡器。

为组织外部流量创建全球出站流量防火墙规则

如需将数据传输到组织外部的服务,您必须先停用数据渗漏防护功能。然后,您必须配置出站流量防火墙规则,以允许来自项目工作负载或服务的出站流量。

本部分介绍了在项目级启用出站流量的过程。如需了解如何在工作负载级别管理出站流量连接,请参阅 NAT 概览。

此全球出站流量防火墙规则适用于您组织中的所有可用区。

请按照以下步骤创建新的防火墙规则,并允许从项目工作负载或服务到其他组织中的工作负载的出站流量:

控制台

  1. 在您要配置的项目的 GDC 控制台中,前往导航菜单中的网络 > 防火墙,打开防火墙页面。
  2. 点击操作栏中的创建,开始创建新的防火墙规则。
  3. 在防火墙规则详情页面上,填写以下信息:

    1. 在名称字段中,为防火墙规则输入一个有效名称。
    2. 在流量方向部分,选择出站,以指明此防火墙规则用于控制出站流量。
    3. 在目标部分中,选择以下选项之一:
      • 所有用户工作负载:允许来自您正在配置的项目的工作负载的连接。
      • 服务:表示此防火墙规则针对您正在配置的项目中的特定服务。
    4. 如果您的目标是项目服务,请从服务下拉菜单中的可用服务列表中选择服务名称。
    5. 在目标部分中,选择组织外部,然后在 CIDR 字段中输入其他组织的 CIDR 块,以允许连接到该组织的网络。
    6. 如果您的目标是所有用户工作负载,请在协议和端口部分中选择以下选项之一:
      • 全部允许:允许使用任何协议或端口进行连接。
      • 指定的协议和端口:仅允许使用您在出站流量防火墙规则的相应字段中指定的协议和端口进行连接。
  4. 在防火墙规则详情页面上,点击创建。

您现在已允许连接到其他组织。创建防火墙规则后,该规则会显示在防火墙页面上的表格中。

API

如需允许出站流量流向组织外部的服务,请自定义 ProjectNetworkPolicy 资源。不过,由于默认情况下会启用数据渗漏防护,因此系统不会强制执行自定义的 ProjectNetworkPolicy 出站流量政策。可用区级 API 服务器会拒绝出站流量政策,并显示消息 Data Exfiltration Protection is enabled for Project PROJECT; cannot configure egress policies,因此全局出站流量政策不会变为就绪状态。此行为是设计所致。

如果您允许从某个项目数据渗漏,则可以从该项目转移工作负载。您允许的出站流量是使用为项目分配的已知 IP 地址的来源网络地址转换 (NAT)。

如需启用自定义出站流量政策,请按以下步骤操作:

  1. 对项目中的所有用户工作负载配置并应用您自己的自定义 ProjectNetworkPolicy 出站流量政策。

    请参考以下示例:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-outbound-traffic-to-external
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
      egress:
      - to:
        - ipBlock:
            cidr: CIDR
    EOF
    

    该政策允许向 CIDR 块中位于组织外部的所有主机发送出站流量。虽然启用了数据渗漏防护,但该政策并未强制执行。

  2. 确认政策尚未准备就绪。启用数据渗漏防护后,全局政策的 Ready 条件具有 status: "Unknown" 和原因 Reconciling,因为可用区级 API 服务器会拒绝该政策。

  3. 应用出站流量项目内政策以及工作负载所需的任何跨项目出站流量政策。停用数据渗漏防护后,第一步中的政策会阻止来自项目中每个工作负载的所有其他出站流量,包括流向同一项目和其他项目中工作负载的流量。

  4. 请让 IAM 组织管理员停用数据渗漏防护功能。此操作会启用您的配置,同时阻止所有其他出站流量。

  5. 检查您创建的 ProjectNetworkPolicy,并验证 Ready 条件是否具有 status: "True",这表示您的政策已生效:

    kubectl --kubeconfig GLOBAL_API_SERVER \
        get projectnetworkpolicy allow-outbound-traffic-to-external \
        -n PROJECT -o yaml
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。

    • PROJECT:GDC 项目的名称。

应用此政策后,如果您未定义其他出站流量政策,则 PROJECT 的所有其他出站流量都会被拒绝。

为标准集群创建组织外部政策

标准集群是项目级 Kubernetes 集群,可提供更强的控制力、更高的灵活性和集群管理员权限。

为标准集群创建入站组织外部政策

  1. 如需为标准集群创建入站流量组织外部政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: STANDARD_CLUSTER_PROJECT
      name: allow-ingress-from-external-endpoint-to-standard-cluster-pod
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        userWorkloadSelector:
          labelSelector:
            clusters:
              matchLabels:
                kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME
            namespaces:
              matchLabels:
                kubernetes.io/metadata.name: SUBJECT_NAMESPACE
            workloads:
              matchLabels:
                SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - ipBlocks:
          - cidr: EXTERNAL_IP
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • STANDARD_CLUSTER_PROJECT:标准集群项目的名称。
    • STANDARD_CLUSTER_NAME:标准集群的名称。
    • SUBJECT_LABEL_KEY:用于选择主题工作负载的标签键。例如 app、tier 或 role。
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEY 为 app,SUBJECT_LABEL_VALUE 为 backend,则带有标签 app: backend 的工作负载正在接收流量。
    • EXTERNAL_IP:外部端点的 IP 地址。
    • PORT:主体工作负载上允许流量通过的端口。

为标准集群创建出站组织外部政策

  1. 如需为标准集群创建出站组织外部政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: STANDARD_CLUSTER_PROJECT
      name: allow-egress-from-standard-cluster-pod-to-external-endpoint
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        userWorkloadSelector:
          labelSelector:
            clusters:
              matchLabels:
                kubernetes.io/metadata.name: STANDARD_CLUSTER_NAME
            namespaces:
              matchLabels:
                kubernetes.io/metadata.name: SUBJECT_NAMESPACE
            workloads:
              matchLabels:
                SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      egress:
      - to:
        - ipBlocks:
          - cidr: EXTERNAL_IP
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • STANDARD_CLUSTER_PROJECT:标准集群项目的名称。
    • STANDARD_CLUSTER_NAME:标准集群的名称。
    • SUBJECT_LABEL_KEY:用于选择主题工作负载的标签键。例如 app、tier 或 role。
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。例如,如果 SUBJECT_LABEL_KEY 为 app,SUBJECT_LABEL_VALUE 为 backend,则带有标签 app: backend 的工作负载正在发送流量。
    • EXTERNAL_IP:外部端点的 IP 地址。
    • PORT:允许流量进入的外部端点上的端口。