如何以对GKE Kubernetes主中断具有弹性的方式使用Python Kubernetes客户端?

如何以对GKE Kubernetes主中断具有弹性的方式使用Python Kubernetes客户端?,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我们有时使用Python脚本来启动和监视运行在Google Kubernetes引擎上的Kubernetes吊舱,使用。我们还可以在几个节点池上实现自动伸缩 根据“主虚拟机自动扩展、升级、备份和保护”。这篇文章似乎还表明,当节点数从0-5增加到6+时,控制平面/主虚拟机会自动伸缩,并且可能在其他时间添加更多节点时 当许多节点被启动时,控制平面似乎可以在这样的时间下降。当这种情况发生时,我们通过控制平面监控POD的Python脚本经常崩溃,似乎无法找到KubeApi/控制平面端点,从而触发以下一些

我们有时使用Python脚本来启动和监视运行在Google Kubernetes引擎上的Kubernetes吊舱,使用。我们还可以在几个节点池上实现自动伸缩

根据“主虚拟机自动扩展、升级、备份和保护”。这篇文章似乎还表明,当节点数从0-5增加到6+时,控制平面/主虚拟机会自动伸缩,并且可能在其他时间添加更多节点时

当许多节点被启动时,控制平面似乎可以在这样的时间下降。当这种情况发生时,我们通过控制平面监控POD的Python脚本经常崩溃,似乎无法找到KubeApi/控制平面端点,从而触发以下一些异常:

ApiException、urllib3.exceptions.NewConnectionError、urllib3.exceptions.MaxRetryError

处理这种情况的最好方法是什么?自动缩放事件是否有任何可能有用的属性

为了澄清我们对Python客户机所做的工作,我们在一个循环中每隔几分钟读取一次感兴趣的pod的状态,并捕获类似的异常(此外,我们还尝试捕获底层urllib调用的异常)。我们还添加了指数后退重试,但在指定的最大重试次数后,即使重试次数很高(例如,继续重试>5分钟),也无法恢复并失败


我们没有尝试过的一件事是在每次重试时重新创建
kubernetes.client.CoreV1Api
对象。这会有很大的不同吗?

当一个nodepool大小发生变化时,根据大小的不同,这会导致主节点大小的变化。这是你的电话号码。如果节点池大小需要较大的主节点,则会在GCP上启动主节点的自动缩放。在此过程中,主机大约1-5分钟不可用。请注意,这些活动在中不可用

此时,所有对主机的API调用都将失败,包括来自Python API客户端和kubectl的调用。但是,1-5分钟后,主机应可用,客户和kubectl的电话应能正常工作。我可以通过将集群从3个节点扩展到20个节点来测试这一点,主节点在1-5分钟内不可用。 我从Python API客户端获得了以下错误:

Max retries exceeded with url: /api/v1/pods?watch=False (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at>: Failed to establish a new connection: [Errno 111] Connection refused',)) 
1-5分钟后,主机可用,呼叫成功。无需重新创建kubernetes.client.CoreV1Api对象,因为这只是一个API端点


根据您的描述,您的主机在5分钟后无法访问,这表明您的主机或Python脚本的设置存在潜在问题。要在Python脚本运行时进一步解决此问题,可以通过运行任何kubectl命令来检查master的可用性

在GKE上,具有1-5个节点的集群运行在与6个以上节点的集群不同的基础设施上。(也就是说,控制平面和etcd以不同的方式调度,并可能使用不同版本的管理软件运行;将此视为登台)。这意味着,正如您所注意到的,过渡需要一些时间,大约1-5分钟。我建议您不要以自动缩放可以在5节点边界上来回移动的方式创建集群。要么呆在下面,要么往上面走。
“Unable to connect to the server: dial tcp”