【问题标题】:Some requests fails during autoscaling in kubernetes在 kubernetes 中自动缩放期间某些请求失败
【发布时间】:2019-11-15 20:58:16
【问题描述】:

我在 microk8s 上建立了一个 k8s 集群,并将我的应用程序移植到它上面。我还添加了一个水平自动缩放器,它根据 cpu 负载添加 pod。自动缩放器工作正常,当负载超出目标时它会添加 pod,当我在一段时间后移除负载时,它会杀死 pod。

问题是我在同一时刻注意到自动缩放器正在创建新 pod,其中一些请求失败:

POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code :  502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code :  200
POST Response Code :  502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code :  502
java.io.IOException: Server returned HTTP response code: 502 for URL: http://10.203.101.61/gateway/compile
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200
POST Response Code :  200

我想知道这是什么原因以及如何解决?

更新: 我认为最好向您提供有关我的设置的更多信息:

流量来自集群外部,但 k8s 节点和生成请求的程序都在一台机器上,因此不存在网络问题。有一个自定义的 nginx 组件,它不做负载平衡,只是充当反向代理并将流量发送到相应的服务。

我进行了另一项测试,该测试为我提供了更多信息。我运行了相同的基准测试,但这次我没有将请求发送到反向代理 (nginx),而是使用该特定服务的 IP 地址,并且在自动缩放器完成其工作并启动多个 pod 时我没有失败的请求。不知道是Nginx还是k8s的问题?

【问题讨论】:

  • 您是否对您的部署进​​行了一些准备和活跃度探测?流量是内部流量还是通过入口来自外部网络?
  • 不,我没有活性探针。流量来自集群外部,但 k8s 节点和生成请求的程序都在一台机器上,因此不存在网络问题。有一个自定义的 nginx 组件不做负载平衡,只是充当反向代理并将流量发送到相应的服务。

标签: kubernetes autoscaling kubernetes-pod horizontal-scaling


【解决方案1】:

当新的 Pod 生成时,Kubernetes 会立即开始将流量重定向到它们。 但是,通常,pod 需要一些时间才能启动并开始运行(准备就绪)。

为防止这种情况发生,您可以为您的 pod 定义一个 Readiness Probe。 K8s 将定期调用您提供的就绪端点上的 pod,以确定该 pod 是否正常运行并准备好接受请求。 K8s 不会将流量重定向到 Pod,直到准备就绪端点根据 type of probe 返回成功结果(检查“Types of Probes”部分)。

【讨论】:

  • 同时感谢您的回答,我进行了另一项测试,提供了更多信息。我运行了相同的基准测试,但这次我没有将请求发送到反向代理 (nginx),而是使用了该特定服务的 IP 地址,并且在自动缩放器完成其工作并启动多个 pod 时我没有失败的请求。不知道是Nginx还是k8s的问题?
  • 我也遇到过类似的问题,请扩展您的 Core/kube DNS 部署。在 core/kube DNS 中每秒的 DNS 查询是有限制的,所以当一个新的 pod 启动时,它会给 DNS 服务器增加更多的负载,你会开始得到 502。
  • 我的问题与 k8s 无关,但正如@VictorVal 所说,这是 Nginx 的一个问题,我通过在我的部署中添加一个就绪探针来解决它。现在 Nginx 会在新创建的 Pod 准备就绪时向它们发送流量。
【解决方案2】:

关于您的问题:

不知道是Nginx还是k8s的问题?

根据 ingress-nginx 文档:

NGINX 入口控制器不使用服务来路由流量 到豆荚。相反,它使用 Endpoints API 来绕过 kube-proxy 允许 NGINX 功能,如会话亲和性和自定义 负载均衡算法。它还消除了一些开销,例如 iptables DNAT 的 conntrack 条目

所以我认为问题出在 Nginx 上,它没有利用所有 Kubernetes 功能(例如 kube-proxy),并且在 Pod 完全准备好之前向它们发送请求。
但是显然这个 problem 在 0.23.0(2019 年 2 月)中是 fixed,所以你应该检查你的版本。
就个人而言,在从 Ingress-Nginx 切换到 Ambassador 后,我遇到的问题更少,Ambassador 默认将请求转发到服务(因此 Kubernetes 负责负载平衡并将其发送到适当的 Pod)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2018-12-13
    • 2021-04-07
    • 2020-11-25
    相关资源
    最近更新 更多