【问题标题】:'Unable to connect Net/http: TLS handshake timeout' — Why can't Kubectl connect to Azure Kubernetes server? (AKS)“无法连接 Net/http:TLS 握手超时”——为什么 Kubectl 无法连接到 Azure Kubernetes 服务器? (AKS)
【发布时间】:2018-11-16 12:02:11
【问题描述】:

我的问题(对 MS 和其他任何人)是:为什么会出现这个问题以及用户/客户自己而不是 Microsoft 支持可以实施哪些解决方法?

关于这个问题显然还有“一些”其他问题:

  1. Managed Azure Kubernetes connection error
  2. Can't contact our Azure-AKS kube - TLS handshake timeout
  3. Azure Kubernetes: TLS handshake timeout(这个有一些微软反馈)

多个 GitHub 问题发布到 AKS 存储库:

  1. https://github.com/Azure/AKS/issues/112
  2. https://github.com/Azure/AKS/issues/124
  3. https://github.com/Azure/AKS/issues/164
  4. https://github.com/Azure/AKS/issues/177
  5. https://github.com/Azure/AKS/issues/324

加上一些推特线程:

  1. https://twitter.com/ternel/status/955871839305261057

TL;DR

Skip to workarounds in Answers below.

当前的最佳解决方案是发布帮助票证 - 并等待 - 或重新创建 AKS 集群(可能不止一次,交叉手指,见下文......)但应该有更好的方法。 至少请允许 AKS 预览客户,无论支持级别如何,都可以针对此特定问题升级他们的支持请求严重性。

您也可以尝试扩展您的集群(假设这不会破坏您的应用程序)。

GitHub 怎么样?

上述许多 GitHub 问题已在解决后关闭,但问题仍然存在。以前有关于该问题的公告文档,但即使问题继续出现,目前也没有此类状态更新:

  1. https://github.com/Azure/AKS/tree/master/annoucements

我发布此消息是因为我有一些我在其他地方没有看到的新花絮,我想知道是否有人对解决此问题的其他潜在选择有想法。

受影响的虚拟机/节点资源使用情况

我在其他地方没有看到的第一部分是受上述 Kubectl“无法连接到服务器:net/http:TLS 握手超时”问题影响的节点/虚拟机/实例上的资源使用情况。

生产节点利用率

受影响集群上的节点如下所示:

利用率和网络 io 的下降与磁盘利用率的增加和我们开始遇到问题的时间段密切相关。

在此图表之前,过去 30 天的整体节点/VM 利用率基本持平,但与生产站点流量/更新推送等有关的一些波动。

问题缓解后的指标(添加事后分析)

至于上述几点,以下是同一节点在向上扩展然后缩减后的指标(这恰好缓解了我们的问题,但并不总是有效 - 请参阅底部的答案):

注意到 CPU 和网络中的“下降”吗? 这就是 Net/http: TLS 问题对我们产生影响的地方 - 当 AKS 服务器无法从 Kubectl 访问时.似乎除了没有响应我们的请求之外,它还没有与 VM / 节点对话。

我们一回来(将 # 个节点按比例放大,然后再缩小——请参阅解决方法的答案),指标(CPU 等)恢复正常——我们可以从 Kubectl 进行连接。这意味着我们可能会针对这种行为创建一个警报(我在 Azure DevOps 方面询问这个问题时遇到了问题:https://github.com/Azure/AKS/issues/416

节点大小可能会影响问题频率

Zimmergren 在 GitHub 上表示,与运行裸骨小节点相比,他在使用较大实例时遇到的问题更少。这对我来说很有意义,并且可能表明 AKS 服务器分配工作负载的方式(请参阅下一节)可能基于实例的大小。

"节点的大小(例如 D2、A4 等):) 例如,我体验过,在运行 A4 及更高版本时,我的集群比运行 A2 时更健康。 (不幸的是,我在大小组合和集群故障方面有十几个类似的经历)。”(https://github.com/Azure/AKS/issues/268#issuecomment-375715435

其他集群大小影响参考:

  1. giorgited (https://github.com/Azure/AKS/issues/268#issuecomment-376390692)

负责更小集群的 AKS 服务器可能会更频繁地受到攻击?

在一个 Az 区域中存在多个 AKS 管理“服务器”

我在其他地方没有看到的下一个事实是,您可以在同一个区域中并排运行多个集群,其中一个集群(在这种情况下为我们的生产)受到 'net/http: TLS 的影响握手超时',另一个工作正常,可以通过 Kubectl 正常连接(对我们来说,这是我们相同的暂存环境)。

用户(上面的 Zimmergren 等)似乎认为节点大小会影响此问题影响您的可能性,这一事实似乎也表明节点大小可能与子区域责任分配给子的方式有关-区域 AKS 管理服务器。

这可能意味着重新创建具有不同集群大小的集群更有可能将您置于不同的管理服务器上 — 缓解问题并降低需要多次重新创建的可能性。

暂存集群利用率

我们的两个 AKS 集群都位于美国东部。作为上述“生产”集群指标的参考,我们的“暂存”集群(也包括美国东部)资源利用率没有 CPU / 网络 IO 的大幅下降——并且同期磁盘等也没有增加:

相同的环境受到不同的影响

我们的两个集群都运行相同的入口、服务、pod、容器,因此用户所做的任何事情也不太可能导致此问题突然出现。

重建有时会成功

上述多个 AKS 管理服务器子区域职责的存在与其他用户在 github (https://github.com/Azure/AKS/issues/112) 上描述的行为是有道理的,其中一些用户能够重新创建集群(然后可以联系),而其他人重新创建并仍然有问题。

紧急情况可能 = 多次再创造

在紧急情况下(即您的生产站点......像我们的......需要管理)您可以可能重新创建,直到您获得工作集群碰巧落在不同的 AKS 管理服务器实例(不受影响的实例)上,但请注意,这可能不会在您第一次尝试时发生 - AKS 集群重新创建并不是即时的。

也就是说……

受影响节点上的资源继续发挥作用

我们受影响的虚拟机上的所有容器/入口/资源似乎都运行良好,我没有任何关于正常运行时间/资源监控的警报(除了上面图表中列出的利用率异常)

我想知道为什么会出现这个问题,以及用户自己可以解决哪些问题,而不是由 Microsoft 支持(目前有票)。如果您有任何想法,请告诉我。

原因的潜在提示

  1. https://github.com/Azure/AKS/issues/164#issuecomment-363613110
  2. https://github.com/Azure/AKS/issues/164#issuecomment-365389154

为什么没有 GKE?

我了解 Azure AKS 处于预览阶段,并且很多人因为这个问题而迁移到 GKE ()。也就是说,到目前为止,我的 Azure 体验一直是积极的,如果可能的话,我更愿意提供解决方案。

还有……GKE 偶尔也会遇到类似的情况:

  1. TLS handshake timeout with kubernetes in GKE

我很想看看在 GKE 上扩展节点是否也解决了那里的问题。

【问题讨论】:

  • 每次从 Azure VM 到 Azure Kubernetes 集群的 kubctl 执行都会发生在我身上。

标签: azure azure-aks


【解决方案1】:

解决方法 1(可能不适用于所有人)

一个有趣的解决方案(对我有用)是增加集群中的节点数量,然后再减少...

  1. 登录到 Azure 控制台 - Kubernetes 服务刀片。
  2. 将您的集群扩大 1 个节点。
  3. 等待规模完成并尝试连接(您应该可以)。
  4. 将您的集群缩回到正常大小以避免成本增加。

您也可以(也许)从命令行执行此操作:

az aks scale --name <name-of-cluster> --node-count <new-number-of-nodes> --resource-group <name-of-cluster-resource-group>

由于这是一个挑剔的问题,而且我使用了网络界面,我不确定上述是否相同或是否可行。

我花了大约 2 分钟的总时间 — 对于我的情况来说,这比重新创建/配置集群(可能多次...)要好得多。

据说....

Zimmergren 提出了一些优点,即缩放不是真正的解决方案:

“它有时会起作用,集群在扩展后的一段时间内会自我修复。有时会失败并出现相同的错误。我不考虑扩展解决此问题的方法,因为这会导致其他挑战,具体取决于设置方式向上。我不会相信 GA 工作负载的例程,这是肯定的。在当前的预览中,它有点狂野的西部(和预期的),我很高兴在这个时候炸毁集群并创建一个新的连续失败。” (https://github.com/Azure/AKS/issues/268#issuecomment-395299308)

Azure 支持反馈

由于我在遇到上述扩展解决方案时打开了支持票证,因此我能够获得关于上述解决方案可能起作用的反馈(或者更确切地说是猜测),以下是一个意译的回复:

“我知道,如果您进入“az aks show”和“kubectl get nodes”之间的节点数量不匹配的状态,扩展集群有时会有所帮助。这可能是相似的。”

解决方法参考:

  1. GitHub 用户从控制台缩放节点并修复问题:https://github.com/Azure/AKS/issues/268#issuecomment-375722317

解决方法无效?

如果这对您不起作用,请在下方发表评论,因为我将尝试更新问题出现的频率、问题是否自行解决以及此解决方案是否适用于 Azure AKS用户(看起来它并不适合所有人)。

向上/向下扩展的用户不适用于:

  1. omgsarge (https://github.com/Azure/AKS/issues/112#issuecomment-395231681)
  2. 齐默格伦 (https://github.com/Azure/AKS/issues/268#issuecomment-395299308)
  3. sercand — 扩展操作本身失败 — 不确定它是否会影响连接性 (https://github.com/Azure/AKS/issues/268#issuecomment-395301296)

放大/缩小 DID 适用于:

  1. Lo​​hithChanda (https://github.com/Azure/AKS/issues/268#issuecomment-395207716)
  2. 齐默格伦 (https://github.com/Azure/AKS/issues/268#issuecomment-395299308)

向 Azure AKS 特定支持发送电子邮件

如果在所有诊断后您仍然遇到此问题,请随时发送电子邮件至 aks-help@service.microsoft.com

【讨论】:

【解决方案2】:

解决方法 2 重新创建集群(有些明显)

我添加这个是因为有一些细节需要牢记,即使我在最初的问题中提到了它,那件事也很长,所以我在这里添加关于重新创建的具体细节。

集群重建并不总是有效

根据我最初的问题中的上述内容,有多个 AKS 服务器实例划分给定 Azure 区域的职责(我们认为)。其中一些或全部可能会受到此错误的影响,导致您的集群无法通过 Kubectl 访问。

这意味着,如果您重新创建集群,并且它以某种方式登陆同一个 AKS 服务器,那么新集群可能无法访问,需要...

其他重新创建尝试

可能多次重新创建将导致您最终将新集群登陆到其他 AKS 服务器之一(工作正常)。 据我所知,我没有看到任何迹象表明所有 AKS 服务器偶尔都会遇到此问题(如果有的话)。

不同的集群节点大小

如果您处于紧要关头并希望您的重新创建在不同的 AKS 管理服务器上的可能性最高(我们尚未确认) - 当您选择不同的节点大小时创建您的新集群(请参阅上面初始问题的节点大小部分)。

我已打开此票证,询问 Azure DevOps 节点大小是否与决定哪些集群由哪些 AKS 管理服务器管理实际相关:https://github.com/Azure/AKS/issues/416

支持工单修复与自我修复

由于有很多用户表示问题偶尔会自行解决然后消失,我认为有理由猜测支持实际上修复了有问题的 AKS 服务器(这可能导致其他用户修复了他们的集群 - 'Self Heal')而不是修复单个用户的集群。

创建支持票

对我而言,上述内容可能意味着创建票证可能是一件好事,因为它可以修复遇到相同问题的其他用户集群 — 这也可能是允许针对此特定问题升级支持问题严重性的一个论据。

我认为这也是一个不错的指标,表明 Azure 支持人员可能还没有想出如何对问题进行全面警报,在这种情况下,创建支持票证也可以达到此目的。

我还向 Azure DevOps 询问了他们是否就该问题发出警报(根据我的经验,根据 CPU 和网络 IO 指标变化轻松可视化问题):https://github.com/Azure/AKS/issues/416

如果不是(没有收到回复),那么即使您计划重新创建集群,创建票证也是有意义的,因为该票证将使 Azure DevOps 意识到由此产生的问题为该集群管理服务器上的其他用户修复。

使集群重新创建更容易的事情

我将对此进行补充(感谢您的反馈/想法),但不是我的想法:

  1. 谨慎(清楚)如何存储用于创建集群的所有 YAML 文件(即使您不经常为您的应用重新部署设计)。
  2. 为您的 DNS 修改编写脚本,以加快指向新实例的速度 — 如果您有一个使用 DNS 的面向公众的应用程序/服务(可能类似于 Google Domains 的这个示例?:https://gist.github.com/cyrusboadway/5a7b715665f33c237996,完整文档在这里:@ 987654324@)

【讨论】:

    【解决方案3】:

    添加另一个答案,因为当上述尝试不起作用时,这现在是 Azure 支持官方解决方案。我已经有一段时间没有遇到这个问题了,所以我无法验证这个问题,但它对我来说似乎很有意义(基于以前的经验)。

    在此处找到此/完整主题的信用(https://github.com/Azure/AKS/issues/14#issuecomment-424828690

    检查隧道问题

    1. ssh 到运行 tunnelfront pod 的代理节点
    2. 获取隧道前端日志:“docker ps”->“docker logs”
    3. “nslookup”的fqdn可以从上面的命令中得到->如果解析了ip,说明dns可以工作,那么继续下一步
    4. "ssh -vv azureuser@ -p 9000" ->如果端口工作正常,则进行下一步
    5. “docker exec -it /bin/bash”,输入“ping google.com”,如果没有响应,说明tunnel front pod没有外网,请执行以下步骤
    6. 重启kube-proxy,使用“kubectl delete po -n kube-system”,选择与tunnelfront在同一节点上运行的kube-proxy。客户可以使用“kubectl get po -n kube-system -o wide”

    我觉得这种特殊的解决方法可能可以自动化(当然在 Azure 方面,但可能在社区方面)。

    向 Azure AKS 特定支持发送电子邮件

    如果在所有诊断后您仍然遇到此问题,请随时发送电子邮件至 aks-help@service.microsoft.com

    【讨论】:

      【解决方案4】:

      我们的一个集群刚刚遇到了这个问题。发送了支持票,5 分钟后工程师回电询问他们是否可以重新启动 API 服务器。 2分钟后,它又开始工作了。

      原因是他们的消息队列超时。

      【讨论】:

        猜你喜欢
        • 2020-05-14
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        • 2020-08-26
        • 2017-09-08
        • 2013-02-12
        • 2019-06-26
        • 2022-01-13
        相关资源
        最近更新 更多