网络政策

如需在项目命名空间级别为虚拟机 (VM) 工作负载设置网络政策,请使用 ProjectNetworkPolicy 资源,这是适用于 Google Distributed Cloud (GDC) 气隙设备的集群间网络政策。借助此功能,您可以定义政策,以允许项目内、项目之间以及与外部 IP 地址的通信。

对于项目内的流量,GDC 默认会为每个项目应用预定义的项目网络政策,即项目内政策。如需在同一组织内的多个项目之间启用和控制流量,您可以定义跨项目政策。如果存在多项政策,GDC 会以累加方式合并每个项目的规则。如果至少有一条规则匹配,GDC 也会允许流量通过。

请求权限和访问权限

如需执行本页面中列出的任务,您必须具有 Project NetworkPolicy Admin 角色。请让您的项目 IAM 管理员在虚拟机所在项目的命名空间中授予您项目 NetworkPolicy 管理员 (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 项目中工作负载的连接,以及相同流的返回流量。运行以下命令以应用该政策:

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 以及发往 PROJECT_1PROJECT_2 的连接。

请为变量使用以下定义。

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

出站跨项目流量网络政策

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

跨组织流量

如需将虚拟机工作负载连接到项目之外且位于其他组织中的目标,则需要获得明确批准。之所以需要获得该批准,是因为 GDC 默认启用的数据渗漏防护功能会阻止项目出站到项目所在组织之外的工作负载。本部分将介绍如何添加特定的出站政策并启用数据渗漏。

入站跨组织流量网络政策

配置跨组织的出站流量网络政策后,您无需授予入站流量权限。工作负载从组织外部允许的出站流量会通过负载均衡器 (LB),并且该出站流量是源网络地址转换 (NAT),使用您为项目分配的 IP 地址。

出站跨组织流量网络政策

如需允许出站流量流向组织外部的服务,请自定义项目网络政策 ProjectNetworkPolicy。不过,由于数据渗漏防护功能默认处于启用状态,因此您自定义的出站流量 ProjectNetworkPolicy 会在状态字段中显示验证错误,并且数据层会忽略该错误。这是设计所致。

如果您允许特定项目发生数据渗漏,工作负载可以流出。您允许出站的流量是使用为项目分配的已知 IP 地址的源网络地址转换 (NAT)。

以下说明介绍了如何启用自定义的出站政策:

  1. 按照 kubectl CLI 示例,配置并应用您自己的自定义 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 的所有其他出站流量。