在具有多个节点的 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的主要内容,如果未能解决你的问题,请参考以下文章