发生什么 Azure Kubernetes (AKS)“超时”会断开集群中 Pod 进出的连接?

2023-11-24

我有一个工作集群,其中的服务全部响应在 Azure AKS 上运行的安装了 Ingress nGinx 的 helm 后面。这最终是 Azure 特定的。

我的问题是: 为什么我与此集群中的服务/Pod 的连接会定期被切断(显然是由于某种空闲超时),以及为什么该连接切断似乎也与我的 Az AKS Browse UI 连接被切断同时发生?

这是为了获得最终答案,了解到底是什么触发了导致本地“浏览”代理 UI 与我的集群断开连接的超时(更多关于我为什么要求遵循的背景信息)。

从 Az CLI 使用 Azure AKS 时,您可以使用以下命令从终端启动本地浏览 UI:

az aks browse --resource-group <resource-group> --name <cluster-name>

这工作正常并弹出一个浏览器窗口,看起来像这样(是的):

Azure AKS Disconnects Connections entering pods

在您的终端中,您将看到类似以下内容的内容:

  1. 代理运行于http://127.0.0.1:8001/按 CTRL+C 关闭隧道...
  2. 转发自 127.0.0.1:8001 -> 9090 转发自
  3. [::1]:8001 -> 9090 处理 8001 的连接 处理 8001 的连接 处理 8001 的连接

如果您将与集群的连接保持空闲几分钟(即您不与 UI 交互),您应该会看到以下打印内容,表明连接已超时:

E0605 13:39:51.940659 5704 portforward.go:178] 失去与 pod 的连接

我仍然不明白的一件事是,集群内的其他活动是否可以延长此超时,但无论如何,一旦您看到上面的内容,您基本上就处于与我相同的位置......这意味着我们可以讨论它看起来的事实就像我从该服务器中的 pod 发出的所有其他连接一样,也已被负责切断与 AKS 浏览 UI 联系的任何超时进程关闭。

那么问题出在哪里呢?

这对我来说是一个问题,因为我有一个运行 Ghost Blog pod 的服务,它使用名为“Knex”的 npm 包连接到远程 MySQL 数据库。碰巧,较新版本的 Knex 有一个错误(尚未解决),即如果 Knex 客户端和远程数据库服务器之间的连接被切断并且需要恢复,它不会重新连接,而是无限地连接负载。

nGinx 错误 503 网关超时

在我的情况下,导致 nGinx Ingress 给我错误 503 网关超时。这是因为在空闲超时切断 Knex 连接后 Ghost 没有响应,因为 Knex 无法正常工作并且无法正确恢复与服务器断开的连接。

Fine.我回滚了 Knex,一切都很好。

但到底为什么我的 pod 连接会从数据库断开呢?

因此,这个问题有望节省未来一些人尝试解决与 Kubernetes(可能是 Azure 特定的,也可能不是)相关的虚拟问题的时间,在服务/pod 空闲一段时间后切断连接。


简短回答:

当您添加新入口(nGinx / Traefik ...任何入口)时,Azure AKS 会自动部署 Azure 负载均衡器(具有公共 IP 地址) - 该负载均衡器的设置配置为“基本”Azure LB,具有 4 分钟的时间空闲连接超时。

该空闲超时既是标准的也是必需的(尽管您可以修改它,请参见此处:https://learn.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-idle-timeout)。话虽如此,对于从负载均衡器 IP 向外发送的任何流量,无法完全消除它 — 当前支持的最长持续时间是 30 分钟。

Azure 没有原生方法来避免空闲连接被切断。

因此,根据最初的问题,(我认为)处理此问题的最佳方法是将超时保留为 4 分钟(因为它无论如何都必须存在),然后设置您的基础设施以优雅的方式断开连接(空闲时)在达到负载均衡器超时之前。

我们的解决方案

对于我们的 Ghost 博客(它访问了 MySQL 数据库),我能够如上所述进行回滚,这使得 Ghost 进程能够处理数据库断开/重新连接的情况。

铁路怎么样?

是的。同样的问题。

对于一个单独的基于 Rails 的应用程序,我们还在 AKS 上运行,该应用程序连接到远程 Postgres DB(不在 Azure 上),我们最终实现了 PGbouncer(https://github.com/pgbouncer/pgbouncer)作为我们集群上的附加容器,通过此处找到的很棒的说明:https://github.com/edoburu/docker-pgbouncer/tree/master/examples/kubernetes/singleuser

一般来说,任何尝试从 AKS 访问远程数据库的人都可能需要实施中间连接池解决方案。池服务位于中间(我们的 PGbouncer)并跟踪连接空闲的时间,以便您的工作进程不需要关心它。

如果您开始接近负载均衡器超时,连接池服务将丢弃旧连接并创建一个新连接(重置计时器)。这样,当您的客户端通过管道发送数据时,它会按预期到达您的数据库服务器。

结束时

这是一个令人极其沮丧的错误/案例。我们花了至少 2 天的开发运营时间来找出第一个解决方案,但即使知道这可能是同一个问题,这次我们又花了 2 天的时间。

即使将计时器延长到超过 4 分钟默认值也无济于事,因为这只会使问题更难以解决。我想我只是希望任何从 Azure AKS / Kubernetes 连接到远程数据库时遇到问题的人都比我更擅长谷歌搜索,这样可以减轻自己的痛苦。

感谢 MSFT 支持(Kris,你是最棒的)对 LB 计时器的提示,以及将 PGbouncer 放在容器中的家伙,这样我就不必重新发明轮子了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发生什么 Azure Kubernetes (AKS)“超时”会断开集群中 Pod 进出的连接? 的相关文章

随机推荐

  • 构建具有离线功能的 ASP.Net Web 应用程序

    我正在构建一个 asp net 3 5 Web 应用程序 想知道您是否知道我可以通过什么方式来实现它 以便有一些离线功能 这是必要的 因为人们将能够在其设备上 安装 网络应用程序 例如 使用 iPhone 上的 添加到主屏幕 功能 然后在离
  • 移动浏览器是否通过 HTML5 音频标签发送 httpOnly cookie?

    我尝试通过 html5 音频标签播放一些 mp3 文件 对于桌面来说 这非常有效 使用 Chrome 但是当涉及到移动浏览器 还有 Chrome 适用于 Android 时 似乎存在一些困难 我用一些密码保护流 因此流服务器需要找到一个特殊
  • 检查cygwin中符号链接类型的差异

    我使用 winsymlinks native 和 cygwin 符号链接 具体取决于 Windows 是否需要并且可以跟踪链接 我想要一种 cygwin 的方式来查看它是什么类型的符号链接 因为它只看到符号链接 但 DOS 看到差异 我需要
  • Ruby:如何编写 bang 方法,例如地图?

    我想编写一些新的 Array 方法来更改调用对象 如下所示 a 1 2 3 4 a map e e 1 a 2 3 4 5 但我不知道如何做到这一点 我想我需要一个新大脑 所以 我想要这样的东西 class Array def stuff
  • 如何在 RethinkDB 中使用 getall 和 orderby

    我想列出两个时间戳之间 id 1 的记录 最后根据时间戳对它们进行排序 Mysql查询一些东西 Select from test where timestamp between 100099323 AND 1423699323 AND id
  • 如何将环境变量从 WSL 传递到 Windows 可执行文件

    从适用于 Linux v1 Alpine bash 终端的 Windows 子系统 我想设置一个传递到 Windows 可执行文件中的环境变量 有什么办法可以做到这一点吗 我希望打印 Hello World 的示例 windows 10 e
  • .net XML 序列化 - 存储引用而不是对象复制

    在 Net C 应用程序中 我有相互引用的数据结构 当我序列化它们时 Net 使用单独的对象副本序列化所有引用 在下面的示例中 我尝试序列化为 Person 数组 人 可能指另一个人 public class Person public s
  • 如何在加载 Magento 模型时添加“Order By”

    我正在尝试从 Magento 模型加载项目列表 我想要做的是按创建日期排列项目 以便我首先拥有最新的项目 有人知道我该怎么做吗 这是我到目前为止所拥有的 model Mage getModel testimonials testimonia
  • C# 中的_BitScanForward?

    我正在将用 C 编写的程序翻译为 C 并且遇到了一个无法解决的内部函数 在 C 中 这称为 unsigned char BitScanForward unsigned long Index unsigned long Mask 如果我只知道
  • MinGW/MSYS2 的非本地化版本?

    有没有办法用 gcc 下载未本地化的 MinGW MSYS2 如果系统语言不是英语 本地化 gcc 会导致 CodeBlocks 中的所有警告变成错误 此错误也在这里报告 http forums codeblocks org index p
  • WPF - 打印视觉效果时分页

    我有一个带框架的 WPF 窗口 我有一些代码可以使用 printdialog 和 printvisual 打印出框架的内容 但是 即使框架卷轴和其他部分可用 这也只会打印屏幕上显示的内容 有没有办法添加分页并确保打印框架的全部内容 或者还有
  • 如何在 Google App Engine 中实施防盗链

    我的应用程序位于 GAE 上 我正在尝试找出如何防止在 Python 中动态提供的图像 例如 image id E23432E 的热链接 请指教 在Google webapp框架中 您可以从请求类 def get self referer
  • 使用 Dataset API 生成平衡的小批量

    我对新数据集 API tensorflow 1 4rc1 有疑问 我有一个关于标签的不平衡数据集0 and 1 我的目标是在预处理过程中创建平衡的小批量 假设我有两个过滤后的数据集 ds pos dataset filter lambda
  • 可以在 PHP 中动态创建实例属性吗?

    有没有办法动态创建所有实例属性 例如 我希望能够在构造函数中生成所有属性 并且在类实例化后仍然能够访问它们 如下所示 object gt property 请注意 我想单独访问属性 而不是使用数组 这是我的一个例子don t want cl
  • 简单的正则表达式替换以保留原始字符串

    我有这个 Title Regex Replace Title s span style background none s span RegexOptions IgnoreCase Where s是一个像这样的词facebook 如果标题是
  • Symfony2 - 运行时动态 Doctrine 数据库连接

    我正在寻找一个很好的解决方案 利用 Doctrine 进行实体管理 在 Symfony 中动态连接数据库 我遇到的情况是 我们服务的所有入站用户都将访问 website com 地址 例如 client1 website com 我们希望为
  • 我们需要 而不使用 Bootstrap 吗?

    如果我们不使用 Bootstrap 我们还需要 in 我们的 HTML 页面 YES 与Bootstrap框架完全无关 应该在every网页 无论您使用什么框架 The viewport META tag allows device wid
  • 使用大量静态方法是一件坏事吗?

    当类不需要跟踪内部状态时 我倾向于将类中的所有方法声明为静态 例如 如果我需要将 A 转换为 B 并且不依赖于某些可能变化的内部状态 C 我会创建一个静态转换 如果我希望能够调整内部状态 C 那么我添加一个构造函数来设置 C 并且不使用静态
  • 旋转位图导致 outOfMemoryException

    我以这种方式旋转位图 单击每个按钮时图像都会旋转 90 度 Matrix matrix new Matrix matrix postRotate 90 rotated Bitmap createBitmap rotated 0 0 rota
  • 发生什么 Azure Kubernetes (AKS)“超时”会断开集群中 Pod 进出的连接?

    我有一个工作集群 其中的服务全部响应在 Azure AKS 上运行的安装了 Ingress nGinx 的 helm 后面 这最终是 Azure 特定的 我的问题是 为什么我与此集群中的服务 Pod 的连接会定期被切断 显然是由于某种空闲超