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


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

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

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

要求

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

限制

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

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

  • 不使用 GKE 子集的内部 LoadBalancer Service
  • 基于目标池的外部 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 Service,具体取决于防火墙规则的参数。对于您创建的每条入站允许防火墙规则,请定义以下参数:

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

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

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

      • 在 destination 参数中添加需要应用防火墙规则的所有 LoadBalancer 服务的 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 防火墙规则的功能

本部分介绍了停用为负载平衡器服务自动创建 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 Service:

  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 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 服务创建入站允许防火墙规则。(自动创建的入站允许防火墙规则的名称采用以下格式: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 服务生成的防火墙规则,请参阅自动创建的防火墙规则

排查连接问题

以下示例展示了如何使用网络智能中心连接性测试来测试与外部 LoadBalancer Service:cluster 的连接:

  • 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
    

后续步骤