EKS:找不到任何适合创建 ELB 的子网

EKS : could not find any suitable subnets for creating the ELB

我正在尝试使用 loadBalancer 类型的服务向外界公开服务。

为此,我已关注此文档

https://aws.amazon.com/premiumsupport/knowledge-center/eks-kubernetes-services-cluster/

我的 loadbalancer.yaml 看起来像这样

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

但是负载均衡器没有按预期创建我收到以下错误

Warning  SyncLoadBalancerFailed  8s (x3 over 23s)  service-controller  Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB

似乎是因为子网标签中的一些问题需要解决,但我的子网中有所需的标签

kubernetes.io/cluster/<cluster-name>. owned  
kubernetes.io/role/elb   1

但是,我仍然收到错误 could not find any suitable subnets for creating the ELB

可能您的子网不是 public 子网,即无法从 Internet 访问。这将是您的 Loadbalancer 接受来自外部世界的流量所必需的。为了使其 public,您需要将 Internet 网关附加到您的 VPC。检查 here 以获取更多文档。

默认情况下,AWS EKS 仅将负载均衡器附加到 public 个子网。为了在私有子网中启动它,您不仅需要标记您的子网(看起来像您所做的),还需要注释您的负载均衡器-

service.beta.kubernetes.io/aws-load-balancer-internal: "true"

您可以找到更多信息here

在 EKS 1.16 中,我需要面向 Internet 的 NLB。

EKS 的根本原因是您在创建集群时没有选择 public 子网。

创建集群后,EKS 现在不允许更新子网 here

为了解决这个问题,我执行了以下步骤

  1. 在 EKS
  2. 的同一 vpc 中创建了 public subnet
  3. 已附加 IGW 在新创建的 public 子网中的路由表中
  4. 在 public 个子网中 tags 下面添加
  5. kubernetes.io/cluster/<EKSClusterName> : shared

注意: 在第 4 步中,将您的 EKS 集群名称替换为占位符 EKSClusterName

对于可能遇到这个问题的人,我遇到了同样的错误,但问题真的很简单。

带有关键字 kubernetes.io/cluster/ 的标签有错误的集群名称,因为部署它的自动化是错误的。

除了罗伯特的回答,您还可以使用以下 kubectl 命令来注释服务;

kubectl annotate svc <service-name> service.beta.kubernetes.io/aws-load-balancer-internal="true"

解决方案这已经解决了我的问题。

To identify a cluster's subnets, the Kubernetes Cloud Controller Manager (cloud-controller-manager) and AWS Load Balancer Controller (aws-load-balancer-controller) query that cluster's subnets by using the following tag as a filter:

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

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

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

集群名称值适用于您的 Amazon EKS 集群。共享值允许多个集群使用子网。

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

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

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

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

注意:使用前面的标记而不是在每个可用区中使用 public 子网。

参考:https://aws.amazon.com/premiumsupport/knowledge-center/eks-vpc-subnet-discovery/