本页面介绍了如何停用 GKE 为负载均衡器服务创建的入站 VPC 防火墙规则。
在以下情况下,停用为 LoadBalancer Service 自动创建的这些防火墙规则可能很有用:
- 如果您在两个或更多 GKE 集群中拥有多个 LoadBalancer Service,自行管理防火墙规则可能会更高效。例如,手动创建的防火墙规则可以针对多个 LoadBalancerService 允许入站流量,而无需让 GKE 为每个 LoadBalancer Service 创建唯一的防火墙规则。
- 您可以使用分层防火墙政策、全球网络防火墙政策或区域级网络防火墙政策,而不是 VPC 防火墙规则。这些防火墙政策中的规则支持额外操作、更灵活的目标,以及地理定位、威胁情报、地址组和 FQDN 等功能。
如需为 LoadBalancer Service 停用自动创建的防火墙规则,您必须在创建或更新集群时指定 --disable-l4-lb-firewall-reconciliation 标志。--disable-l4-lb-firewall-reconciliation 标志不会影响其他自动创建的 VPC 防火墙规则,例如有助于节点之间通信的规则或允许对 Service 进行健康检查的规则。
要求
- 如需为 LoadBalancer Service 使用用户管理的防火墙规则,您的 GKE 集群必须使用 1.31.3-gke.105600 版或更高版本。
限制
GKE 支持为以下类型的 LoadBalancer Service 停用防火墙规则自动创建功能:
您无法为以下类型的 LoadBalancer Service 停用防火墙规则自动创建功能:
- 未使用 GKE 子集的内部 LoadBalancer Service
- 基于目标池的外部 LoadBalancer Service
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
手动防火墙规则管理策略
在 GKE 集群中为 LoadBalancer Service 停用 VPC 防火墙规则自动创建功能之前,请与 Security Admin 合作制定手动配置防火墙规则的策略。
- 确定要使用的防火墙政策类型:分层防火墙政策、全球网络防火墙政策还是区域级网络防火墙政策。如需了解创建防火墙政策的步骤,请参阅: - 您还可以使用不使用任何政策的 VPC 防火墙规则。 
- 您手动创建的防火墙规则必须是入站流量允许规则,因为隐式拒绝入站流量防火墙规则会禁止传入流量。停用 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}- 您可以选择省略目的地参数。如果省略目的地参数,则目标参数会隐式定义目的地。如需了解详情,请参阅入站流量规则的目标和 IP 地址。
 
- Source 参数:指定需要连接到防火墙规则需要应用的负载均衡器服务的客户端使用的来源(例如 IP 地址)。 
 - 如需了解创建防火墙规则的步骤,请参阅: 
- 如需确保您手动创建的防火墙规则正常运行,请运行 Network Intelligence Center (NIC) 连接性测试。运行连接测试时: - 将目的地设置为 LoadBalancer Service 的 IP 地址。
- 将来源设置为客户端的 IP 地址。
 - 如需了解详情,请参阅排查连接问题。 
为 LoadBalancer Service 停用 VPC 防火墙规则创建功能
本部分介绍了为 LoadBalancer Service 停用 VPC 防火墙规则自动创建功能的步骤。
创建停用了 VPC 防火墙规则创建功能的新 GKE 集群
- 如需在新创建的集群中为 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 版本。
 
- 创建外部或内部 LoadBalancer Service: 
- 验证 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 Service 生成的防火墙规则,请参阅自动创建的防火墙规则。 
更新现有 GKE 集群以停用 VPC 防火墙规则创建功能
在停用 VPC 防火墙规则创建功能之前,请注意以下有关更新现有集群的事项:
- 当您更新现有集群以停用 VPC 防火墙规则创建功能时,GKE 不会删除 GKE 为您的 LoadBalancer Service 自动创建的任何现有防火墙规则。
- GKE 会停止更新现有规则,并且不会为新的 LoadBalancer Service 创建新规则。
- 如需重新启用 VPC 防火墙规则创建功能,您可以将 --enable-l4-lb-firewall-reconciliation标志与gcloud_name container clusters update命令搭配使用。
如需在现有集群上停用自动防火墙规则创建功能,请执行以下操作:
- 更新集群以便为 LoadBalancer Service 停用防火墙规则自动创建和管理功能: - gcloud container clusters update CLUSTER_NAME \ --disable-l4-lb-firewall-reconciliation \ --cluster-version=supported_version- 替换以下内容: - CLUSTER_NAME:新集群的名称。
- VERSION:GKE 版本。
 
- 创建外部或内部 LoadBalancer Service: 
- 验证 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 Service 生成的防火墙规则,请参阅自动创建的防火墙规则。 
排查连接问题
以下示例演示了如何使用 Network Intelligence Center Connectivity Tests 来测试与外部 LoadBalancer Service 的连接:
- Network Intelligence Center: - 在 Google Cloud 控制台中,前往 Network Intelligence Center,然后启动新的连接测试。
- 从下拉菜单中,选择任何外部公共 IP 地址作为来源,并从目标中选择负载均衡器。
- 重新运行连接测试。
 
- 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 Service 的名称。
- PROJECT_ID:包含集群 VPC 网络的项目的项目 ID。如果您的集群使用共享 VPC 网络,请使用宿主项目的 ID。
- NETWORK_NAME:集群的 VPC 网络的名称。
 - 查看测试结果: - gcloud network-management connectivity-tests describe TEST_NAME
后续步骤
- 详细了解防火墙政策。
- 如需概览 GKE 默认自动创建的入站流量允许 VPC 防火墙规则,请参阅自动创建的防火墙规则。
- 如需了解 LoadBalancer Service 的参数,请参阅 LoadBalancer Service 参数。
- 了解 Google Cloud中的其他预先填充的防火墙规则。
- 详细了解如何在使用共享 VPC 的项目中创建防火墙规则。