EKS: kubectl exec不遵守streamingConnectionIdleTimeout

88次阅读
没有评论

问题描述

在使用EKS和Kubernetes 1.21时遇到了一个问题。他想要设置集群,使得无论执行的工作负载如何,kubectl exec在不活动时都会超时,并且不需要任何客户端配置。
他已经了解到了https://github.com/containerd/containerd/issues/5563,但是他们使用的是1.21版本的Docker运行时,而不是containerd。
他在启动模板中的kubelet上设置了streamingConnectionIdleTimeout: 3600s

cat /etc/kubernetes/kubelet/kubelet-config.json | jq '.streamingConnectionIdleTimeout = "3600s"' > /etc/kubernetes/kubelet/kubelet-config.json/etc/eks/bootstrap.sh {{CLUSTER_NAME}}

并通过curl -sSL "http://localhost:8001/api/v1/nodes/(node name)/proxy/configz"进行了确认。
然而,kubectl exec仍然没有超时。
他在客户端和节点上确认了/proc/sys/net/ipv4/tcp_keepalive_time = 7200,所以在Linux开始发送keepalive探测之前,我们应该会遇到流连接空闲超时。
通过阅读https://erkanerol.github.io/post/how-kubectl-exec-works/,他发现EKS托管的控制平面可能会保持连接活动。有些人在网上遇到了相反的问题-无论streamingConnectionIdleTimeout如何,他们的连接都会超时-他们通过调整k8s API服务器前面的负载均衡器的超时时间来解决这个问题。然而,在EKS托管的控制平面上,没有(我所知道的)可以调整的参数。
他希望能够得到关于这个问题的任何意见。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户的描述,可能是EKS托管的控制平面导致了连接保持活动状态。由于没有可调整的参数,我们可以尝试以下解决方案:
1. 在EKS集群中创建一个自定义的负载均衡器,用于代理到Kubernetes API服务器。
2. 在负载均衡器上设置适当的超时时间,以确保连接在一段时间后关闭。
以下是一个示例的解决方案:
1. 创建一个负载均衡器,例如使用AWS Elastic Load Balancer(ELB)。
2. 将负载均衡器配置为代理到Kubernetes API服务器。
3. 在负载均衡器上设置适当的超时时间,例如设置连接超时时间为3600秒。
请注意,这个解决方案可能需要一些额外的配置和管理工作,具体取决于你使用的负载均衡器和云平台。

方案2

如果方案1不适用于你的情况,请参考Kubernetes和EKS的官方文档,以获取更多关于kubectl exec的信息和可能的解决方案。
如果方案1不适用于你的情况,你可以参考Kubernetes和EKS的官方文档,以获取更多关于kubectl exec的信息和可能的解决方案。这些文档可能包含有关如何调整连接超时时间的信息,或者可能提供其他解决方案。
请注意,根据你的具体情况,可能需要进一步的研究和测试,以找到最适合你的解决方案。

总结

在使用EKS和Kubernetes 1.21时,用户遇到了kubectl exec不遵守streamingConnectionIdleTimeout的问题。我们提供了两个可能的解决方案,包括创建一个自定义的负载均衡器来代理到Kubernetes API服务器,并设置适当的超时时间。如果这些解决方案不适用于你的情况,请参考Kubernetes和EKS的官方文档,以获取更多关于kubectl exec的信息和可能的解决方案。请记住,在实施任何解决方案之前,确保做好备份并了解可能的风险。

正文完