在我们的部署中,pod 中有 4 个容器。我们仅为container-1定义了资源限制(CPU和内存)。指标服务器安装在集群中。 我们的要求是应用 Horizontal Pod Autoscaling (HPA) 并满足以下要求。 :
当我们使用以下 HPA yaml 时,它会检查 cpu 和内存。但它会考虑 Pod 中的所有容器。因为在申请的时候,给了我们一个错误。因此,在此方法中,我们还必须为其他 3 个容器提供资源(cpu、内存)限制。然后就正确显示了当前内存和CPU使用率的百分比。
错误:
HPA 无法计算副本计数:无法获取 cpu 利用率:Pod test-pod 的容器 container-2 中缺少对 cpu 的请求
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/metrics: '[{"type":"Resource","resource":{"name":"memory","targetAverageUtilization":75}}]'
name: test-hpa
namespace: ns
spec:
maxReplicas: 5
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: test-pod
targetCPUUtilizationPercentage: 65
这里的问题是它不仅仅考虑 Pod 中的 container-1。
我尝试了几种 HPA yaml,但它没有满足这两个要求。 另请注意,由于 k8 版本,“apiVersion: autoscaling/v2beta2”在我们的集群中不起作用。
Kubernetes 官方 文档
HorizontalPodAutoscaler API 还支持容器指标源,其中 HPA 可以跟踪一组 Pod 中各个容器的资源使用情况,以便扩展目标资源。这使您可以为特定 Pod 中最重要的容器配置扩展阈值。例如,如果您有一个 Web 应用程序和一个提供日志记录的 Sidecar 容器,您可以根据 Web 应用程序的资源使用情况进行扩展,而忽略 Sidecar 容器及其资源使用情况。
如果您修改目标资源以拥有具有不同容器集的新 Pod 规范,并且新添加的容器也应用于扩展,则您应该修改 HPA 规范。如果指标源中指定的容器不存在或仅存在于 Pod 的子集中,则这些 Pod 将被忽略并重新计算建议。 有关计算的更多详细信息的算法。要使用容器资源进行自动缩放,请定义指标源,如下所示: 如果您没有为容器指定 CPU 限制,则适用以下情况之一:
type: ContainerResource
containerResource:
name: cpu
container: application
target:
type: Utilization
averageUtilization: 60
要使用容器资源进行自动缩放,请定义指标源,如下所示,其中 HPA 控制器缩放目标,使得所有 pod 的应用程序容器中的 cpu 平均利用率为 60%。
如果不指定CPU限制
容器对其可以使用的CPU资源没有上限。容器可以使用运行 pod 的节点上的所有可用 CPU 资源。因此,就您而言,这将是您在问题中指定的第二个选项:节点/命名空间上剩余的数量。
通常,Kubernetes 集群管理员会定义集群中每个命名空间的限制。因此,容器运行在具有默认 CPU 限制的命名空间中,并且容器会自动分配默认限制。
应该为每个命名空间定义资源配额,这可以方便地摆脱没有资源请求或限制并耗尽所有资源的 Pod。这意味着您无法调度 pod,除非您在特定命名空间中指定该 pod 的资源要求,建议将此作为最佳实践
有关更多信息,您可以阅读此文档