Horizontal Pod Autoscaler的工作原理

概述 horizontal pod autoscaler(hpa,pod水平自动伸缩),根据平均 cpu 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 deployment 、replicaset 或 statefulset 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。hpa不适用于无法缩放的对象,例如daemonset。
官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/
实际生产中,一般使用这四类指标:
resource metrics——cpu核 和 内存利用率指标。 pod metrics——例如网络利用率和流量。 object metrics——特定对象的指标,比如ingress, 可以按每秒使用请求数来扩展容器。 custom metrics——自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容。 安装 metrics-server hap 前提条件 默认情况下,horizontal pod autoscaler 控制器会从一系列的 api 中检索度量值。集群管理员需要确保下述条件,以保证 hpa 控制器能够访问这些 api:
对于资源指标,将使用 metrics.k8s.io api,一般由 metrics-server 提供。它可以作为集群插件启动。 对于自定义指标,将使用 custom.metrics.k8s.io api。它由其他度量指标方案厂商的“适配器(adapter)” api 服务器提供。检查你的指标管道以查看是否有可用的 kubernetes 指标适配器。 对于外部指标,将使用 external.metrics.k8s.io api。可能由上面的自定义指标适配器提供。 kubernetes metrics server: kubernetes metrics server 是 cluster 的核心监控数据的聚合器,kubeadm 默认是不部署的。 metrics server 供 dashboard 等其他组件使用,是一个扩展的 apiserver,依赖于 api aggregator。所以,在安装 metrics server 之前需要先在 kube-apiserver 中开启 api aggregator。 metrics api 只可以查询当前的度量数据,并不保存历史数据。 metrics api uri 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 下维护。 必须部署 metrics-server 才能使用该 api,metrics-server 通过调用 kubelet summary api 获取数据。 开启 api aggregator # 添加这行# --enable-aggregator-routing=true### 修改每个 api server 的 kube-apiserver.yaml 配置开启 aggregator routing:修改 manifests 配置后 api server 会自动重启生效。cat /etc/kubernetes/manifests/kube-apiserver.yaml
开始安装 metrics-server github地址:https://github.com/kubernetes-sigs/metrics-server/releases
下载
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/components.yaml 修改
...  template:    metadata:      labels:        k8s-app: metrics-server    spec:      containers:      - args:        - --cert-dir=/tmp        - --secure-port=4443        - --kubelet-preferred-address-types=internalip,externalip,hostname        - --kubelet-use-node-status-port        - --kubelet-insecure-tls                    #   加上该启动参数,不加可能会报错        image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1   # 镜像地址根据情况修改        imagepullpolicy: ifnotpresent...metrics-server pod无法启动,出现日志unable to fully collect metrics: ... x509: cannot validate certificate for because ... it doesn't contain any ip sans ... 解决方法:在metrics-server中添加--kubelet-insecure-tls参数跳过证书校验
开始安装 kubectl apply -f components.yamlkubectl get pod -n kube-system | grep metrics-server# 查看kubectl get pod -n kube-system | grep metrics-server# 查看node和pod资源使用情况kubectl top nodeskubectl top pods
horizontal pod autoscaler 工作原理 原理架构图
自动检测周期由 kube-controller-manager 的 --horizontal-pod-autoscaler-sync-period 参数设置(默认间隔为 15 秒)。 metrics-server 提供 metrics.k8s.io api 为pod资源的使用提供支持。 15s/周期 -> 查询metrics.k8s.io api -> 算法计算 -> 调用scale 调度 -> 特定的扩缩容策略执行。 hpa扩缩容算法 从最基本的角度来看,pod 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)] 扩容 如果计算出的扩缩比例接近 1.0, 将会放弃本次扩缩, 度量指标 / 期望指标接近1.0。
缩容 冷却/延迟: 如果延迟(冷却)时间设置的太短,那么副本数量有可能跟以前一样出现抖动。默认值是 5 分钟(5m0s)--horizontal-pod-autoscaler-downscale-stabilization
特殊处理 丢失度量值:缩小时假设这些 pod 消耗了目标值的 100%, 在需要放大时假设这些 pod 消耗了 0% 目标值。这可以在一定程度上抑制扩缩的幅度。 存在未就绪的pod的时候:我们保守地假设尚未就绪的 pod 消耗了期望指标的 0%,从而进一步降低了扩缩的幅度。 未就绪的 pod 和缺少指标的 pod 考虑进来再次计算使用率。如果新的比率与扩缩方向相反,或者在容忍范围内,则跳过扩缩。否则,我们使用新的扩缩比例。指定了多个指标, 那么会按照每个指标分别计算扩缩副本数,取最大值进行扩缩。 hpa 对象定义 apiversion: autoscaling/v2beta2kind: horizontalpodautoscalermetadata:  name: nginxspec:  behavior:  scaledown:    policies:    - type: pods      value: 4      periodseconds: 60    - type: percent      value: 10      periodseconds: 60    stabilizationwindowseconds: 300    scaletargetref:    apiversion: apps/v1    kind: deployment    name: nginx  minreplicas: 1  maxreplicas: 10  metrics:  - type: resource    resource:      name: cpu      target:        type: utilization        averageutilization: 50 hpa对象默认行为
behavior:  scaledown:    stabilizationwindowseconds: 300    policies:    - type: percent      value: 100      periodseconds: 15  scaleup:    stabilizationwindowseconds: 0    policies:    - type: percent      value: 100      periodseconds: 15    - type: pods      value: 4      periodseconds: 15    selectpolicy: max 示例演示 编排yaml apiversion: autoscaling/v2kind: horizontalpodautoscalermetadata:  name: hap-nginxspec:  maxreplicas: 10 # 最大扩容到10个节点(pod)  minreplicas: 1 # 最小扩容1个节点(pod)  metrics:  - resource:      name: cpu      target:        averageutilization: 40 # cpu 平局资源使用率达到40%就开始扩容,低于40%就是缩容        # 设置内存        # averagevalue:40        type: utilization    type: resource  scaletargetref:    apiversion: apps/v1    kind: deployment    name: hap-nginx---apiversion: v1kind: servicemetadata:  name: hap-nginxspec:  type: nodeport  ports:    - name: http      port: 80      targetport: 80      nodeport: 30080  selector:    service: hap-nginx---apiversion: apps/v1kind: deploymentmetadata:  name: hap-nginxspec:  replicas: 1  selector:    matchlabels:      service: hap-nginx  template:    metadata:      labels:        service: hap-nginx    spec:      containers:        - name: hap-nginx          image: nginx:latest          resources:            requests:              cpu: 100m              memory: 100mi            limits:              cpu: 200m              memory: 200mi 主要参数解释如下:
scaletargetref:目标作用对象,可以是deployment、replicationcontroller或replicaset。 minreplicas和maxreplicas:pod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作,并维持每个pod的内存使用率为40%,这个值就是上面设置的阈值averageutilization。 metrics:目标指标值。在metrics中通过参数type定义指标的类型;通过参数target定义相应的指标目标值,系统将在指标数据达到目标值时(考虑容忍度的区间,见前面算法部分的说明)触发扩缩容操作。 对于cpu使用率,在target参数中设置averageutilization定义目标平均cpu使用率。 对于内存资源,在target参数中设置averagevalue定义目标平均内存使用值。 执行 kubectl apply -f test.yaml 使用 ab 工具进行压测 进入apache官网 http://httpd.apache.org/ 下载apache即可,或者直接通过yum安装apache都行,这里选择最简单的方式yum安装
yum install httpd -y 开始压测
ab -n 100000 -c 800 http://local-168-182-112:30080/#-c:并发数#-n:总请求数
从上图发现已经实现了根据cpu 动态扩容了,关于更多 hap相关的知识点,可以先查看官方文档。


华为旗舰机P30 Pro到底值不值得购买
详解比特币的原理及运作机制
风河实时操作系统最新版本即将上市
Pico示波器2204A的性能特点及应用解决方案分析
工厂的数字化转型离不开坚实的IT基建和数据基础
Horizontal Pod Autoscaler的工作原理
夏普电视疯狂上演低价大戏 品牌价值崩溃
小米穿戴iOS2.0版本可独立发起运动等新功能
水晶头制作
在线教育大爆发,早教机器人成必然的发展趋势
基于ESP8266的LED矩阵时钟制作图解
华为5G手机通过3C认证,配备22.5W或40W开关电源适配器
轻松掌握FANUC机器人编程 维护与外围集成
美国周一收高,费城半导体指数上涨2.48%
苹果今年将推出8000万部5G手机 联发科正式推出Helio G95芯片组
谈中美两国之间的5G竞赛
模拟信号是怎么处理的
TCL成为北美最受欢迎的中国电视机品牌?
基于TPS61022的恒定且可调输出功率的加热单元供电方案
盘点10件对全球IT产业产生重要影响的合作案