• 什么是 Kubernetes HPA


    自动伸缩是 Kubernetes 的核心能力。您配置的扩展机制(HPA、VPA 和 Cluster Autoscaler)越严格,运行应用程序的浪费和成本就越低。 

    Kubernetes 提供了三种自动伸缩机制:Horizo​​ntal Pod Autoscaler (HPA)、Vertical Pod Autoscaler (VPA) 和 Cluster Autoscaler。

    在本文中,我们关注水平 pod 自动缩放。您可以通过在集群上配置 Horizo​​ntal Pod Autoscaler (HPA) 设置来控制基于各种指标运行的 pod 数量。这使您能够根据需求扩大或缩小规模。 

    继续阅读以了解 Kubernetes HPA 是什么以及它在动手示例中的工作原理。

    让我们从 Kubernetes 自动缩放的快速回顾开始

    在深入研究 Horizo​​ntal Pod Autoscaler (HPA) 之前,让我们看一下 Kubernetes 的自动缩放机制。 

    Kubernetes 支持三种类型的自动缩放: 

    1. Horizo​​ntal Pod Autoscaler (HPA),它缩放应用程序的副本数量。 

    2. Vertical Pod Autoscaler (VPA),用于扩展容器的资源请求和限制。 

    3. Cluster Autoscaler,调整集群的节点数。 

    这些自动缩放器在两个 Kubernetes 级别之一上工作:pod 和 cluster。虽然 Kubernetes HPA 和 VPA 方法在 pod 级别调整资源,但 Cluster Autoscaler 会扩大或缩小集群中的节点数量。 

    什么是 Kubernetes Horizo​​ntal Pod Autoscaler (HPA)?

    在许多应用程序中,使用情况会随着时间而变化——例如,晚上访问电子商务商店的人多于中午左右。当您的应用程序需求发生变化时,您可以使用 Horizo​​ntal Pod Autoscaler (HPA) 根据 CPU 利用率自动添加或删除 pod。

    HPA 根据您在外部提供的指标或自定义指标做出自动缩放决策。

    首先,您需要使用 MIN 和 MAX 值定义在任何给定时间应运行的副本数。配置完成后,Horizo​​ntal Pod Autoscaler 控制器会负责检查指标并根据需要进行调整。默认情况下,它每 15 秒检查一次指标。

    Horizo​​ntal Pod Autoscaler 如何工作?

    配置 HPA 控制器将监控部署的 pod 并了解 pod 副本的数量是否需要更改。为了确定这一点,HPA 采用每个 pod 指标值的加权平均值,并计算删除或添加副本是否会使该值更接近其目标值。

    示例场景

    假设您的部署的目标 CPU 利用率为 50%。您目前有五个 Pod 在那里运行,平均 CPU 利用率为 75%。在这种情况下,HPA 控制器将添加三个副本以使 pod 平均值更接近 50% 的目标。

    aa7d4363c44b318cdda5515a7e6ec807.png

    何时使用 Kubernetes HPA?

    Horizo​​ntal Pod Autoscaler 是一种自动扩展机制,可用于扩展无状态应用程序。但是您也可以使用它来支持扩展有状态集。 

    要为经历定期需求变化的工作负载节省成本,请将 HPA 与集群自动缩放结合使用。这将帮助您在 pod 数量减少时减少活动节点的数量。

    Horizo​​ntal Pod Autoscaler 的限制 

    请注意,HPA 有一些限制:

    • 它可能需要在构建您的应用程序时考虑到横向扩展,以便可以在多个服务器之间分配工作负载。 
    • HPA 可能无法始终跟上意外的需求高峰,因为新虚拟机可能需要几分钟才能加载。
    • 如果您未能在 pod 上设置 CPU 和内存限制,如果您选择相反,它们可能会频繁终止或浪费资源。 
    • 如果集群容量不足,则 HPA 无法扩展,直到将新节点添加到集群中。Cluster Autoscaler (CA) 可以自动执行此过程。 

    运行 Horizo​​ntal Pod Autoscaler 需要什么?

    Horizo​​ntal Pod Autoscaler (HPA) 是 Kubernetes 集群管理器的一项功能,它监视 pod 容器的 CPU 使用情况,并根据需要自动调整它们的大小以保持目标利用率水平。 

    为此,HPA 需要一个指标来源。例如,当基于 CPU 使用率进行扩展时,它使用metrics-server。如果要使用自定义或外部指标进行 HPA 扩展,则需要部署实现 custom.metrics.k8s.io API 或 external.metrics.k8s.io API 的服务;这提供了一个与监控服务或指标源的接口。 

    自定义指标包括网络流量、内存或与 pod 应用程序相关的任何值。如果您的工作负载使用标准 CPU 指标,请确保在 pod 规范中为容器配置 CPU 资源限制。

    运行 Kubernetes HPA 的专家提示

    1.安装Metrics-Server 

    Kubernetes HPA 需要访问每个 pod 的资源指标来做出扩展决策。这些值是从 metrics-server 提供的 metrics.k8s.io API 中检索的。 

    2. 为所有 Pod 配置资源请求

    HPA 扩展决策的另一个关键信息来源是观察到的 pod 的 CPU 利用率值。但是这些值是如何计算的呢?它们是来自单个 pod 的资源请求的百分比。 

    如果您错过了某些容器​​的资源请求值,这些计算可能会变得完全不准确,并导致次优操作和糟糕的扩展决策。这就是为什么值得为每个 pod 的所有容器配置资源请求值的原因,这些容器是由 HPA 扩展的 Kubernetes 控制器的一部分。

    3. 配置自定义和外部指标

    自定义指标

    您可以将 Horizo​​ntal Pod Autoscaler (HPA) 配置为基于自定义指标进行扩展,这些指标是您从应用程序收集的内部指标。HPA 支持两种类型的自定义指标: 

    • Pod 指标 – 应用程序中所有 pod 的平均值,仅支持目标类型 AverageValue。 
    • 对象指标 – 描述与您的应用程序在同一命名空间中的任何其他对象并支持 Value 和 AverageValue 的目标类型的指标。 

    请记住在配置自定义指标时为 pod 和对象指标使用正确的目标类型。 

    外部指标

    这些指标允许 HPA 根据第三方监控系统提供的指标自动扩展应用程序。外部指标支持 Value 和 AverageValue 的目标类型。 

    在决定自定义指标和外部指标时,请选择自定义指标,因为保护外部指标 API 比获得内部指标更难。

    4. 验证您的 HPA 和 VPA 策略不冲突

    Vertical Pod Autoscaler 可自动执行请求并限制配置,从而减少开销并节省成本。另一方面,Horizo​​ntal Pod Autoscaler 旨在横向扩展而不是向上或向下扩展。 

    在为业务或目的级服务层设计集群时,请仔细检查您的分箱和打包密度设置是否相互冲突。

    5. 使用实例加权分数

    假设您的一个工作负载最终消耗的比它请求的多。发生这种情况是因为需要资源吗?或者工作负载是否因为它们可用但不是非常需要而消耗它们?

    在为自动缩放选择实例大小和类型时使用实例权重。实例加权很有用,尤其是当您采用多样化的分配策略并使用 Spot 实例时。

    示例:HPA 演示

    由于这是 Kubernetes 的核心功能之一,我们使用的云服务提供商应该无关紧要。但在本例中,我们将使用 GKE。 

    您可以通过 UI 或 gcloud utils 创建集群,如下所示:

    1. gcloud container \
    2. --project "[your-project]" clusters create "[cluster-name]" \
    3. --release-channel None \
    4. --zone "europe-west3-c" \
    5. --node-locations "europe-west3-c" \
    6. --machine-type "e2-standard-2" \
    7. --image-type "COS_CONTAINERD" \
    8. --disk-size "50" \
    9. --enable-autorepair \
    10.     --num-nodes "3"

    然后我们可以使用以下方式连接到集群:

    gcloud container clusters get-credentials [cluster-name] --zone europe-west3-c --project [your-project]

    这也应该将您的上下文切换到集群,因此无论何时使用 kubectl,您都将处于该集群的上下文中。

    完成后,我们可以验证是否可以看到节点: 

    1. > kubectl get nodes
    2. NAME STATUS ROLES AGE VERSION
    3. gke-valdas-1-default-pool-cf1cd6be-cvc4 Ready <none> 4m50s v1.22.11-gke.400
    4. gke-valdas-1-default-pool-cf1cd6be-q62h Ready <none> 4m49s v1.22.11-gke.400
    5. gke-valdas-1-default-pool-cf1cd6be-xrf0   Ready    <none>   4m50s   v1.22.11-gke.400


    GKE 预装了指标服务器;我们可以验证使用:

    1. > kubectl get pods -n kube-system | grep metrics
    2. gke-metrics-agent-n92rl 1/1 Running 0 7m34s
    3. gke-metrics-agent-p5d49 1/1 Running 0 7m33s
    4. gke-metrics-agent-tf96r 1/1 Running 0 7m34s
    5. metrics-server-v0.4.5-fb4c49dd6-knw6v                2/2     Running   0          7m20s

    请注意,如果您的集群没有指标服务器,您可以使用一个命令轻松安装它:

    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

    你可以在这里找到更多信息。

    我们还可以使用 `top` 命令来验证是否收集了指标:

    1. > kubectl top pods -A
    2. NAMESPACE NAME CPU(cores) MEMORY(bytes)
    3. kube-system event-exporter-gke-5479fd58c8-5rt4b 1m 12Mi
    4. kube-system fluentbit-gke-5r6v5 5m 22Mi
    5. kube-system fluentbit-gke-nwcx9 4m 25Mi
    6. kube-system fluentbit-gke-zz6gl 4m 25Mi
    7. kube-system gke-metrics-agent-n92rl 2m 26Mi
    8. kube-system gke-metrics-agent-p5d49 3m 27Mi
    9. kube-system gke-metrics-agent-tf96r 3m 26Mi
    10. kube-system konnectivity-agent-6fbc8c774c-4vvff 1m 6Mi
    11. kube-system konnectivity-agent-6fbc8c774c-lsk26 1m 7Mi
    12. kube-system konnectivity-agent-6fbc8c774c-rnvp2 2m 6Mi
    13. kube-system konnectivity-agent-autoscaler-555f599d94-f2w5n 1m 4Mi
    14. kube-system kube-dns-85df8994db-lvf55 2m 30Mi
    15. kube-system kube-dns-85df8994db-mvxv5 2m 30Mi
    16. kube-system kube-dns-autoscaler-f4d55555-pctcj 1m 11Mi
    17. kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-cvc4 1m 22Mi
    18. kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-q62h 1m 23Mi
    19. kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-xrf0 1m 26Mi
    20. kube-system l7-default-backend-69fb9fd9f9-fctch 1m 1Mi
    21. kube-system metrics-server-v0.4.5-fb4c49dd6-knw6v 27m 24Mi
    22. kube-system pdcsi-node-mf6pt 2m 9Mi
    23. kube-system pdcsi-node-sxdrg 3m 9Mi
    24. kube-system   pdcsi-node-wcnw7                                     3m           9Mi

    现在,让我们创建一个具有资源请求和限制的单副本部署:

    1. apiVersion: autoscaling/v1
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: hpa-demo
    5. spec:
    6. scaleTargetRef:
    7. apiVersion: apps/v1
    8. kind: Deployment
    9. name: hpa-demo
    10. minReplicas: 1
    11. maxReplicas: 5
    12.   targetCPUUtilizationPercentage: 60

  • 相关阅读:
    JAVAWeb2:整体框架
    2022年全球市场品牌保护和安全标签总体规模、主要生产商、主要地区、产品和应用细分研究报告
    代码随想录一刷打卡——.二叉树的层次遍历(十题特别版)
    行情分析——加密货币市场大盘走势(10.27)
    SpringBoot中Filter和Interceptor快速入门
    智能巡检软件怎么选?企业设备管理需要做什么?
    PostgreSQL-服务端编程
    linux防火墙查看状态firewall、iptable
    LeetCode(力扣)62. 不同路径Python
    牛客小白月赛 61 E 排队
  • 原文地址:https://blog.csdn.net/vvoennvv/article/details/127605825