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

前言

前面 Kubernetes入门 系列,我们学习了k8s的基础知识和简单用法,今天开始我们继续进一步学习,了解一些复杂和高级用法。本文我们学习pod水平自动扩缩容即hph h H P ua。
hpc R a C ca全称是Horizontal Pod Autoscaler,可以基于CPU的利用率或其它指标自动伸缩rel e 7 : N b j ! jplication controller、deployment和 replica set 中的 pod 数量。
我们可以根据标准应用系统的~ 4 S b c TCPU等指标$ @ h m Q ^ n的周期性变化情况,通过HPA进行动态扩缩容以此来提高集群的资源利用率。

准备

hpa通= ; H O K P , J过metrics-server,监控集群运行指标触发扩缩容的,使用前需要先确保metrics-server是可L H x + 7 l 用状态。

minikube addons list

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

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

miniku{ f T S % ` Sbe addons enable met^ O l + M @ )rics-server

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

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

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

如果想禁用metrm f Uics-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 /va3 M _ T T Ar/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 V f _ T 2  e 4 c"OK! M z = | F 0";
?>

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: php-hpa-deployment
labels:
app: php-hpa
spec:
replicase 7 2 k Z h u b: 1
selector:
mi P - 6 ! O $atchLabels:
app: php-hpa
template:
metadata:
labels:
app:* S F php-hpa
spec:
containers:
- name: php-hpat + A
image: registry.cn-ha4 x 5 i K S ! W lngzhou.aliyuncs.com/larswang/php-hpa:1.0
ports:
- containerPort: 80
resources:
requests:
cpu: 200m

Service 暴露服务

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

HPA

创建HPA

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

apiVersion: autoscaling/v10 r * I . q | i X
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%进) U @ h 8 . 8 %行扩容,# ( @ !小于10%缩容

观察HPA运行情况

kubecS v O 9 J ntl get hpa

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

可以看到以下K , H U V H - n #指标
TARGES P _TS:目前CPU使用率是0%,10%是我们设置的扩缩容阙值。
MINP3 u 5 @ j e o NODS:pod最小数量
MAXPODS:pod最大数量
REPLICAS:当前副本数,因为我们b + _ q r V g m H的cpu使用率是0%,当前副本数是1。

增加负载

我们使用busy. k - U x xbox,不断的对php-hpa-service发起http调用,增V x n p x加服务端压力。

# 使用busybox并进入容器
kubectl run  -i -8 D D-rm  --tty load-generator --image=busybox /O ; g D cbii t d s N , w ) 9n/sE | : / 5 7 Fh
# 不断发起http请求
while true; do wget -q -O- http://php-hpa-se@ + 5 arvice; done

查看hpa情况

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

cpu利用率u I i / ( d k i ]143%了,此时REPLICAS还是1,再等一会儿

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

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

降低负载

停掉load-generator发压,等几分钟(可` H o ? d S以通过--horizontal-pod-auty U ] @oscaler-downscale-stabilization设置缩容冷却% n N o时间,默认五分钟)。

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

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

总结

上面介绍了根据CPU利用率进行HPA的操作,其实在实际工作中,HPAk q [ z ( $ 2 & :是一个4 ( / { / ( o w N非常复杂的课题,因% 9 ; / V T _为影响应用运行B t l ? R O k :状态的不单单是CPU,会和内存、ERROR数、线程数等多项指标相关。

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

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

更复杂的还有,应用系统是( D [ / V : F U否非标、是CPU密集型还是内存密集型应用、系统的流量变化周期8 h 9 K _ T 8 X r、如何应对突发流量等等。

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

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

更多文章

见我的博客:https://nc2erI P n @ C sa.com

written by AloofJr,转载请注明出处