创建项目内网络政策

本页面介绍了如何在 Google Distributed Cloud (GDC) air-gapped 中配置项目内流量网络政策。

项目级网络政策定义入站规则或出站规则。您可以定义允许在项目内、项目之间以及与外部 IP 地址进行通信的政策。

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

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

准备工作

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

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

创建项目内政策

对于项目内的流量,GDC 默认会为每个项目应用预定义的项目网络政策(即项目内政策)。默认情况下,项目命名空间中的工作负载能够相互通信,而不会向外部资源公开任何内容。

默认情况下,系统不配置出站政策,因此允许所有项目内流量的出站流量。不过,当您设置单个出站流量政策时,系统仅允许该政策指定的流量。

创建入站项目内政策

创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,以实现项目内通信。此政策允许来自同一项目中其他工作负载的入站流量。

您可以移除默认政策,但请注意,移除后,项目中的所有服务和工作负载都将无法进行项目内通信。如需移除该政策,请使用 kubectl delete 命令:

kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT

您可以通过应用以下清单来重新添加默认政策:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: base-policy-allow-intra-project-traffic
spec:
  policyType: Ingress
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

替换以下内容:

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

创建出站项目内政策

如果您停用了数据渗漏防护功能,并向项目应用了ProjectNetworkPolicy出站流量政策(例如禁止访问外部资源),请使用以下必需的政策来允许项目内的出站流量:

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-intra-project-outbound-traffic
spec:
  policyType: Egress
  egress:
  - to:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

替换以下内容:

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

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

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

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

创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,该资源允许所有工作负载在项目内进行通信。此政策允许来自同一项目中其他工作负载的入站流量。

如需创建入站流量工作负载级项目内政策,必须先删除默认的基本政策。否则,可能会出现意外行为。

  1. 如需删除默认基本政策,请运行以下命令:

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 如需创建入站工作负载级项目内政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-intra-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
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT:您的项目的名称。
    • 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
      name: allow-intra-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
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    替换以下内容:

    • GLOBAL_API_SERVER:全局 API 服务器的 kubeconfig 路径。如需了解详情,请参阅全球和可用区级 API 服务器。 如果您尚未为 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
    • PROJECT:您的项目的名称。
    • 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。您可以向单个可用区中的工作负载添加特定标签,从而控制项目内或不同项目之间该可用区中各个工作负载之间的通信。

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

创建项目时,您会隐式创建默认的基本 ProjectNetworkPolicy 资源,该资源允许所有工作负载在项目内进行通信。此政策允许来自同一项目中其他工作负载的入站流量。

如需创建单区域入站流量工作负载级项目内政策,必须先删除默认的基础政策。否则,可能会出现意外行为。

  1. 如需删除默认基本政策,请运行以下命令:

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 如需创建单可用区 Ingress 工作负载级项目内流量网络政策,请创建并应用以下自定义资源:

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-single-zone-intra-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
            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:您的项目的名称。
    • 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
      name: allow-single-zone-intra-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
            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:您的项目的名称。
    • 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 关联的值。它指定了允许的流量的目标区域。