首页 > 解决方案 > 如何解决为什么我的服务中的端点没有更新?

问题描述

我有一个在 Google Kubernetes Engine 上运行的 Kubernetes 集群。

我有一个部署,我手动(通过编辑hpa对象)从 100 个副本扩展到 300 个副本以进行一些负载测试。当我通过向服务发送 HTTP 请求对部署进行负载测试时,似乎并非所有 pod 都获得了相同数量的流量,只有大约 100 个 pod 显示它们正在处理流量(通过查看它们的 CPU 负载和我们的自定义指标)。所以我怀疑该服务没有对​​所有 pod 之间的请求进行负载均衡。

如果我检查deployment,我可以看到所有 300 个副本都准备好了。

$ k get deploy my-app --show-labels
NAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       LABELS
my-app              300       300       300          300         21d       app=my-app

另一方面,当我检查 时service,我看到了这个:

$ k describe svc my-app
Name:              my-app
Namespace:         production
Labels:            app=my-app
Selector:          app=my-app
Type:              ClusterIP
IP:                10.40.9.201
Port:              http  80/TCP
TargetPort:        http/TCP
Endpoints:         10.36.0.5:80,10.36.1.5:80,10.36.100.5:80 + 114 more...
Port:              https  443/TCP
TargetPort:        https/TCP
Endpoints:         10.36.0.5:443,10.36.1.5:443,10.36.100.5:443 + 114 more...
Session Affinity:  None
Events:            <none>

对我来说奇怪的是这部分

Endpoints:         10.36.0.5:80,10.36.1.5:80,10.36.100.5:80 + 114 more...

我期待在那里看到 300 个端点,这个假设是否正确?

(我也发现了这篇关于类似问题的帖子,但是作者在端点更新之前只经历了几分钟的延迟,但对我来说,即使在半小时内也没有改变。)

我该如何解决问题所在?我读到这是由 Endpoints 控制器完成的,但我找不到任何有关在何处检查其日志的信息。

更新:我们设法再复制了几次。有时它不太严重,例如 381 个端点而不是 445 个。我们注意到的一件有趣的事情是,如果我们检索端点的详细信息:

$ k describe endpoints my-app
Name:         my-app
Namespace:    production
Labels:       app=my-app
Annotations:  <none>
Subsets:
  Addresses:          10.36.0.5,10.36.1.5,10.36.10.5,...
  NotReadyAddresses:  10.36.199.5,10.36.209.5,10.36.239.2,...

然后一堆 IP 被“卡住”在NotReadyAddresses状态中(不是那些从服务中“丢失”的 IP,但如果我将 和 中的 IP 数量相加AddressesNotReadyAddresses那仍然少于就绪 pod 的总数)。虽然我不知道这是否相关,但我在网上找不到太多关于这个NotReadyAddresses领域的信息。

标签: kubernetesgoogle-kubernetes-engine

解决方案


事实证明,这是由于在我们的节点池中使用了可抢占的虚拟机造成的,如果节点不是可抢占的,则不会发生这种情况。
我们无法找出根本原因的更多细节,但使用 preemtibles 作为节点无论如何都不是官方支持的方案,因此我们切换到常规 VM。


推荐阅读