Kubernetes Deployment 充分利用了 cpu 和内存而不用强调它

Kubernetes Deployment makes great use of cpu and memory without stressing it

我已经在 Kubernetes 上部署了一个应用程序,想测试 hpa。 使用 kubectl top nodes 命令,我注意到 cpu 和内存在没有压力的情况下增加了。 有道理吗?

此外,在使用 apache bench 强调部署时,cpu 和内存没有增加到足以通过目标并制作副本。

我的部署 yaml 文件太大,无法提供。这是我的一个容器。

    - name: web
      image: php_apache:1.0
      imagePullPolicy: Always
      resources:
        requests:
          memory: 50Mi
          cpu: 80m
        limits:
          memory: 100Mi
          cpu: 120m
      volumeMounts:
      - name: shared-data
        mountPath: /var/www/html
      ports:
      - containerPort: 80

它由15个容器组成 我有一个 VM,其中包含一个具有 2 个节点(master、worker)的集群。

我想强调部署,以便我可以看到它的扩展。 但是这里我觉得有问题!在不强调应用程序的情况下,

来自 Pod 的

CPU/Memory 已经通过了目标并且已经制作了 2 个副本(没有强调它)。 我知道我提供给容器的请求越多,这个百分比就越少。 但是从一开始就增加 memory/cpu 的使用量而不强调它有意义吗?

我希望目标的左侧部分(pods 中的内存使用情况)在开始时为 0%,并且尽可能多地增加它并创建副本。 但正如我在 apache bench 上强调的那样,该值最多增加了 10%

这里可以看到CPU的用法: kubectl top pods

NAME CPU(cores) MEMORY(bytes) x-app-55b54b6fc8-7dqjf 76m 765Mi

!!59% 是 pod 的内存使用情况,由 内存总和 Requests/Memory(内存使用情况)。就我而言 59% = 765Mi/1310Mi

HPA yaml 文件:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 35 

使用 kubectl top nodes 命令,我注意到 cpu 和内存在没有压力的情况下增加了。有道理吗?

是的,这是有道理的。如果您将检查 Google Cloud 关于 Requests and Limits

Requests and limits are the mechanisms Kubernetes uses to control resources such as CPU and memory. Requests are what the container is guaranteed to get. If a container requests a resource, Kubernetes will only schedule it on a node that can give it that resource. Limits, on the other hand, make sure a container never goes above a certain value. The container is only allowed to go up to the limit, and then it is restricted.

但是从一开始就增加 memory/cpu 的用法而不强调它有意义吗?

是的,例如您的容器 www 它可以从 memory: 50Micpu: 80m 开始,但允许增加到 memory: 100Micpu: 120m。另外,正如您提到的,您总共有 15 个容器,因此取决于它们的 requestlimits 它可以达到超过 35%memory

HPA documentation - algorithm-details中您可以找到信息:

When a targetAverageValue or targetAverageUtilization is specified, the currentMetricValue is computed by taking the average of the given metric across all Pods in the HorizontalPodAutoscaler's scale target. Before checking the tolerance and deciding on the final values, we take pod readiness and missing metrics into consideration, however.

All Pods with a deletion timestamp set (i.e. Pods in the process of being shut down) and all failed Pods are discarded.

If a particular Pod is missing metrics, it is set aside for later; Pods with missing metrics will be used to adjust the final scaling amount.

不确定最后一个问题:

!!59% 是 pod 的内存使用量,由内存总和 Requests/Memory(内存使用量)描述。在我的例子中 59% = 765Mi/1310Mi

在您的 HPA 中,您设置了在 averageUtilization: 达到 memory35% 时创建另一个 pod。它达到 59% 并创建了另一个 pod。由于 HPA 目标是 memoryHPA 根本不算 CPU。另外请记住,因为这是 average,它需要大约 1 分钟来更改值。

为了更好地了解 HPA 的工作原理,请尝试 this walkthrough

如果这没有帮助,请说明您的确切要求。