网络策略

本文档介绍了如何在 Google Distributed Cloud (GDC) 网闸隔离配置中为虚拟机 (VM) 实例设置网络政策。

如需在项目命名空间级别为虚拟机工作负载设置网络政策,请使用 ProjectNetworkPolicy 资源,这是适用于 Distributed Cloud 的多集群网络政策。然后,您可以定义政策,以允许在项目内、项目之间以及与外部 IP 地址进行通信。

对于项目内的流量,GDC 默认会向每个项目应用预定义的项目网络政策,即项目内政策,该政策可以被覆盖或扩展。如需在同一组织内的不同项目之间启用和控制流量,请定义跨项目网络政策。如果存在多项政策,GDC 会累加组合每个项目的规则。如果至少有一条规则匹配,GDC 也会允许流量。

本文档适用于平台管理员或应用运维人员群组中为 Distributed Cloud 环境中的虚拟机创建和管理网络政策的开发者。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

申请 IAM 角色

请与您的 IAM 项目管理员联系,请求在您的项目中授予以下角色:

  • Project NetworkPolicy Admin (project-networkpolicy-admin):为项目命名空间中的虚拟机实例创建、列出、更新和删除项目网络政策。

此角色必须绑定到虚拟机所在项目的命名空间。按照相关步骤验证您的访问权限。

项目内流量

默认情况下,项目命名空间中的虚拟机工作负载能够相互通信,而无需向外部世界公开服务,即使这些虚拟机属于同一项目中的不同集群也是如此。

入站流量项目内流量网络政策

创建项目时,您会在 Management API 服务器上创建一个默认基础 ProjectNetworkPolicy,以允许项目内通信。此政策允许来自同一项目中其他工作负载的入站流量。您可以将其移除,但请谨慎操作,因为这会导致项目内和容器工作负载通信均被拒绝。

出站项目内流量网络政策

默认情况下,您无需针对出站流量采取任何措施。这是因为在没有出站流量政策的情况下,所有流量都会被允许。不过,设置单个政策后,系统仅允许该政策指定的流量。

停用数据渗漏防护并对项目应用出站流量 ProjectNetworkPolicy(例如阻止访问外部资源)时,请使用必需的政策来允许项目内出站流量:

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

跨项目(组织内)流量

通过应用跨项目网络政策,来自不同项目命名空间但位于同一组织内的虚拟机工作负载可以相互通信。

入站流量跨项目流量网络政策

如需让项目工作负载允许来自其他项目中其他工作负载的连接,您必须配置入站流量政策,以允许其他项目工作负载将数据传出。

以下政策使 PROJECT_1 项目中的工作负载能够允许来自 PROJECT_2 项目中的工作负载的连接,以及相同流的返回流量。如果您想从 PROJECT_2 内部的来源访问 PROJECT_1 中的虚拟机,也可以使用此政策。运行以下命令以应用政策:

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

上述命令允许 PROJECT_2 访问 PROJECT_1,但不允许从 PROJECT_1 发起与 PROJECT_2 的连接。对于后者,您需要在 PROJECT_2 项目中制定对等政策。运行以下命令以应用对等政策:

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

您现在已允许与 PROJECT_1 和 PROJECT_2 建立连接。

请使用以下定义来定义变量。

变量定义
MANAGEMENT_API_SERVERManagement API 服务器 kubeconfig 路径。
PROJECT_1与示例中的 PROJECT_1 对应的 GDC 项目的名称。
PROJECT_2与示例中的 PROJECT_2 对应的 GDC 项目的名称。

出站跨项目流量网络政策

当您授予入站跨项目流量政策,以使一个项目 PROJECT_1 中的工作负载允许来自另一个项目 PROJECT_2 中的工作负载的连接时,这也会授予相同流的返回流量。因此,您不需要出站跨项目流量网络政策。

跨组织流量

如需将虚拟机工作负载连接到项目外部且位于其他组织中的目标,需要获得明确批准。该审批是由于数据渗漏防护功能而产生的,GDC 默认启用该功能,并阻止项目向项目所在组织外部的工作负载发送出站流量。本部分介绍了添加特定出站流量政策和启用数据渗漏的说明。

入站流量跨组织流量网络政策

如需允许跨不同组织的入站流量,必须应用 ProjectNetworkPolicy,以允许来自组织外部客户端的流量进入您的项目,例如使用 SSH 连接到虚拟机。

回复流量不需要相应的出站流量政策。隐式允许返回流量。

如果您想从虚拟机所在组织外部的来源访问 PROJECT_1 中的虚拟机,则必须应用以下政策来实现此目的。您必须获取并使用包含来源 IP 地址的 CIDR。CIDR 应采用 network/len 表示法。 例如,192.0.2.0/21 是一个有效路径。

  1. 按照 kubectl 示例配置并应用 Ingress ProjectNetworkPolicy。将该政策应用于 PROJECT_1 中的所有用户工作负载。它允许入站流量流向 CIDR 中位于组织外部的所有主机。

  2. 应用 ProjectNetworkPolicy 配置:

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

出站跨组织流量网络政策

如需启用向组织外部服务的数据传输,请自定义项目网络政策 ProjectNetworkPolicy。由于默认情况下会启用数据渗漏防护,因此自定义的出站流量 ProjectNetworkPolicy 会在状态字段中显示验证错误,并且数据平面会忽略该错误。此过程是设计所致。

如安全性和连接性中所述,如果您允许给定项目的数据渗漏,则工作负载可以传出数据。您允许传出数据的流量是使用为项目分配的已知 IP 地址的来源网络地址转换 (NAT)。安全性和连接性还提供了有关项目网络政策 (ProjectNetworkPolicy) 强制执行的详细信息。

回复流量不需要相应的入站流量政策。隐式允许返回流量。

启用自定义出站流量政策:

  1. 按照 kubectl 示例配置并应用您自己的自定义 Egress ProjectNetworkPolicy。将该政策应用于 PROJECT_1 中的所有用户工作负载。它允许出站流量流向 CIDR 中位于组织外部的所有主机。您的首次尝试会导致出现必要的“状态”错误,这是有意为之。

  2. 应用 ProjectNetworkPolicy 配置:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-egress-traffic-to-NAME
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
      egress:
      - to:
        - ipBlock:
            cidr: CIDR
    EOF
    
  3. 完成后,确认您在状态中看到验证错误。

  4. 请管理员用户停用数据渗漏防护。这样可以启用您的配置,同时阻止所有其他出站流量。

  5. 检查您刚刚创建的 ProjectNetworkPolicy,并验证验证状态字段中的错误是否已消失,以及状态 Ready 是否为 True,这表示您的政策已生效:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get projectnetworkpolicy allow-egress-traffic-to-NAME \
      -n PROJECT_1 \
      -o yaml
    

    根据以下定义替换变量。

    变量定义
    MANAGEMENT_API_SERVERManagement API 服务器 kubeconfig 路径。
    PROJECT_1GDC 项目的名称。
    CIDR允许的目标位置的无类别域间路由 (CIDR) 块。
    NAME与目的地关联的名称。

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