问题标签 [hpa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kubernetes - 如何将外部指标提供给 HPA?
问题设置。假设我有 2 个 pod,A 和 B。我希望能够根据来自任意来源的任意数量动态扩展 pod A。假设 pod B 是这样一个源:例如,它可以有一个带有端点的 HTTP 服务器,该端点在请求时以 pod A 的所需副本数量进行响应。或者它可能是一个 ES 服务器或一个 SQL DB(没关系)。
问题。我需要定义哪些 kubernetes 对象来实现这一点(除了 HPA)?HPA 应该知道什么配置需要查找 B 以获取当前指标?B 的 API 应该是什么样子(或者有什么限制?)?
我做过的研究。不幸的是,官方文档并没有说太多,除了声明有这种可能性。还有两个存储库,一个包含一些我无法构建的 go 样板代码,另一个没有任何使用说明(尽管据称确实满足“HTTP 上的外部指标”要求)。
通过查看.yaml
这些存储库中的配置,我得出一个结论,除了需要定义一个对象之外,Deployment
还Service
需要定义一个APIService
对象,该对象在 kubernetes API 中注册外部或自定义指标并将其与普通服务链接(您将在其中拥有您的pod) 和一些ClusterRole
和ClusterRoleBinding
对象。但是没有任何解释。此外,我什至无法像其他对象一样在本地集群(1.15 版本)中使用 kubectl 列出现有的 APIServices。
kubernetes - 向 EKS 控制器管理器添加参数以启用 ScaleUp 行为
我已经在我们的 EKS 生产集群上实现了k8s HPA ,它运行良好。但是我们有一个数据科学应用程序,其中流量迅速增加。因此,查看了以下有关实现行为的文章:控制器管理器的 ScalUp参数。
与此类似的东西:
我环顾四周,但不确定是否可以在 EKS 中修改控制器管理器(我们有 1.17 版)。
Kubernetes 未知字段“行为” https://github.com/awslabs/amazon-eks-ami/issues/176#issuecomment-462051548
感谢您对此的支持。
问候,阿里
kubernetes - 基于 NATS 服务器中发布的事件数量的水平缩放
我是 Nats 和 Kubernetes 的新手。我创建了一个 python 控制台应用程序,它订阅了 nats-server,并在 Kubernetes 中使用 Deployment 对象包装在一个 pod 中。现在我想根据这个 python 客户端在 nats-server 中发布的事件数自动缩放 pod。我怎么能做到这一点?任何人都可以给我一个想法吗?
提前致谢。
kubernetes - 批量水平 pod 自动缩放
查看HPA(对此很新),我正在处理的用例是将相同的 HPA 规则应用于所有部署(在特定命名空间中)。
所以我理想情况下想要实现这样的东西:
我希望通过标签/选择器来处理这个问题,而所有部署对象都标有特定标签(例如enableHpa
),并以某种方式在内部使用选择器/macthLabelsHorizontalPodAutoscaler
将其应用于所有这些对象。但它看起来name
是必需的,并且需要针对特定的部署对象。
关于如何处理这种情况并避免hpa
为每一个deployment
按名称创建 s 的任何建议?
kubernetes - Kubernetes Deployment 充分利用了 cpu 和内存,而不会给它带来压力
我在 Kubernetes 上部署了一个应用程序并想测试 hpa。使用 kubectl top nodes 命令,我注意到 cpu 和内存在没有压力的情况下增加了。是否有意义?
此外,在强调使用 apache bench 部署时,cpu 和内存不会增加到足以通过目标并制作副本。
我的部署 yaml 文件太大了,无法提供它。这是我的容器之一。
它由 15 个容器组成,我有一个 VM,其中包含一个具有 2 个节点(主节点、工作节点)的集群。
我想强调部署,以便我可以看到它扩大规模。但是这里我觉得有问题!在不强调应用程序的情况下,
Pod 的 CPU/内存已经超过了目标,并且已经制作了 2 个副本(没有强调它)。我知道我向容器提供的请求越多,这个百分比就越少。但是,从一开始就增加内存/cpu 的使用量而不强调它是否有意义?
我希望,目标的左侧部分(pod 中内存的使用)处于开始的 0%,并且尽可能多地强调它要增加并创建副本。但是当我强调 apache bench 时,该值最多增加 10%
我们可以在这里看到 CPU 的使用情况: kubectl top pods
NAME CPU(cores) MEMORY(bytes)
x-app-55b54b6fc8-7dqjf 76m 765Mi
!!59% 是 pod 的内存使用量,由内存请求/内存的总和(内存使用量)描述。在我的情况下59% = 765Mi/1310Mi
HPA yaml 文件:
kubernetes - 如何在负载下安全终止 Pod
有一些场景需要在不减少 Deployment 总容量的情况下终止 Pod:
- 用于维护的排水节点
- 用于装箱的排水节点
- 行为不端的 Pod / 在不触发 OOM Killer 的情况下处理内存泄漏
想象一下我们有两个 Pod 占用大量流量的情况,如果使用终止 Pod 的默认工作流程,然后让 Kubernetes 通过重新创建它来做出反应,我们将在任意时间内拥有 50% 的处理能力。
在高吞吐量应用程序中,这将通过以下一种或多种方式降低服务级别:
- Rails 等非多线程非异步应用程序中的请求队列增加了响应时间
- 在异步多线程应用程序的情况下,更高的上下文切换会增加响应时间
- 具有严格响应时间 SLO 和超时的应用程序中的超时错误峰值
- 如果我们不执行严格的响应时间 SLO 和超时,则依赖于相关高吞吐量应用程序的服务会出现级联减速
理想情况下,我要寻找的是一些先创建后销毁模式。类似于:我们要求 Kube 终止 Pod,但在将其从列出的任何服务中的 Endpoints 中删除之前,它会触发扩展,尊重 Readiness Gate,然后开始终止我们要求它终止的 Pod。我在 Kubernetes 中没有发现任何提及这种模式的内容。
人们如何处理这种情况?我可以想象以下内容:
- 较低
targeAverageUtilization
的 HPA,因此我们可以容忍暂时减少 50% 的容量,但这意味着我们将支付比我们想要的更多的费用 - 优化 Pod 准备就绪时间,使我们在几秒钟内保持供应不足,但这似乎非常困难,例如,AWS 负载均衡器需要至少 10 秒才能使新目标健康运行
- 创建一个涉及的工作流程,而不是
kubectl delete [pod]
我们:- 将 HPA
minReplicas
增加到当前副本的一个以上 - 等待 Pod 准备就绪
- 等待几秒钟让它预热
- 运行
kubectl delete [pod]
以杀死所需的 pod - 等待新的替换吊舱准备就绪
- 等待几秒钟让它预热
minReplicas
在 HPA 中恢复- 冒着整个操作与流量增加/峰值同时发生的风险,并看到我上面列出的任何退化影响
- 将 HPA
这些似乎都不是很好。尤其是最后一个,不会涉及 binpacking,因为我们无法替换 Cluster Autoscaler 排出实例的方式。
kubernetes - 减少负载后 Kubernetes HPA 不会缩减
当 pod 的负载增加时,Kubernetes HPA 可以正常工作,但负载降低后,部署规模不会改变。这是我的 HPA 文件:
我的 Kubernetes 版本:
这是我的 HPA 描述:
kubernetes - Kubernetes 自定义指标在服务级别不可用
我已经在 Kubernetes 集群上安装了 Prometheus 服务器和适配器,以从 Kubernetes 对象中收集指标。
Prometheus 服务器和适配器是使用 Helm 图表安装的,它们运行良好。现在部署了 Spring Boot 应用程序,该应用程序在端点 /actuator/prometheus 提供指标。
在部署文件中添加以下注释:
当我尝试查看服务级别的指标时,它会抛出错误:
来自服务器的错误(未找到):服务器找不到服务的指标 redis_queue_box_provider_size
我必须做任何配置来收集服务级别的指标吗?
kubernetes - 将 kubernetes(GKE) 服务层指标发送到 GCP 负载均衡器
我正在使用 GKE 并有一个 application-app1(pod) 使用 NodePort 公开,然后放在入口后面。
ingress-controller 已经启动了一个 GCP 负载均衡器。现在,路径上的请求/app1/
被路由到我的应用程序。
我在集群内启动了 stackdriver-metrics 适配器,然后我配置了一个 HPA,它使用来自负载均衡器的请求/秒指标。HPA 从 ExternalMetric 获取特定后端名称的指标。
一切都很完美。问题来了,
也在 kubernetes 集群中运行的其他一些应用程序也在调用 this app1
。集群内的其他应用程序通过 kubernetes FQDN 调用 app1,app1.default.svc.cluster.local
而不是通过负载均衡器路由。这意味着这些请求不会通过入口负载均衡器。这意味着这些请求不会以任何方式被 HPA 计算在内。
因此,这意味着总请求(Ct)来自 LoadBalancer(C1)和 FQDN(C2),Ct = C1 + C2。我的猜测是 hpa 只会考虑 C1 而不是 Ct。由于此处计算指标的方式,我的 hpa 不会相应地扩展我的应用程序。例如,如果 Ct 为 120,但 C1 为 90,则 pod 的数量将为 3,但实际上应该为 4。
考虑到负载均衡器不计算通过 FQDN 发出的请求,我在这里错了吗?
如果正在计算请求,我想我将不得不使用在 pod 级别计算请求的东西。类似于普罗米修斯中间件的东西。各位能不能推荐点别的?
kubernetes - 水平 pod 自动缩放器无法在 minikube 部署中获取指标
这是一个未解决的问题:https ://github.com/kubernetes/minikube/issues/9370
重现步骤:
$ minikube start — extra-config=controller-manager.horizontal-pod-autoscaler-upscale-delay=1m — extra-config=controller-manager.horizontal-pod-autoscaler-downscale-delay=1m — extra-config=controller-manager.horizontal-pod-autoscaler-sync-period=10s — extra-config=controller-manager.horizontal-pod-autoscaler-downscale-stabilization=1m
$ minikube add-ons enable metrics-server
.yaml
使用资源请求和限制创建:
$ kubectl -n test-1 autoscale deployment orion --min=1 --max=5 --cpu-percent=50
失败命令的完整输出:
命令$ kubectl -n test-1 describe hpa orion
返回:
命令$ minikube addons list
返回:
正如您在命令输出中看到的那样,即使指标服务器似乎工作正常(hpa Orion 中的指标说:)resource cpu on pods (as a percentage of request): 0%
,当涉及到 Orion hpa 产生的事件时,关于指标的计算存在错误:
这个水平 pod 自动缩放器无法正常工作的原因是什么?
其他详情:
Minikube 版本:
Kubernetes 版本: