网络策略

本文档介绍了如何在 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
  ingress:
  - from:
    - 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_1PROJECT_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 地址的 CIDRCIDR 应采用 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) 强制执行的详细信息。

回复流量不需要相应的 Ingress 政策。系统会隐式允许回程流量。

启用自定义出站政策:

  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,验证验证状态字段中的错误是否已消失,并且状态 ReadyTrue,表示您的政策已生效:

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

    使用以下定义替换变量。

    变量定义
    MANAGEMENT_API_SERVER管理 API 服务器 kubeconfig 路径。
    PROJECT_1GDC 项目的名称。
    CIDR允许的目标的无类别域间路由 (CIDR) 地址段。
    NAME与目的地关联的名称。

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