负载均衡器子网

本页面介绍 GKE on AWS 如何与 AWS 搭配使用以便为 Service 负载均衡器选择子网,以及如何标记子网以便在 Service 负载均衡器创建期间自动发现这些子网。

为什么需要指定子网

创建负载均衡器时,AWS 需要知道将其放入哪些子网。子网确定负载均衡器可用区、IP 地址和端点。

通常,对于包含一个节点池的每个可用区,负载均衡器会分配到一个子网。AWS 至少需要一个可用子网来创建网络负载均衡器 (NLB),而对于应用负载均衡器 (ALB),至少需要两个子网。

所有 AWS 子网要么是公共的(具有公共 IP 地址和指向 VPC 的互联网网关的路由),要么是专用的(缺少这些功能)。面向互联网的负载均衡器必须位于公共子网。内部负载均衡器可以位于公共子网,也可以位于专用子网。

如果没有标记的子网

如果 GKE on AWS 需要创建负载均衡器,并且没有标记的子网或者标记的子网没有容量,则它可能会在其他子网中创建负载均衡器。为避免这种情况并控制负载均衡器所在的子网,您应该标记所有子网。

子网自动发现

GKE on AWS 会自动发现用于负载均衡器的子网,方法是列出 VPC 中的所有子网,然后从每个可用区中最多选择一个子网。

若要让 GKE on AWS 自动发现子网,子网必须:

  • 具有 kubernetes.io/role/elb 标记(适用于面向互联网的负载均衡器)
  • 具有 kubernetes.io/role/internal-elb 标记(适用于内部负载均衡器)
  • 要么不包含前缀为 kubernetes.io/cluster/ 的标记,要么包含 kubernetes.io/cluster/CLUSTER_UID 标记,其中 CLUSTER_UID 是当前集群的 UID。

此外,用于面向互联网的负载均衡器的子网必须具有指向 VPC 的互联网网关的路由。

如果可用区中有多个子网满足负载均衡器的要求,则 GKE on AWS 会按子网 ID 依序对子网进行排名。

针对预期用途标记您的子网

若要使 GKE on AWS 自动发现负载均衡器的子网,您必须向子网应用以下两个标记之一以指示其可用性。它们分别是:

  • kubernetes.io/role/elb:将此标记应用于子网,以将其标记为可用于面向互联网的负载均衡器。子网必须是具有指向 VPC 的互联网网关的路由的公共子网。将此标记设置为 1。如需应用此标记,请运行以下命令:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags "Key=kubernetes.io/role/elb,Value=1"
    
  • kubernetes.io/role/internal-elb:将此标记应用于子网,以将其标记为可用于内部负载均衡器。将此标记的值设置为 1。如需应用此标记,请运行以下命令:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags Key=kubernetes.io/role/internal-elb,Value=1
    

替换以下内容:

  • SUBNET_ID:您要标记的子网的 ID

为子网提供 kubernetes.io/role 标记后,您还可以使用一个或多个 kubernetes.io/cluster/CLUSTER_UID 标记对其进行标记,其中 CLUSTER_UID 是 GKE on AWS 集群的 UID。这样可以防止这些标记中未列出的任何集群自动发现子网供其负载均衡器使用。

如需详细了解 aws ec2 create-tags 命令,请参阅 Amazon aws ec2 create-tags 文档。

问题排查

负载均衡器配置的最常见问题是子网标记不正确。这可能会导致自动发现算法选择错误的子网。如需诊断和解决此问题:

  • 如果要创建面向互联网的负载均衡器,请确保每个包含节点池的可用区中至少有一个公共子网,并且子网具有 kubernetes.io/role/elb 标记。

  • 如果您要创建内部负载均衡器,请确保每个包含节点池的可用区中至少有一个子网,并且这些子网具有 kubernetes.io/role/internal-elb 标记。

  • 检查您要自动发现的子网是否具有任何采用 kubernetes.io/cluster/CLUSTER_UID 格式的标记。如果子网具有任何为集群命名的此类标记,则该子网只能由已命名的集群自动发现。如需解决此问题,请删除所有集群名称标记(以便从任何集群自动发现子网),或者添加包含 GKE on AWS 集群 UID 且值为 shared 的集群名称标记。

  • 使用以下命令检查 Kubernetes 事件历史记录:

    kubectl get events -A | grep LoadBalancer
    

    例如,事件消息 could not find any suitable subnets for creating the ELB 表示无法自动发现子网。如果出现此警告,请确保子网及其标记正确且完整。

  • 如需列出可以为面向互联网的负载均衡器自动发现的子网,请运行以下命令:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/elb,Values=*"
    

    VPC_ID 替换为 VPC 的 ID。

  • 如需列出可以为内部负载均衡器自动发现的子网,请运行以下命令:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
    

后续步骤