【从入门到放弃-Kubernetes】Kubernetes进阶-pod水平自动伸缩(hpa)

简介:

前言

前面 Kubernetes入门 系列,我们学习了k8s的基础知识和简单用法,今天开始我们继续进一步学习,了解一些复杂和高级用法。本文我们学习pod水平自动扩缩容即hpa。
hpa全称是Horizontal Pod Autoscaler,可以基于CPU的利用率或其它指标自动伸缩replication controller、deployment和 replica set 中的 pod 数量。
我们可以根据标准应用系统的CPU等指标的周期性变化情况,通过HPA进行动态扩缩容以此来提高集群的资源利用率。

准备

hpa通过metrics-server,监控集群运行指标触发扩缩容的,使用前需要先确保metrics-server是可用状态。

minikube addons list

观察metrics-server是否是可用状态,如果是disabled。则需要执行以下命令开启。

minikube addons enable metrics-server

此时执行kubectl top命令即可查看pod、node的cpu、memory的使用消耗情况。

如果想禁用metrics-server,disable即可

minikube addons disable metrics-server

启动应用并暴露服务

我们参考官方demo,使用PHP提供http服务,进行CPU密集型计算。观察CPU和pod自动扩缩容情况。

准备镜像

这里创建一个CPU密集型PHP脚本,并打成镜像。

也可以直接用我打好的镜像 registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0,跳过这一步,直接看Deployment。

文件及源码地址见:AloofJr

# Dockerfile
FROM php:7.4.6-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
// index.php
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-hpa-deployment
  labels:
    app: php-hpa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-hpa
  template:
    metadata:
      labels:
        app: php-hpa
    spec:
      containers:
      - name: php-hpa
        image: registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 200m

Service 暴露服务

apiVersion: v1
kind: Service
metadata:
  name: php-hpa-service
spec:
  type: ClusterIP
  selector:
    app: php-hpa
  ports:
    - port: 80

HPA

创建HPA

创建hpa设置pod扩缩最多和最少的数量以及执行扩缩容的条件。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-hpa-deployment
  minReplicas: 1 #pod最小数量
  maxReplicas: 10 #pod最大数量
  targetCPUUtilizationPercentage: 10 #cpu使用率超过10%进行扩容,小于10%缩容

观察HPA运行情况

kubectl get hpa

可以看到以下指标
TARGETS:目前CPU使用率是0%,10%是我们设置的扩缩容阙值。
MINPODS:pod最小数量
MAXPODS:pod最大数量
REPLICAS:当前副本数,因为我们的cpu使用率是0%,当前副本数是1。

增加负载

我们使用busybox,不断的对php-hpa-service发起http调用,增加服务端压力。

# 使用busybox并进入容器
kubectl run  -i --rm  --tty load-generator --image=busybox /bin/sh

# 不断发起http请求
while true; do wget -q -O- http://php-hpa-service; done

查看hpa情况

cpu利用率143%了,此时REPLICAS还是1,再等一会儿

可以看到REPLICAS已经扩到了10个pod,cpu负载平均到了35%,虽然比我们配置的10%高,但是扩到了最多MAXPODS 10个,所以不会继续扩容了

降低负载

停掉load-generator发压,等几分钟(可以通过--horizontal-pod-autoscaler-downscale-stabilization设置缩容冷却时间,默认五分钟)。

可以看到REPLICAS缩到了1个pod。

总结

上面介绍了根据CPU利用率进行HPA的操作,其实在实际工作中,HPA是一个非常复杂的课题,因为影响应用运行状态的不单单是CPU,会和内存、ERROR数、线程数等多项指标相关。

在扩容时,还要考虑资源额度、数据库连接数等。

在缩容时则需要更小心了,要时刻关注应用的运行状态,是很容易引发容量故障的。

更复杂的还有,应用系统是否非标、是CPU密集型还是内存密集型应用、系统的流量变化周期、如何应对突发流量等等。

欢迎感兴趣或有实战经验的大神们来交流探讨。

文件用到的yaml配置可以在AloofJr找到。

更多文章

见我的博客:https://nc2era.com

written by AloofJr,转载请注明出处

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2天前
|
Kubernetes 监控 Cloud Native
Kubernetes自动伸缩方案的终极指南
【4月更文挑战第18天】
16 0
Kubernetes自动伸缩方案的终极指南
|
22天前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
20 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
1月前
|
Prometheus Kubernetes 监控
容器服务ACK常见问题之pod设置securityContext调整参数失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
13天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
21 0
Kubernetes Pod生命周期
|
13天前
|
存储 Kubernetes 应用服务中间件
Kubernetes Pod
Kubernetes Pod
45 0
Kubernetes Pod
|
24天前
|
存储 Kubernetes 调度
K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)
本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。
|
24天前
|
Kubernetes 网络协议 Perl
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
24 0
|
27天前
|
Kubernetes API 调度
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
59 0
|
1月前
|
Kubernetes Nacos 微服务
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
24 1
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决
|
1月前
|
域名解析 Kubernetes Linux
Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程
Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程
40 4

推荐镜像

更多