背景:
我有一个
VPC
,有 3 个公共 subnets
(子网可以访问互联网网关)
我在此 VPC 中有一个 EKS 集群,该 EKS 集群是从控制台创建的,而不是使用
eksctl
我使用了官方aws文档中的this教程,我成功设置了我的ALB控制器并且控制器运行完美:
集群包含两个节点组:
t3a.micro
t3.small
$ kubectl get deployment -n kube-system aws-load-balancer-controller
NAME READY UP-TO-DATE AVAILABLE AGE
aws-load-balancer-controller 1/1 1 1 60m
我使用了他们的游戏示例,这是清单文件:
---
apiVersion: v1
kind: Namespace
metadata:
name: game-2048
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: game-2048
name: deployment-2048
spec:
selector:
matchLabels:
app.kubernetes.io/name: app-2048
replicas: 1
template:
metadata:
labels:
app.kubernetes.io/name: app-2048
spec:
containers:
- image: alexwhen/docker-2048
imagePullPolicy: Always
name: app-2048
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: game-2048
name: service-2048
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app.kubernetes.io/name: app-2048
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: game-2048
name: ingress-2048
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: service-2048
servicePort: 80
但是,当我描述入口时:我收到以下消息
DNDT@DNDT-DEV-2 MINGW64 ~/Desktop/.k8s
$ kubectl describe ingress/ingress-2048 -n game-2048
Name: ingress-2048
Namespace: game-2048
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
*
/* service-2048:80 (172.31.4.64:80)
Annotations: alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
kubernetes.io/ingress.class: alb
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedBuildModel 9s (x13 over 32s) ingress Failed build model due to couldn't auto-discover subnets: unable to discover at least one subnet
我到处搜索,他们都在谈论添加标签,我从头开始创建了一个全新的集群,但仍然遇到这个问题,还有其他我遗漏的东西吗?
我检查了this答案,但它不相关,因为它针对的是ELB而不是ALB,
====================================
更新:
我明确添加了子网:
alb.ingress.kubernetes.io/subnets: subnet-xxxxxx, subnet-xxxxx, subnet-xxx
现在我得到了我的外部IP,但有一些警告
$ kubectl describe ingress/ingress-2048 -n game-2048
Name: ingress-2048
Namespace: game-2048
Address: k8s-game2048-ingress2-330cc1efad-115981283.eu-central-1.elb.amazonaws.com
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
*
/* service-2048:80 (172.31.13.183:80)
Annotations: alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/subnets: subnet-8ea768e4, subnet-bf2821f2, subnet-7c023801
alb.ingress.kubernetes.io/target-type: ip
kubernetes.io/ingress.class: alb
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedDeployModel 43s ingress Failed deploy model due to ListenerNotFound: One or more listeners not found
status code: 400, request id: e866eba4-328c-4282-a399-4e68f55ee266
Normal SuccessfullyReconciled 43s ingress Successfully reconciled
同样进入浏览器,使用外部ip返回:
503 Service Temporarily Unavailable
就我而言,这是因为我没有使用正确的资源标签来标记 AWS 子网。 https://kubernetes-sigs.github.io/aws-load-balancer-controller/guide/controller/subnet_discovery/
编辑 - 2021 年 5 月 28 日
公共子网应使用以下资源标记:
kubernetes.io/role/elb: 1
私有子网应标记为:
kubernetes.io/role/internal-elb: 1
私有子网和公有子网都应标记为:
kubernetes.io/cluster/${your-cluster-name}: owned
或者如果子网也被非 EKS 资源使用
kubernetes.io/cluster/${your-cluster-name}: shared
来源: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.1/deploy/subnet_discovery/
确保 aws-load-balancer-controller 部署中的 --cluster-name 配置正确。
使用
kubectl get deployment -n kube-system aws-load-balancer-controller -oyaml |grep "cluster-name"
获取部署中的集群名称。
如果不正确,请使用下一个命令编辑部署并重命名:
kubectl edit deployment -n kube-system aws-load-balancer-controller
如果将 aws-load-balancer-controller 从 v2.1 升级到 v2.2,请注意,您将收到相同的错误,因为需要新的 IAM 权限。有关这些新权限的详细信息/链接,请参阅版本中的变更日志:https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/tag/v2.2.0
指向 IAM 权限的显式链接:https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json
我遇到了同样的问题。我的设置是带有 Fargate 的 EKS,完全通过 Terraform 进行配置。我有所有正确的注释,但仍然收到错误
Failed build model due to couldn't auto-discover subnets: unable to discover at least one subnet
。最终,在尝试手动将子网设置为注释后,我收到了另一个错误,显示 Failed build model due to InvalidParameterValue: vpc-id
。然后我意识到我为 helm 参数 vpcId 设置了错误的值(我错误地使用了 arn,而不是 id,并且在使用 Fargate 时,您必须显式设置它,因为主机上没有可用的 EC2MetaData)。将其更改为 ID 解决了问题。
我在 AWS 控制台上手动创建的集群也遇到了同样的问题。
但后来我尝试使用
eksctl
创建集群,它创建了带有稍微不同标签的子网,即:
钥匙 | 价值 |
---|---|
姓名 | eksctl-集群名称-集群/SubnetPublicUSEAST1A |
aws:cloudformation:逻辑 ID | 子网公共USEAST1A |
kubernetes.io/role/elb | 1 |
aws:cloudformation:堆栈名称 | eksctl-集群名称-集群 |
alpha.eksctl.io/集群名称 | 集群名称 |
aws:cloudformation:堆栈 ID | 堆栈 ID |
alpha.eksctl.io/eksctl-版本 | 0.76.0 |
eksctl.cluster.k8s.io/v1alpha1/集群名称 | 集群名称 |
子网发现可能与其中一些相关,也可能与某些子网\IAM 等配置相关。
我建议尝试使用
eksctl
启动集群
我遇到了同样的问题,显然是由于
region
没有为 aws-load-balancer-controller 正确配置。
要验证是否为您的 VPC 正确配置了 aws-load-balancer-controller,您可以描述部署并检查容器参数。
例如:
kubectl get deploy -n kube-system aws-load-balancer-controller -o yaml
在 aws-region 或 vpc-id 的输出检查中,它可能配置错误。
containers:
- args:
- --cluster-name=demo
- --ingress-class=alb
- --aws-region=ap-south-1
- --aws-vpc-id=vpc-0eca84b28ae8c2d7a