GKE LoadBalancer 服务的用户管理型防火墙规则


本页面介绍了如何停用 GKE 为负载均衡器服务创建的入站 VPC 防火墙规则

在以下情况下,为 LoadBalancer Service 停用这些自动创建的防火墙规则会很有用:

如需为 LoadBalancer Service 停用自动创建的防火墙规则,您必须在创建或更新集群时指定 --disable-l4-lb-firewall-reconciliation 标志。--disable-l4-lb-firewall-reconciliation 标志不会影响自动创建的其他 VPC 防火墙规则,例如方便节点之间通信的规则或允许对服务执行健康检查的规则。

要求

  • 如需对 LoadBalancer Service 使用用户管理的防火墙规则,您的 GKE 集群必须使用 1.31.3-gke.105600 或更高版本。

限制

GKE 支持为以下类型的 LoadBalancer Service 停用防火墙规则自动创建功能:

您无法为以下类型的 LoadBalancer 服务停用防火墙规则自动创建功能:

  • 不使用 GKE 子集的内部 LoadBalancer Service
  • 基于目标池的外部 LoadBalancer Service

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

手动防火墙规则管理策略

在为 GKE 集群中的 LoadBalancer 服务停用 VPC 防火墙规则自动创建功能之前,请与安全管理员合作制定手动配置防火墙规则的策略。

  1. 确定要使用哪种类型的防火墙政策:分层防火墙政策、全球网络防火墙政策或区域级网络防火墙政策。如需了解创建防火墙政策的步骤,请参阅:

    您也可以使用不使用任何政策的 VPC 防火墙规则。

  2. 您手动创建的防火墙规则必须是入站允许规则,因为隐式拒绝入站防火墙规则会禁止传入流量。停用 VPC 防火墙规则自动创建功能后,除非您创建了与 LoadBalancer Service 流量匹配的入站防火墙规则,否则入站流量将无法到达您的节点。

    一条入站允许防火墙规则可以应用于一个或多个 LoadBalancer Service,具体取决于防火墙规则的参数。对于您创建的每条入站允许防火墙规则,请定义以下参数:

    • 目标参数:确保防火墙规则至少包含包含 LoadBalancer Service 的集群的所有节点。支持的目标取决于规则位于哪种类型的防火墙政策中,或者您是否使用了 VPC 防火墙规则。如需了解防火墙政策中规则的目标参数,请参阅目标

    • 协议和端口:包含防火墙规则需要应用到的 LoadBalancer Service 使用的所有协议和目标端口。

    • 目标参数:您可以对目标参数采用以下策略之一:

      • 在目标参数中添加防火墙规则需要应用到的所有 LoadBalancer Service 的 IP 地址。如需查找 LoadBalancer Service 的 IP 地址,请使用以下命令:
         kubectl get svc LOADBALANCER_NAME \
            -n NAMESPACE_NAME \
            -o jsonpath='{.status.loadBalancer.ingress[0].ip}
      
    • Source 参数:指定需要连接到防火墙规则需要应用的负载均衡器服务的客户端使用的来源(例如 IP 地址)。

    如需了解创建防火墙规则的步骤,请参阅:

  3. 如需确保您手动创建的防火墙规则正常运行,请运行 Network Intelligence Center (NIC) 连接性测试。运行连接性测试时:

    • 将目标设置为 LoadBalancer Service 的 IP 地址。
    • 将来源设置为客户端的 IP 地址。

    如需了解详情,请参阅排查连接问题

停用 LoadBalancer 服务的 VPC 防火墙规则创建功能

本部分介绍了为 LoadBalancer 服务停用 VPC 防火墙规则自动创建功能的步骤。

创建新的 GKE 集群,并停用 VPC 防火墙规则

  1. 如需为新创建的集群中的 LoadBalancer Service 停用自动创建的 VPC 防火墙规则,请使用 --disable-l4-lb-firewall-reconciliation 标志创建集群:

    Autopilot:

    gcloud container clusters create-auto CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --cluster-version=VERSION
    

    标准:

    gcloud container clusters create CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --enable-l4-ilb-subsetting \
      --cluster-version=VERSION
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • VERSION:GKE 版本。
  2. 创建外部或内部 LoadBalancer Service:

  3. 验证 GKE 是否未为 LoadBalancer Service 创建入站允许防火墙规则。(自动创建的入站允许防火墙规则的名称采用以下格式:k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash])。

    以下命令会返回包含 k8s2 的防火墙规则列表:

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    如果 externalTrafficPolicy 参数设为 Local,则响应应仅返回 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 形式的健康检查防火墙规则。它使用 spec.healthCheckNodePort 参数定义的 TCP 端口。如果未指定,则 Kubernetes 控制平面会从节点端口范围分配健康检查端口。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    如果 externalTrafficPolicy 参数设置为 Cluster,则系统会改为返回以下健康检查防火墙规则。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    如需详细了解为 GKE 服务生成的防火墙规则,请参阅自动创建的防火墙规则

更新现有 GKE 集群以停用 VPC 防火墙规则创建

在停用 VPC 防火墙规则创建功能之前,请注意以下关于更新现有集群的注意事项:

  • 当您更新现有集群以停用 VPC 防火墙规则创建功能时,GKE 不会删除 GKE 为 LoadBalancer 服务自动创建的任何现有防火墙规则。
  • GKE 会停止更新现有规则,并且不会为新的 LoadBalancer Service 创建新规则。
  • 如需重新启用 VPC 防火墙规则创建功能,您可以将 --enable-l4-lb-firewall-reconciliation 标志与 gcloud_name container clusters update 命令结合使用。

如需在现有集群上停用自动防火墙规则创建功能,请执行以下操作:

  1. 更新集群以停用 LoadBalancer 服务的防火墙规则自动创建和管理功能:

    gcloud container clusters update CLUSTER_NAME \
    --disable-l4-lb-firewall-reconciliation \
    --cluster-version=supported_version
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • VERSION:GKE 版本。
  2. 创建外部或内部 LoadBalancer Service:

  3. 验证 GKE 是否未为 LoadBalancer Service 创建入站允许防火墙规则。(自动创建的入站允许防火墙规则的名称采用以下格式:k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash])。

    以下命令会返回包含 k8s2 的防火墙规则列表:

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    如果 externalTrafficPolicy 参数设为 Local,则响应应仅返回 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 形式的健康检查防火墙规则。它使用 spec.healthCheckNodePort 参数定义的 TCP 端口。如果未指定,则 Kubernetes 控制平面会从节点端口范围分配健康检查端口。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    如果 externalTrafficPolicy 参数设置为 Cluster,则系统会改为返回以下健康检查防火墙规则。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    如需详细了解为 GKE 服务生成的防火墙规则,请参阅自动创建的防火墙规则

排查连接问题

以下示例说明了如何使用 Network Intelligence Center 连接性测试来测试与外部 LoadBalancer Service:cluster 的连接:

  • Network Intelligence Center:

    1. 在 Google Cloud 控制台中,转到 Network Intelligence Center,然后开始新的连接性测试。
    2. 从下拉菜单中,选择任何外部公共 IP 地址作为来源,并从目标中选择负载均衡器。
    3. 重新运行连接性测试。
  • gcloud CLI:

    以下示例命令会创建并运行测试,其中本地工作站的公共 IP 地址作为源,外部负载均衡器的外部 IP 地址作为目标:

    gcloud network-management connectivity-tests create TEST_NAME \
    --source-ip-address=SOURCE_IP_ADDRESS \
    --source-network-type=NON_GCP_NETWORK \
    --destination-ip-address=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}') \
    --destination-port=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.spec.ports[0].targetPort}') \
    --destination-network=projects/PROJECT_ID/global/networks/NETWORK_NAME
    

    替换以下内容:

    • TEST_NAME:连接测试的名称。
    • SOURCE_IP_ADDRESS:需要连接到外部 LoadBalancer Service 的系统的 IP 地址。例如
    • LOADBALANCER_NAME:外部 LoadBalancer Service 的名称。
    • PROJECT_ID:包含集群的 VPC 网络的项目的项目 ID。如果您的集群使用共享 VPC 网络,请使用宿主项目的 ID。
    • NETWORK_NAME:集群的 VPC 网络的名称。

    查看测试结果:

    gcloud network-management connectivity-tests describe TEST_NAME
    

后续步骤