Kubernetes 间 pod 端口耗尽
Kubernetes inter-pod port exhaustion
我有一个包含 3 个容器的 pod。
- .Net 核心 REST 微服务
- .Net核心反向代理
- Istio 代理
流量进入反向代理,经过验证,然后代理到微服务。这是我使用最频繁的服务,它在 运行 大约一天后开始出现此错误。
System.Net.Http.HttpRequestException: Cannot assign requested address
---> System.Net.Sockets.SocketException (99): Cannot assign requested address
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
重启 pod 是我目前唯一的解决办法。我一直在查看节点上的 tcp 统计信息,但是这没有意义,因为杀死 pod 并重新启动会使问题消失。
我也使用最佳实践在 .net core 中使用 httpclient,没有改变。
如有任何想法,我们将不胜感激。
进一步收集线索后,我了解到这些错误仅在我们的 REST 微服务重启时出现(由于内存泄漏)。该错误在上下文中是有意义的,我高估了问题的严重性。
我有一个包含 3 个容器的 pod。
- .Net 核心 REST 微服务
- .Net核心反向代理
- Istio 代理
流量进入反向代理,经过验证,然后代理到微服务。这是我使用最频繁的服务,它在 运行 大约一天后开始出现此错误。
System.Net.Http.HttpRequestException: Cannot assign requested address
---> System.Net.Sockets.SocketException (99): Cannot assign requested address
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
重启 pod 是我目前唯一的解决办法。我一直在查看节点上的 tcp 统计信息,但是这没有意义,因为杀死 pod 并重新启动会使问题消失。
我也使用最佳实践在 .net core 中使用 httpclient,没有改变。
如有任何想法,我们将不胜感激。
进一步收集线索后,我了解到这些错误仅在我们的 REST 微服务重启时出现(由于内存泄漏)。该错误在上下文中是有意义的,我高估了问题的严重性。