如何解决 Amazon EKS 的服务负载均衡器问题?

上次更新日期:2022 年 7 月 27 日

我无法在 Amazon Elastic Kubernetes Service(Amazon EKS)中创建由负载均衡器提供支持的 Kubernetes 服务。

要排查服务负载均衡器问题,请确认您具备以下条件:

  • Amazon Virtual Private Cloud (Amazon VPC) 子网的正确标签
  • 集群 IAM 角色所需的 AWS Identity and Access Management (IAM) 权限
  • 有效的 Kubernetes 服务定义
  • 保持在账户限制之内的负载均衡器
  • 子网上拥有足够的免费 IP 地址

如果您在确认具备所有先决条件后仍存在问题,请按照尝试其他问题排查步骤部分的步骤操作。

解决方法

注意:以下步骤适用于 Classic Load Balancer 和网络负载均衡器。对于 Application Load Balancer,请参阅在 Amazon EKS 上部署应用程序负载均衡

使用适用于 Amazon VPC 子网的正确标签

1.    打开 Amazon VPC 控制台

2.    在导航窗格中,选择子网

3.    选择每个子网的 Tags (标签) 选项卡,然后确认存在标签。例如:

Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared

4.    对于公有子网,请确认存在以下标签:

Key: kubernetes.io/role/elb
Value: 1

注意:若要查看子网是否为公有子网,请查看与该子网关联的路由表。公有子网拥有指向互联网网关的路由 (igw-xxxxxxxxxxx)。私有子网拥有通过 NAT 网关或 NAT 实例指向互联网的路由,或者完全没有指向互联网的路由。

重要提示:您必须拥有第 4 步中的标签才能创建面向互联网的负载均衡器服务。面向互联网的负载均衡器通过互联网将来自客户端的请求路由到目标。

5.    对于私有子网,请确认以下标签存在:

Key: kubernetes.io/role/internal-elb
Value: 1

重要提示:您必须拥有第 5 步中的标签才能创建内部负载均衡器服务。内部负载均衡器使用私有 IP 地址将请求路由到目标。

设置集群 IAM 角色所需的 IAM 权限

1.    打开 Amazon EKS 控制台

2.    在导航窗格中,选择集群

3.    选择您的集群,然后记下您的集群 IAM 角色 ARN

4.    打开 IAM 控制台

5.    在导航窗格中,选择角色

6.    选择您在第 3 步中确定的与集群 IAM 角色 ARN 匹配的角色。

7.    确认已为您的角色附加 AWS 托管策略 AmazonEKSClusterPolicy

注意:Amazon EKS 控制平面假定使用上面的 IAM 角色为您的服务创建负载均衡器。

使用有效的 Kubernetes 服务定义

1.    在 Kubernetes 服务的 YAML 文件中,确认已将 spec.type 设置为 LoadBalancer

以下是由负载均衡器提供支持的 Kubernetes 服务示例:

apiVersion: v1
kind: Service
metadata:
  annotations:
    # This annotation is only required if you are creating an internal facing ELB. Remove this annotation to create public facing ELB.
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
  name: nginx-elb
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - name: "http"
    port: 80
    targetPort: 80
  selector:
    app: nginx

注意:若要使用不同的注释自定义您的服务,请参阅内部负载均衡器AWS 上的 TLS 支持。如果您使用 AWS 负载均衡器控制器管理网络负载均衡器,那么注释必须符合 Kubernetes 服务的定义。有关更多信息,请参阅 在 Amazon EKS 上部署网络负载均衡

确认负载均衡器是否在账户限制范围内

默认情况下,在每个 AWS 区域,一个 AWS 账户最多拥有 20 个负载均衡器。

如需查看您拥有多少负载均衡器,请打开 Amazon Elastic Compute Cloud(Amazon EC2)控制台。然后在导航窗格中选择 Load Balancers(负载均衡器)。

如果已达到负载均衡器数量上限,则您可以申请增加服务配额

确认您的子网是否拥有足够的免费 IP 地址

若要创建负载均衡器,则该负载均衡器的每个子网均必须至少拥有八个免费 IP 地址。这对于 Classic Load Balancer 和网络负载均衡器来说是必需的。

尝试其他问题排查步骤

若要查看 Kubernetes 服务中是否存在可帮助您解决问题的错误消息,请运行以下命令:

$ kubectl describe service my-elb-service

如果已成功创建服务,则输出将与以下类似:

...
...
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  47s   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   44s   service-controller  Ensured load balancer

如果未成功创建服务,则您会收到错误消息。

若要获取与错误消息相关的更多信息,您可以执行以下操作:


这篇文章对您有帮助吗?


您是否需要账单或技术支持?