如何在 Amazon EKS 集群中标记 Amazon VPC 子网,以便负载均衡器或入口控制器自动发现子网?

上次更新时间:2020 年 2 月 7 日

我想在 Amazon Virtual Private Cloud (Amazon VPC) 的公有或私有子网中部署负载均衡器或入口控制器。为什么 Kubernetes 无法在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中发现我的子网?

简短描述

为了识别集群的子网,Kubernetes 云管理控制器 (cloud-controller-manager) 和 ALB 入口控制器 (alb-ingress-controller) 通过使用以下标记作为筛选条件来查询集群的子网:

kubernetes.io/cluster/cluster-name

云管理控制器和 ALB 入口控制器都要求子网具有以下两个标记之一:

kubernetes.io/role/elb

--或者--

kubernetes.io/role/internal-elb

注意:如果您不使用上述标签,则云管理控制器会通过检查与该子网关联的路由表来确定该子网是公有子网还是私有子网。与私有子网不同,公有子网使用互联网网关来直接路由至互联网。

如果您没有将子网与任何一个标签相关联,则会收到错误消息。

例如,如果正在对 Kubernetes 服务进行问题排查,并且运行 kubectl describe service your-service-name 命令,则会收到以下错误:

Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   EnsuringLoadBalancer        9s (x2 over 14s)  service-controller  Ensuring load balancer
  Warning  CreatingLoadBalancerFailed  9s (x2 over 14s)  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service default/guestbook: could not find any suitable subnets for creating the ELB

如果正在对 ALB 入口控制器进行问题排查,并且运行kubectl logs your-alb-ingress-controller-pod-name 命令,则会收到以下错误:

E0121 22:44:02.864753       1 controller.go:217] kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs. Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation. The subnets that did resolve were []"  "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}

注意:如果使用 eksctl 创建 VPC,则该 VPC 中的所有子网都具有 kubernetes.io/role/elbkubernetes.io/role/internal-elb 标签。

解决方法

选择适当的选项标记子网:

对于负载均衡器资源使用的公有和私有子网

使用以下键值对标记集群用于负载均衡器资源的所有公有和私有子网:

Key: kubernetes.io/cluster/cluster-name
Value: shared

cluster-name 值适用于 Amazon EKS 集群。shared 值允许多个集群使用子网。

对于内部负载均衡器使用的私有子网

为了允许 Kubernetes 将私有子网用于内部负载均衡器,请使用以下键值对标记 VPC 中的所有私有子网::

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

对于外部负载均衡器使用的公有子网

为了允许 Kubernetes 仅将标记的子网用于外部负载均衡器,请使用以下键值对标记 VPC 中的所有公有子网:

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

注意:在每个可用区中使用上述标签,而不使用公有子网。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?