网络政策

如需在项目命名空间级别为虚拟机 (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 项目中工作负载的连接,以及相同流的返回流量。如果您想从 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 以及发往 PROJECT_1PROJECT_2 的连接。

请为变量使用以下定义。

变量定义
MANAGEMENT_API_SERVER管理 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 会在状态字段中显示验证错误,并且数据平面会忽略该错误。这是设计所致。

安全性与连接性中所述,如果您允许特定项目发生数据渗漏,工作负载可以向外传输数据。您允许传出数据流量的来源网络地址转换 (NAT) 使用为项目分配的已知 IP 地址。安全性和连接性还提供了有关项目网络政策 (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 的所有其他出站流量。