【问题标题】:Keepalive for kubectl execkubectl exec 的 Keepalive
【发布时间】:2020-08-04 20:41:19
【问题描述】:

我在kubectl exec -it ... 会话中遇到了一个特殊问题。

它们会在 4-5 分钟后超时,具体取决于云提供商和一些模糊的调整,尽管我进行了搜索,但我无法弄清楚。这是一个已知问题,人们似乎不同意这是由于负载均衡器超时还是 kubelet 超时。

无论哪种方式,kubectlkubectl exec 上的选项都没有提供任何类型的保持活动或超时调整。

我用tcpdump 追踪了一些东西,我确实在 4-5 分钟后收到了RESET 数据包。

但是我也注意到它只在会话空闲时发生。如果我输入任何命令,4-5 分钟将被重置。

所以我正在寻找一种方法,可以每隔几分钟左右将 kubectl 会话中的 keepalive TCP/UDP 数据包轻松发送回调用计算机(然后我自己决定是否超时)。

我怎样才能做到这一点?

编辑:另一种询问方式是: - 如何找到打开kubectl exec 会话的计算机的IP/端口?

【问题讨论】:

  • this answer 能解决您的问题吗?
  • 不,不幸的是没有
  • 您在使用某种代理吗?您的集群位于何处?
  • 我使用了几个提供程序,但让我们从 Azure 开始。普通的 AKS 有这个问题。我不使用计算机上的代理。
  • 您使用了哪些其他云提供商并且遇到了同样的问题?

标签: linux bash kubectl keep-alive


【解决方案1】:

我尝试使用不同的配置和方法在 GCP 上重现您的问题,但我无法解决同样的问题。

遗憾的是,对此没有简单的答案。 Kubernetes 的许多实现依赖于主节点和节点之间的 SSH 隧道,因此隧道也可能超时,具体取决于它的配置方式。在 GKE 上,它在公共集群上有 ssh 隧道,并在私有集群上使用 VPC 对等,但其他安装可能有其他方法,因此没有简单的解决方案。

但是,作为一种解决方法,您可以让 ping 在后台运行以避免空闲。这样你就不会再超时了。

如果有帮助,请告诉我。

【讨论】:

  • 您能描述一下您想到的 ping 技术吗?
  • 我会选择thisthose 之一
  • 啊,是的,正在 ping 呼叫者。但是我怎样才能联系到来电者呢?
【解决方案2】:

如果您为 kubectl 服务选择 tcp 连接。 TCP 有一个保活机制。对于 Linux 工作站,默认保活时间为 7200 秒。

sysctl -a | grep keep
net.ipv4.tcp_keepalive_time = 7200

您可以在 /etc/sysctl.conf 和 'sysclt -p' 中将 keepalive 时间更改为 200s 以使其生效。

cat /etc/sysctl.conf | grep keep
net.ipv4.tcp_keepalive_time=200

注意:此更改是系统级别的,一旦更改,所有 tcp 连接都会受此影响

【讨论】:

  • 谢谢,但这在 sysctl 只读的 kubernetes pod 中不起作用
  • 其实我找到了用特权pod修改sysctl设置的方法,还是超时了。
【解决方案3】:

4-5分钟本质上是为集群提供高可用性的负载均衡器的超时设置。

我遇到了同样的问题(logs -fexec),我得出的结论是 kubectl 应该发送保持活动信号,以便负载均衡器不会因为它看起来空闲而终止连接。

所以我在 Kubernetes 端为此创建了这个功能请求: https://github.com/kubernetes/kubernetes/issues/94301

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多