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


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

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

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

要求

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

限制

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

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

  • 未使用 GKE 子集化的内部 LoadBalancer 服务
  • 基于目标池的外部 LoadBalancer 服务

准备工作

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

  • 启用 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 服务的流量匹配的入站流量允许防火墙规则,否则入站流量将无法到达您的节点。

    根据防火墙规则的参数,单个入站允许防火墙规则可以应用于一个或多个 LoadBalancer 服务。对于您创建的每条入站允许防火墙规则,请定义以下参数:

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

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

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

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

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

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

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

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

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

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

创建停用了 VPC 防火墙规则创建功能的新 GKE 集群

  1. 如需在新建的集群中为 LoadBalancer 服务停用自动创建的 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 服务:

  3. 验证 GKE 是否未为 LoadBalancer 服务创建入站允许防火墙规则。(自动创建的入站允许防火墙规则的名称采用以下形式: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 服务创建新规则。
  • 如需重新启用 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 服务:

  3. 验证 GKE 是否未为 LoadBalancer 服务创建入站允许防火墙规则。(自动创建的入站允许防火墙规则的名称采用以下格式: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 服务的连接:集群:

  • Network Intelligence Center:

    1. 在 Google Cloud 控制台中,前往“网络智能中心”,然后开始新的连接测试。
    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 服务的系统的 IP 地址。例如
    • LOADBALANCER_NAME:外部 LoadBalancer 服务的名称。
    • PROJECT_ID:包含集群 VPC 网络的项目的项目 ID。如果您的集群使用共享 VPC 网络,请使用宿主项目的 ID。
    • NETWORK_NAME:集群的 VPC 网络的名称。

    查看测试结果:

    gcloud network-management connectivity-tests describe TEST_NAME
    

后续步骤