在具有多个节点的 EKS 集群中部署 Ingress Nginx 控制器 ELB

Posted

技术标签:

【中文标题】在具有多个节点的 EKS 集群中部署 Ingress Nginx 控制器 ELB【英文标题】:Deploying Ingress Nginx Controller ELB in EKS Cluster with multiple nodes 【发布时间】:2021-06-13 07:47:27 【问题描述】:

我目前正在尝试在我的 AWS eks 集群上部署 nginx 入口控制器。 我有 4 个节点正在运行:

NAME                            STATUS   ROLES    AGE     VERSION
ip-10-230-35-48.ec2.internal    Ready    <none>   7h44m   v1.19.6-eks-49a6c0
ip-10-230-39-9.ec2.internal     Ready    <none>   7h42m   v1.19.6-eks-49a6c0
ip-10-230-42-241.ec2.internal   Ready    <none>   7h49m   v1.19.6-eks-49a6c0
ip-10-230-49-228.ec2.internal   Ready    <none>   7h46m   v1.19.6-eks-49a6c0

我正在使用NGINX Ingress Controller Installation guide 部署我的ingress-nginx-controller 并使用deploy-tls-termination.yaml

由于某些原因,AWS ELB 并未将所有节点都标记为健康并给出以下错误:

Instance has failed at least the UnhealthyThreshold number of health checks consecutively.

唯一标记为健康的节点是部署ingress-nginx-controller 的节点。

我的 yaml 配置文件中是否缺少某些内容?或者我应该为每个Availibity Zone 部署一个ingress-nginx-controller?如果有,怎么做?

谢谢

【问题讨论】:

【参考方案1】:

这是在服务中将externalTrafficPolicy 设置为Local 时的预期行为(这就是您所拥有的)。使用 externalTrafficPolicy: Local ,您不会获得任何额外的跃点 - 一旦流量到达节点,它就不会离开节点。 负载均衡器只会将流量发送到运行 Ingress Controller pod 的节点。在其他节点上,健康检查将返回 503 并被视为不健康。

如果您希望所有节点都健康,请将 externalTrafficPolicy 更改为 Cluster

通常不建议这样做,因为这样做客户端的 IP 地址不会传播到最终 Pod。但这仅适用于 NLB,而不适用于 Classic Elastic Load Balancer。因此,最好将 NLB 与 nginx 入口控制器一起使用。如果您仍然希望所有节点都健康,请坚持使用本地策略并使用守护程序集。

官方documentation围绕这个。

【讨论】:

这个或任何其他解决方案对您有用吗?请务必提及,以便对其他人有所帮助。【参考方案2】:

实际上是根据入口控制器和ELB的实现。 ELB 是唯一识别运行入口控制器 pod 的节点。其余节点为 OutOfService。如果 ingress-controller pod 将被移除到另一个节点,则 ELB 将此节点识别为 InService 实例。您可以通过删除控制器 pod 来尝试此操作。

建议使用带有入口控制器的 NLB 或 ALB 负载均衡器。 从 k8s 的 1.18 版本开始,NLB 将默认用于入口负载均衡器。 试试这个tutorial 更改负载均衡器类型。

【讨论】:

以上是关于在具有多个节点的 EKS 集群中部署 Ingress Nginx 控制器 ELB的主要内容,如果未能解决你的问题,请参考以下文章

EKS:在特定 AWS 自动缩放组上运行特定服务(pod)

EKS中的UDP负载平衡替代方案

AWS EKS Cluster Autoscaler - 缩减策略

Terraform EKS 标记

EKS:kubernetes 集群中的不健康节点

Terraform EKS 配置图被禁止