EKS ALB 无法自动发现子网

Sab*_*lad 14 amazon-web-services amazon-eks aws-application-load-balancer

背景

  • 我有VPC3 个公共subnets(子网可以访问 Internet 网关)

  • 我在这个 VPC 中有一个 EKS 集群,EKS 集群是从控制台创建的,没有使用 eksctl

  • 我使用了官方 aws 文档中的教程,我设法设置了我的 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
Run Code Online (Sandbox Code Playgroud)

我使用了他们的游戏示例,这是清单文件:

---
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
Run Code Online (Sandbox Code Playgroud)

但是,当我描述入口时:我收到以下消息

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

Run Code Online (Sandbox Code Playgroud)

以下是在 3 个子网上设置的标签: 在此处输入图片说明

这里是子网的路由表,你可以看到它们附加了一个 Internet 网关: 在此处输入图片说明

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

我检查了这个答案,但它不相关,因为它用于 ELB 而不是 ALB,

================================

更新:

我明确添加了子网:

alb.ingress.kubernetes.io/subnets: subnet-xxxxxx, subnet-xxxxx, subnet-xxx
Run Code Online (Sandbox Code Playgroud)

现在我得到了我的外部 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
Run Code Online (Sandbox Code Playgroud)

还要转到浏览器并使用外部 ip 返回: 503 Service Temporarily Unavailable

Tlm*_*aK0 18

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

  • 我们都犯过同样的错误:) (3认同)
  • 这个答案拯救了我的一天 (2认同)

And*_*rew 10

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


Gow*_*iem 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