EKS ALB 无法自动发现子网

问题描述 投票:0回答:7

背景

  • 我有一个

    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

以下是 3 个子网上设置的标签:

这是子网的路由表,您可以看到它们附加了互联网网关:

我到处搜索,他们都在谈论添加标签,我从头开始创建了一个全新的集群,但仍然遇到这个问题,还有其他我遗漏的东西吗?

我检查了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

amazon-web-services amazon-eks aws-application-load-balancer
7个回答
47
投票

就我而言,这是因为我没有使用正确的资源标签来标记 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/


46
投票

确保 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


5
投票

如果将 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


3
投票

您还可以显式定义您的特定子网:

alb.ingress.kubernetes.io/subnets: subnet-xxx,subnet-yyyy

尽管仍然建议启用自动发现


3
投票

我遇到了同样的问题。我的设置是带有 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 解决了问题。


0
投票

我在 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

启动集群

0
投票

我遇到了同样的问题,显然是由于

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
© www.soinside.com 2019 - 2024. All rights reserved.