首页 > 解决方案 > Kubernetes pod 网络挂了

问题描述

我在 Google Cloud(版本 1.13.7-gke.24)上运行 Kubernetes 集群。相同的代码在机器上运行了3个多月没有任何问题。今天我发现其中一个 Pod 与网络断开连接超过 24 小时。

首先,我检查了 pod 是否有互联网连接,通常它有。我曾经curl查询过一些知名的互联网网站——所有这些网站都遥不可及。当我尝试运行apt-get update或时发生了同样的事情apt-get upgrade

其次,我检查了我的应用程序的日志,我发现了这样的异常:

Unable to log to provider GoogleStackdriverLogProvider, ex: Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed")
   at Google.Api.Gax.Grpc.ApiCallRetryExtensions.<>c__DisplayClass0_0`2.<<WithRetry>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at ***.LogService.Providers.GoogleStackdriverLogProvider.WriteAsync(IEnumerable`1 entries) in LogService/Providers/GoogleStackdriverLogProvider.cs:line 71

这些日志来自我运行的将新日志发送到 Google Stackdriver 的代码。请注意,那些日志存储在同一个数据中心 - 无需互联网将它们发送出去,应用程序仍然无法到达目的地。

最后,这是一个奇怪的问题,与队列系统的连接一直在运行。不幸的是,应用程序继续从队列中下载新消息,但由于网络连接,所有消息都以失败告终。

概括:

Internet connectivity - NO
VPC connectivity - YES
GCP services connectivity - YES

其他注意事项:

怎么做才能进一步防止这个问题?

标签: kubernetesgoogle-cloud-platformgoogle-kubernetes-engine

解决方案


这听起来像是一个暂时性问题,可能是由于为 pod 创建的虚拟接口出现故障。这些类型的故障很少见且难以预防。但是,您可以使用livenessProbes构建更具弹性的部署,这样这种类型的错误将导致容器失败并重新创建。

不幸的是,如果重新启动容器还不够,pod 将进入 crashLoopBackOff 状态。如果 pod 确实进入此状态以触发 pod 删除,您可以设置警报通知您。

虽然可能无法阻止,但您可以自动恢复


推荐阅读