本页面介绍了如何停用 GKE 为负载均衡器服务创建的入站 VPC 防火墙规则。
在以下情况下,停用为 LoadBalancer 服务自动创建的这些防火墙规则可能很有用:
- 如果您在两个或更多 GKE 集群中拥有多个 LoadBalancer 服务,自行管理防火墙规则可能会更高效。例如,手动创建的防火墙规则可以允许多个 LoadBalancerService 的入站流量,而无需让 GKE 为每个 LoadBalancer 服务创建唯一的防火墙规则。
- 您可以使用分层防火墙政策、全球网络防火墙政策或区域级网络防火墙政策,而不是 VPC 防火墙规则。这些防火墙政策中的规则支持其他操作、更灵活的目标,以及地理位置、威胁情报、地址组和 FQDN 等功能。
如需为 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 防火墙规则的功能之前,请与安全管理员合作制定手动配置防火墙规则的策略。
确定要使用的防火墙政策类型:分层防火墙政策、全球网络防火墙政策还是区域级网络防火墙政策。如需了解创建防火墙政策的步骤,请参阅:
您还可以使用不使用任何政策的 VPC 防火墙规则。
您手动创建的防火墙规则必须是入站允许规则,因为隐式拒绝入站防火墙规则会禁止传入流量。停用 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}
- 您可以选择省略目的地参数。如果省略目的地参数,则目标参数会隐式定义目的地。如需了解详情,请参阅入站流量规则的目标和 IP 地址。
Source 参数:指定需要连接到防火墙规则需要应用的负载均衡器服务的客户端使用的来源(例如 IP 地址)。
如需了解创建防火墙规则的步骤,请参阅:
如需确保您手动创建的防火墙规则正常运行,请运行 Network Intelligence Center (NIC) 连接性测试。运行连接测试时:
- 将目的地设置为 LoadBalancer 服务的 IP 地址。
- 将来源设置为客户端的 IP 地址。
如需了解详情,请参阅排查连接问题。
为 LoadBalancer 服务停用 VPC 防火墙规则创建功能
本部分介绍了停用 LoadBalancer 服务 VPC 防火墙规则自动创建功能的步骤。
创建停用了 VPC 防火墙规则创建功能的新 GKE 集群
如需在新建的集群中为 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 版本。
创建外部或内部 LoadBalancer 服务:
验证 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
命令。
如需在现有集群上停用自动防火墙规则创建功能,请执行以下操作:
更新集群以停用 LoadBalancer 服务的防火墙规则自动创建和管理功能:
gcloud container clusters update CLUSTER_NAME \ --disable-l4-lb-firewall-reconciliation \ --cluster-version=supported_version
替换以下内容:
CLUSTER_NAME
:新集群的名称。VERSION
:GKE 版本。
创建外部或内部 LoadBalancer 服务:
验证 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:
- 在 Google Cloud 控制台中,前往“网络智能中心”,然后开始新的连接测试。
- 从下拉菜单中,选择任何外部公共 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 服务的名称。PROJECT_ID
:包含集群 VPC 网络的项目的项目 ID。如果您的集群使用共享 VPC 网络,请使用宿主项目的 ID。NETWORK_NAME
:集群的 VPC 网络的名称。
查看测试结果:
gcloud network-management connectivity-tests describe TEST_NAME
后续步骤
- 详细了解防火墙政策。
- 如需概览 GKE 默认自动创建的入站流量允许 VPC 防火墙规则,请参阅自动创建的防火墙规则。
- 如需了解 LoadBalancer 服务的参数,请参阅 LoadBalancer 服务参数。
- 了解 Google Cloud中的其他预先填充的防火墙规则。
- 详细了解如何在使用共享 VPC 的项目中创建防火墙规则。