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

2 分钟阅读
0

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

简短描述

Kubernetes 云管理控制器 (cloud-controller-manager) 和 AWS负载均衡器控制器 (aws-load-balancer-controller) 查询集群的子网以识别它们。此查询使用以下标签作为筛选条件:

kubernetes.io/cluster/cluster-name

**注意:**将 cluster-name 替换为您的 Amazon EKS 集群名称。

云管理控制器和 AWS Load Balancer 控制器都要求子网具有以下两个标签之一:

kubernetes.io/role/elb

-或者-

kubernetes.io/role/internal-elb

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

如果您没有将子网与任一标签关联,并且使用的是 AWS 负载均衡器控制器,则会收到错误。

例如,如果正在对 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

如果正在对 Application Load Balancer 入口控制器进行问题排查,并且运行 kubectl logs your-aws-load-balancer-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

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


相关信息

Amazon EKS VPC 和子网要求以及注意事项

子网自动发现(位于 GitHub 网站)

Amazon EKS 上的应用程序负载均衡

相关视频

AWS 官方
AWS 官方已更新 1 年前