创建跨项目网络政策

本页面介绍了如何在 Google Distributed Cloud (GDC) 空气隔离环境中配置跨项目流量网络政策。

跨项目流量是指来自不同项目命名空间但位于同一组织中的服务和工作负载之间的通信。

默认情况下,项目中的服务和工作负载与外部服务和工作负载隔离。不过,来自不同项目命名空间且位于同一组织内的服务和工作负载可以通过应用跨项目流量网络政策相互通信。

默认情况下,这些政策在全球所有地区均适用。如需详细了解 GDC 宇宙中的全局资源,请参阅多地区概览

如果需要在单个可用区内强制执行跨项目流量,请参阅创建单可用区工作负载级跨项目政策

准备工作

如需配置跨项目流量网络政策,您必须具备以下条件:

  • 必要的身份和访问权限角色。如需管理特定项目的政策,您需要拥有 project-networkpolicy-admin 角色。对于需要管理跨所有可用区的政策的多可用区环境,您需要拥有 global-project-networkpolicy-admin 角色。如需了解详情,请参阅准备预定义角色和访问权限
  • 现有项目。如需了解详情,请参阅创建项目

创建跨项目政策

您可以定义入站流量或出站流量跨项目流量政策,以管理项目之间的通信。

创建入站跨项目政策

如需允许项目工作负载或服务接受组织内其他项目中的其他工作负载的连接,您必须配置入站流量防火墙规则,以允许其他项目工作负载的入站流量。

此政策适用于您组织中的所有区域。

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

控制台

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

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

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

API

以下政策可让 PROJECT_1 项目中的工作负载允许来自 PROJECT_2 项目中工作负载的连接,以及相同流的返回流量。应用政策:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_1
  name: allow-inbound-traffic-from-PROJECT_2
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT_2
EOF

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

上述命令允许 PROJECT_2 连接到 PROJECT_1,但不允许从 PROJECT_1 发起的连接到 PROJECT_2。对于后者,您需要在 PROJECT_2 项目中设置对等政策。应用互惠政策:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_2
  name: allow-inbound-traffic-from-PROJECT_1
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT_1
EOF

现在允许与 PROJECT_1PROJECT_2 建立连接。

创建出站跨项目政策

当您授予入站跨项目流量政策,以允许一个项目中的工作负载接受来自另一个项目中的工作负载的连接时,此操作也会授予相同流量的返回流量。因此,您无需在原始项目中设置出站跨项目流量网络政策。

例如,如果您创建了一项政策,允许流量从 PROJECT_1 流向 PROJECT_2,并且数据渗漏防护功能处于停用状态,则必须在 PROJECT_2 中创建入站流量政策,并在 PROJECT_1 中创建出站流量政策。不过,回复数据包不受政策强制执行的约束,因此您无需任何其他政策。

请按以下步骤操作,创建新的防火墙规则并允许项目中的工作负载发送出站流量:

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

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

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

创建工作负载级跨项目政策

工作负载级网络政策可对各个项目之间各个工作负载的通信进行精细控制。这种精细度可实现更严格的网络访问控制,从而提高安全性和资源利用率。

创建入站工作负载级跨项目政策

  • 如需创建入站工作负载级跨项目政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
     namespace: PROJECT_1
     name: allow-cross-project-inbound-traffic-from-target-to-subject
    spec:
     policyType: Ingress
     subject:
       subjectType: UserWorkload
       workloadSelector:
         matchLabels:
           SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
     ingress:
     - from:
       - projectSelector:
           projects:
             matchNames:
             - PROJECT_2
           workloads:
             matchLabels:
               TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT_1:接收流量的项目的名称。
    • PROJECT_2:流量的来源项目的名称。
    • SUBJECT_LABEL_KEY:用于选择源工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的来源。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 app: backend 的工作负载是流量来源。
    • TARGET_LABEL_KEY:用于选择目标工作负载的标签的键。
    • TARGET_LABEL_VALUE:与 TARGET_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的目标。

创建出站流量工作负载级跨项目政策

  • 如需创建出站流量工作负载级跨项目政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-cross-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT_2
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT_1:发送流量的项目的名称。
    • PROJECT_2:接收流量的项目的名称。
    • SUBJECT_LABEL_KEY:用于选择源工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的来源。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 app: backend 的工作负载是流量来源。
    • TARGET_LABEL_KEY:用于选择目标工作负载的标签的键。
    • TARGET_LABEL_VALUE:与 TARGET_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的目标。

创建单可用区工作负载级跨项目政策

工作负载级网络政策可以在单个可用区内强制执行 PNP。您可以向单个可用区中的工作负载添加特定标签,从而控制项目内或不同项目之间该可用区中各个工作负载之间的通信。

创建单可用区入站工作负载级跨项目政策

  1. 如需创建单可用区 Ingress 工作负载级跨项目政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-single-zone-cross-project-inbound-traffic-from-target-to-subject
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT_2
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT_1:接收流量的项目的名称。
    • PROJECT_2:流量的来源项目的名称。
    • SUBJECT_LABEL_KEY:用于选择源工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的来源。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 app: backend 的工作负载是流量来源。
    • TARGET_LABEL_KEY:用于选择目标工作负载的标签的键。
    • TARGET_LABEL_VALUE:与 TARGET_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的目标。
    • ZONE_SUBJECT_LABEL_KEY:用于选择源可用区的标签的键。例如 zoneregion
    • ZONE_SUBJECT_LABEL_VALUE:与 ZONE_SUBJECT_LABEL_KEY 关联的值。它指定了允许的流量的来源区域。例如,如果 ZONE_SUBJECT_LABEL_KEYzone,且 ZONE_SUBJECT_LABEL_VALUEus-central1-a,则带有标签 zone: us-central1-a 的工作负载是流量来源。
    • ZONE_TARGET_LABEL_KEY:用于选择目标可用区的标签的键。
    • ZONE_TARGET_LABEL_VALUE:与 ZONE_TARGET_LABEL_KEY 关联的值。它指定了允许的流量的目标区域。

创建单可用区出站流量工作负载级跨项目政策

  • 如需创建单可用区出站流量工作负载级跨项目政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-single-zone-cross-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT_2
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT_1:发送流量的项目的名称。
    • PROJECT_2:接收流量的项目的名称。
    • SUBJECT_LABEL_KEY:用于选择源工作负载的标签的键。例如 apptierrole
    • SUBJECT_LABEL_VALUE:与 SUBJECT_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的来源。例如,如果 SUBJECT_LABEL_KEYapp,且 SUBJECT_LABEL_VALUEbackend,则带有标签 app: backend 的工作负载是流量来源。
    • TARGET_LABEL_KEY:用于选择目标工作负载的标签的键。
    • TARGET_LABEL_VALUE:与 TARGET_LABEL_KEY 关联的值。它指定了哪些工作负载是允许的流量的目标。
    • ZONE_SUBJECT_LABEL_KEY:用于选择源可用区的标签的键。例如 zoneregion
    • ZONE_SUBJECT_LABEL_VALUE:与 ZONE_SUBJECT_LABEL_KEY 关联的值。它指定了允许的流量的来源区域。例如,如果 ZONE_SUBJECT_LABEL_KEYzone,且 ZONE_SUBJECT_LABEL_VALUEus-central1-a,则带有标签 zone: us-central1-a 的工作负载是流量来源。
    • ZONE_TARGET_LABEL_KEY:用于选择目标可用区的标签的键。
    • ZONE_TARGET_LABEL_VALUE:与 ZONE_TARGET_LABEL_KEY 关联的值。它指定了允许的流量的目标区域。