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
为了解决这个问题,我执行了以下步骤
- 在 EKS
的同一 vpc 中创建了 public subnet
- 已附加
IGW
在新创建的 public 子网中的路由表中
- 在 public 个子网中
tags
下面添加
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/
我正在尝试使用 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
为了解决这个问题,我执行了以下步骤
- 在 EKS 的同一 vpc 中创建了
- 已附加
IGW
在新创建的 public 子网中的路由表中 - 在 public 个子网中
tags
下面添加 kubernetes.io/cluster/<EKSClusterName>
:shared
public subnet
注意: 在第 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/