语境
我正在尝试将容器化的 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: Service
,spec: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 集群中的所有权限。