在 AWS EKS 上扩展 pod 时出现 502 ALB 错误

Posted

技术标签:

【中文标题】在 AWS EKS 上扩展 pod 时出现 502 ALB 错误【英文标题】:502 ALB errors when scaling pods on AWS EKS 【发布时间】:2021-11-03 12:46:38 【问题描述】:

我的 Kubernetes 部署应用程序有 HPA 和 cluster autoscaler。 扩展对 Pod 和节点都适用,但在生产负载高峰期间,我看到 ALB (aws-load-balancer-controller) 出现很多 502 错误。

似乎我已经启用了一切以实现零停机部署/扩展:

pod 就绪探测已到位
       readinessProbe:
         httpGet:
           path: /_healthcheck/
           port: 80
吊舱准备门is enabled 入口注解使用ip目标类型
alb.ingress.kubernetes.io/target-type: ip
在入口资源上指定了健康检查参数
alb.ingress.kubernetes.io/healthcheck-path: "/healthcheck/"
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "10"

但这无济于事。

如何正确调试此类问题以及我应该调整哪些其他参数以完全消除负载均衡器的 5xx 错误?

【问题讨论】:

你解决了这个问题吗? @Kay 不完全,但我已经通过添加一些额外的配置技巧来减少 502 错误的数量,如下面的回答中所述。 np 我解决了我的问题,这与我的应用服务器和 alb 之间的保持活动值有关 【参考方案1】:

这是我添加到配置中的一些额外内容以及上述内容的列表

容器preStophook
lifecycle:
  preStop:
    exec:
      command: ["/bin/sleep", "30"]

termination grace period 在 pod terminationGracePeriodSeconds: 40 上(从上面的睡眠时间 + 10-15 秒)

通过设置调整目标组的注销延迟值

alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30

这个注解在入口资源上。通常,该值应与您在后端网络服务器上的超时相匹配(我们不希望目标超过完成最长请求所需的时间)。

此调整背后的主要思想是确保 Pod 状态的更改有足够的时间传播到底层 AWS 资源,因此流量不再从 ALB 路由到目标组内的 pod已经被 k8s 标记为终止/不健康。

附:确保始终有足够的 pod 来处理传入的请求(这对于同步工作人员在进行滚动重新部署时尤其重要)。 Consider maxUnavailable 的值较低,maxSurge 的值较高,以防您的集群/工作节点有能力分配这些额外的 Pod。因此,如果您的 pod 平均处理 100 个请求/分钟,那么您的负载为 400 个请求/分钟,请确保 num of replicas - maxUnavailable > 4(每个 pod 的总请求数/请求数)

【讨论】:

以上是关于在 AWS EKS 上扩展 pod 时出现 502 ALB 错误的主要内容,如果未能解决你的问题,请参考以下文章

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

AWS EKS Horizontal Pod Autoscaler(HPA)

在弹性豆茎上创建环境时出现 502

AWS EKS Cluster Autoscaler - 缩减策略

AWS 中的 Kubernetes 自动缩放

使用 AWS Elastic Beanstalk 部署 Django 应用程序时出现 502 Bad Gateway nginx/1.20.0 错误