首页 > 其他分享 >HPA 弹性伸缩

HPA 弹性伸缩

时间:2023-02-25 21:47:35浏览次数:44  
标签:伸缩 -- 弹性 k8s 指标 HPA php Pod

在k8s中,我们使用pod对外提供服务,这个时候,需要以下两种情形需要关注:

  • pod因为不明原因挂掉,导致服务不可用
  • pod在高负载的情况下,不能支持我们的服务

如果人工监控pods,人工调整副本,那么这个工作量无疑是巨大的,但是k8s已经有了相应的机制来对应了。

HPA 弹性伸缩 (Horizontal Pod Autoscaler)

PHA

  • HPA全称是Horizontal Pod Autoscaler,中文意思是POD水平自动伸缩.

  • 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量
  • 除了 CPU 利用率,内存占用外,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。

  • Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。

  • Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。

  • 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

 

PHA工作机制

HorizontalPodAutoscaler 控制 Deployment 及其 ReplicaSet 的规模

Kubernetes 将水平 Pod 自动扩缩实现为一个间歇运行的控制回路(它不是一个连续的过程)。间隔由 kube-controller-manager 的 --horizontal-pod-autoscaler-sync-period 参数设置(默认间隔为 15 秒)。

在每个时间段内,控制器管理器都会根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 控制器管理器找到由 scaleTargetRef 定义的目标资源,然后根据目标资源的 .spec.selector 标签选择 Pod, 并从资源指标 API(针对每个 Pod 的资源指标)或自定义指标获取指标 API(适用于所有其他指标)。

  • 对于按 Pod 统计的资源指标(如 CPU),控制器从资源指标 API 中获取每一个 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果设置了目标使用率,控制器获取每个 Pod 中的容器资源使用情况, 并计算资源使用率。如果设置了 target 值,将直接使用原始数据(不再计算百分比)。 接下来,控制器根据平均的资源使用率或原始值计算出扩缩的比例,进而计算出目标副本数。
  • 如果 Pod 使用自定义指示,控制器机制与资源指标类似,区别在于自定义指标只使用原始值,而不是使用率。
  • 如果 Pod 使用对象指标和外部指标(每个指标描述一个对象信息)。 这个指标将直接根据目标设定值相比较,并生成一个上面提到的扩缩比例。 在 autoscaling/v2 版本 API 中,这个指标也可以根据 Pod 数量平分后再计算。

PHA的常见用途是将其配置为从聚合API(metrics.k8s.iocustom.metrics.k8s.io 或 external.metrics.k8s.io)获取指标。 metrics.k8s.io API 通常由名为 Metrics Server 的插件提供,需要单独启动。

PHA控制器访问支持扩缩容的相应工作负载资源,如:Deployment和StatefulSet。 这些资源每一个都有一个scale的子资源,该接口允许你动态设置副本的数量并检查他们的每个当前状态。

算法:

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

HPA API对象

HPA的API有三个版本

APA版本 描述
autoscaling/v1 只支持基于CPU指标的缩放
autoscaling/v2beta1 支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放;
autoscaling/v2beta2 支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放。

kubectl对HPA的支持

通过 kubectl create 命令创建一个 HPA 对象
通过 kubectl get hpa 命令来获取所有 HPA 对象
通过 kubectl describe hpa 命令来查看 HPA 对象的详细信息
通过 kubectl delete hpa 命令删除对象。
#将会为名 为 foo 的 ReplicationSet 创建一个 HPA 对象, 目标 CPU 使用率为 80%,副本数量配置为 2 到 5 之间
kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80

 PHA演示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php

查看命令:

[root@k8s-master01 ns-slx-study]# kubectl get hpa
NAME   REFERENCE        TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php    Deployment/php   0%/50%    1         10        3

找到pod对应的ip:

[root@k8s-master01 ns-slx-study]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
busybox                1/1     Running   0          21m     172.25.3.208     k8-node1       <none>           <none>
php-5b6df965db-7rx5j   1/1     Running   0          9m20s   172.25.244.225   k8s-master01   <none>           <none>
php-5b6df965db-vvjd6   1/1     Running   0          9m15s   172.29.131.33    k8s-node2      <none>           <none>

增加负载:

kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://172.29.131.33; done

然后观察hpa的状态:

kubectl get hpa php --watch

就会看到自动水平扩容,然后停掉压测,之后就会慢慢的回到初始状态

还有其他事情,详细可以参考: HorizontalPodAutoscaler 演练 | Kubernetes

标签:伸缩,--,弹性,k8s,指标,HPA,php,Pod
From: https://www.cnblogs.com/Direction-of-efforts/p/17155472.html

相关文章

  • sshpass安装
    方法一:运行yum-yinstallsshpass方法二:离线安装:下载安装包sshpass-1.06-2.el7.x86_64.rpm执行命令:rpm-ivhsshpass-1.06-2.el7.x86_64.rpm 安装后可以使......
  • 阿里云ACP学习笔记-负载均衡SLB-弹性伸缩AS-对象存储OSS
    9负载均衡SLBECS+SLB+AS CDN              协议支持:  SSL证书管理:       10弹性伸缩AS 11对象存储OSS ......
  • 中小企业如何有效应对计算资源的弹性变化需求?
    作者:程序员大阳(独立开发者)来源:本文选自Serverless函数计算评测活动征文1.计算舞台的发展史1.1上古时代longlongago,很久很久以前,计算机是一种极其稀缺的资源。我......
  • ubuntu 16.04一次安装sshpass的经历
    使用apt-getinstallsshpass安装,报如下错误: 通过查找“dpkg:errorprocessingpackagegrub-pc(--configure):”的原因,根据以下内容推断是之前安装grub-pc不规范导......
  • 软件卸载了图标还在启动台launchpad上怎么办
    https://blog.csdn.net/zsyoung/article/details/119053874问题描述有时候,我们使用MacBook时没有从AppleStore安装软件,而是从一些非官方渠道安装的软件。这样我们将这......
  • 2023-02-14 量学基础 倍量伸缩 主力控盘良好的表现 54
     1.不跌破高量实地2.第二天缩倍量,说明主力控盘良好    ......
  • 打开MASA Blazor的正确姿势4.2:Flex弹性布局
    MASABlazor预定义了Flex弹性布局的样式,可以直接在class属性中直接使用。 一、复习一下之前提到过的Flex样式(转为MASABlazor样式类):1、在容器(父元素)上使用的样式-6个......
  • jira项目笔记20-useSearchParams
    useSearchParams顾名思义,可以直接获取url中的query参数,而不需要引入外部库来解析路径中的query参数import{useSearchParams}from'react-router-dom';//比如url是/de......
  • linux之sshpass命令
    将文件连接并传输到远程系统是系统管理员一直在做的事情。SSH是Linux平台上许多系统管理员使用的基本工具。SSH支持两种身份验证形式:1.密码认证2.公钥认证公钥认证......
  • Knative Autoscaler 自定义弹性伸缩
    本文分享自天翼云开发者社区@《​​KnativeAutoscaler自定义弹性伸缩​​》,作者:我是小朋友背景如今各大云厂商都开始提供ServerlessKubernetes服务,简化集群管理,降低......