我使用GKE,有一个应用程序app1(pod(,它使用NodePort公开,然后放在入口后面。
入口控制器已启动GCP负载平衡器。现在,来自路径/app1/
的请求被路由到我的应用程序。
我在集群中启动了stackdriver度量适配器,然后配置了一个HPA,它使用来自负载均衡器的请求/秒度量。HPA从ExternalMetric获取特定后端名称的度量。
- external:
metricName: loadbalancing.googleapis.com|https|request_count
metricSelector:
matchLabels:
resource.labels.backend_target_name: k8s-be-30048--my-backend
targetAverageValue: 20
type: External
一切都很完美。问题来了,
同样在kubernetes集群中运行的其他一些应用程序也在调用这个app1
。集群中的其他应用程序通过kubernetes FQDNapp1.default.svc.cluster.local
调用app1,而不是通过负载均衡器路由。这意味着这些请求不会通过入口负载均衡器。这意味着HPA不会以任何方式计算这些请求。
因此,这意味着总请求(Ct(是通过LoadBalancer(C1(和FQDN(C2(来的,Ct=C1+C2。我的猜测是,hpa只会考虑C1,而不会考虑Ct。由于这里计算指标的方式,我的hpa不会相应地缩放我的应用程序。例如,如果Ct是120,但C1是90,则吊舱的数量将是3,但实际上应该是4。
我认为通过FQDN来的请求没有被负载均衡器计算在内,这是不是错了?
如果请求被计数,我想我将不得不使用在pod级别上计数请求的东西。有点像普罗米修斯的中间件。你们能提出其他建议吗?
回答以下评论:
是的,这就是障碍。无法预测/关联交通类型。不管怎样,如果可以预测它会有什么帮助?
如果它可以预测(例如,它总是70%(外部(/30%(内部(,您可以调整缩放度量,使其已经包括负载平衡器度量不知道的流量。
您可以选择使用Custom Metrics
(例如:每秒查询数(,而不是从负载均衡器本身收集指标(这将不考虑内部流量(。
您的应用程序可以向云监控报告自定义度量。您可以配置Kubernetes以响应这些指标并自动扩展您的工作负载。例如,您可以根据每秒查询、每秒写入、网络性能、与不同应用程序通信时的延迟等指标,或其他对您的工作负载有意义的指标来扩展应用程序。可以为以下任何一项选择自定义度量:
- 特定节点、Pod或任何类型的Kubernetes对象,包括CustomResourceDefinition(CRD(
- 部署中所有Pod报告的度量的平均值
--Cloud.google.com:Kubernetes引擎:自定义和外部指标:自定义指标
有一份关于创建Custom Metrics
:的官方文档
- Cloud.google.com:监控:自定义度量:创建度量
您还可以查看Metrics Explorer
中已经可用的度量。
使用HPA
:进行放大/缩小时,您还可以使用多个指标
如果将工作负载配置为基于多个指标自动缩放,HPA将分别评估每个指标,并使用缩放算法根据每个指标确定新的工作负载缩放。将为自动缩放操作选择最大比例。
--Cloud.google.com:Kubernetes引擎:HorizontalPodAutoscaler
关于更多变通解决方案,您还可以使用CPU
使用度量。
其他资源:
- Cloud.google.com:Kubernetes引擎:教程:自动缩放度量:自定义度量
- Cloud.google.com:Kubernetes引擎:如何:水平吊舱自动缩放