为 EKS Fargate API 服务部署 AWS 负载均衡器控制器

为 EKS Fargate API 服务部署 AWS 负载均衡器控制器

语境

我正在尝试将容器化的 API 服务部署到 EKS Fargate 集群,并让其为来自外部互联网地址的请求提供服务,这是一种过度设计的 POC/学习体验。在了解如何将网络流量引导至 Fargate 服务时,我遇到了问题。我对该项目的主要指导是这两个教程:

但在决定是否尝试设置 API 网关、应用程序负载均衡器、ALB 入口控制器或使用 AWS 负载均衡器控制器时,我的经验不足就显露出来了,我目前最深入的尝试是使用后者。我使用 Terraform 和“.yaml”文件与 kubectl 一起使用,使大多数基础设施和 EKS/Fargate 组件正常工作。

设置

我使用单个 Terraform 配置进行了以下部署,并且已成功部署:

  • 具有私有子网和公共子网且启用了 nat 和 vpn 网关的 VPC
  • 具有 coredns、kube-proxy、vpc-cni 和单个 fargate 配置文件的 EKS 集群,该配置文件选择我的应用程序命名空间并将节点分配给 VPC 的私有子网。

我有以下“.yaml”配置,它们在不同的方法尝试之间是一致的:

  • 命名空间.yaml( kind: Namespace)
  • 部署.yaml(kind: Deployment
  • 部署_secret.yaml(kind: Secret
  • 服务.yaml(kind: Servicespec:type: NodePort

我很高兴发布这些文件的详细信息,但这篇文章已经很长了。

问题

我将详细介绍如何尝试让 AWS 负载均衡器控制器工作,因为这是 EKS Workshop 教程中使用的控制器,但如果我一定要使用其他方法之一,请告诉我。我还应该先说明一下,这些问题发生在我自己的应用程序和示例应用程序中,没有任何变化。

在我使用 Terraform 部署基础设施并成功设置并安装 AWS LB 控制器我使用 kubectl 创建部署和服务。当我尝试创建 Ingress 对象时,问题就开始了,提供的配置如下所示:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  namespace: my-namespace
  name: ingress-myapp
  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-myapp
              servicePort: 80

这将返回一个错误error: error validating "ingress.yaml":,说,我省略了细节,因为这是在这个问题导致这个拉取请求。我已重新配置该文件以遵循更改后的配置定义,现在看起来像这样:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: my-namesace
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  defaultBackend:
    service:
      name: service-myapp
      port:
        number: 80
  rules:
    - http:
        paths:
          - path: /*
            backend:
              service:
                name: service-myapp
                port:
                  number: 80
            pathType: ImplementationSpecific

这会导致错误:

Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "vingress.elbv2.k8s.aws": Post "https://aws-load-balancer-webhook-service.kube-system.svc:443/validate-networking-v1-ingress?timeout=10s": context deadline exceeded

我跟着这个帖子描述了类似的问题,所以我确保我对 LBC 的所有引用都使用 2.4.0,但对问题没有影响。我还研究了这两个帖子(GitHub 问题Reddit 主题),但我很难理解这些情况下的解决方案是什么。

我的推断是,在验证新的入口对象/配置时,进程的某些部分无法到达外部地址,但我不确定哪个组件正在尝试发出该请求,以及是权限问题还是网络问题阻止了它。任何指导或提示都非常感谢!

答案1

您需要为端口 443 及其所连接的 pod 端口创建一个 AWS 安全组。(443 -> xx?)

然后将此规则添加到集群中的节点。您的请求超时,因为 AWS 删除了跨节点的 EKS 集群中的所有权限。

相关内容