Kubernetes GKE:502停止实例时

Kubernetes GKE:502停止实例时,kubernetes,google-cloud-platform,load-balancing,google-kubernetes-engine,Kubernetes,Google Cloud Platform,Load Balancing,Google Kubernetes Engine,我在GKE上的库伯内特斯入口有问题。我通过手动删除(通过GCP仪表板)来模拟可抢占实例的终止。我正在运行一个区域GKE集群(us-west1中的每个可用区中有一个VM) 在上选择delete几秒钟后,只有一个虚拟机开始通过负载平衡器接收502个错误。负载平衡器的Stackdriver日志将错误列为“连接到后端失败” 监控后端服务的运行状况显示被终止的后端从正常变为不正常,然后消失,而其他两个后端保持正常 几秒钟后,请求再次开始成功 我很困惑,为什么负载平衡器在一个节点停止时无法将流量定向到健康的

我在GKE上的库伯内特斯入口有问题。我通过手动删除(通过GCP仪表板)来模拟可抢占实例的终止。我正在运行一个区域GKE集群(us-west1中的每个可用区中有一个VM)

上选择delete几秒钟后,只有一个虚拟机开始通过负载平衡器接收502个错误。负载平衡器的Stackdriver日志将错误列为“连接到后端失败”

监控后端服务的运行状况显示被终止的后端从
正常
变为
不正常
,然后消失,而其他两个后端保持正常

几秒钟后,请求再次开始成功


我很困惑,为什么负载平衡器在一个节点停止时无法将流量定向到健康的节点——或者这可能是kubernetes问题?负载平衡器是否可以正确地将流量路由到一个健康的实例,但该实例上的kubernetes
节点端口
服务出于某种原因将请求代理回不健康的实例?

好吧,我想说,如果你从GCP控制台杀死一个节点,你就是从外到内杀死它。库贝莱意识到这一点需要时间。所以kube代理也不会立即更新服务端点和iptables

在此之前,入口控制器将继续向入口规则指定的服务发送数据包,并向不再存在的POD发送服务

这只是一种猜测。我可能错了。但从GCP文档来看,如果您使用的是可抢占虚拟机,那么您的应用程序应该是容错的

[额外]

<>所以,让我们考虑两个一般情况。在第一个命令中,我们将发送
kubectl delete pod
命令,而在第二个命令中,我们将突然杀死一个节点

  • 使用
    kubectl delete pod…
    你说的是api服务器,你想杀死一个pod。api服务器将调用kubelet杀死pod,它将在另一个节点上重新创建pod(如果需要)。kube代理将更新iptables,以便服务将请求转发到正确的pod
  • 如果你杀死了节点,那就是kubelet首先意识到出了问题,所以它会向api服务器报告。api服务器将在不同的节点上重新安排POD(始终)。其余的都一样
  • 我的观点是,api服务器从一开始就知道没有数据包可以发送到pod,而一旦kubelet意识到节点不健康,就会收到通知,这两者之间是有区别的

    如何解决这个问题?你不能。事实上,这应该是合乎逻辑的。你想让抢占式机器有同样的性能,价格比普通虚拟机便宜5倍?如果这是可能的,每个人都将使用这些虚拟机


    最后,谷歌再次建议,如果你的应用程序具有容错能力,就使用可抢占模式。

    谢谢你的建议,但不幸的是,我不认为是这样。具体来说,停止一个实例模拟抢占(停止或删除这两个实例都会给我带来相同的问题)。我也尝试过,在实例关闭时也导致了一些502错误。停止或删除计算机模拟抢占这一事实与我对某些数据包可能被丢弃的原因的解释有什么关系?我正在解释为什么GCP控制台没有“从外到内杀死它”而是模拟虚拟机在正常操作中所经历的相同抢占。无论哪种方式,您对如何解决问题并让kube proxy更快地更新服务端点有什么想法吗?如果这确实是问题所在的话?如果不从外到内杀死节点,那么什么是先发制人?我会详细说明我的答案。。。