写点什么

容器 & 服务: 扩容

发布于: 2021 年 04 月 24 日
容器 & 服务: 扩容

系列文章:

容器 & 服务:开篇,压力与资源

容器 & 服务:一个 Java 应用的 Docker 构建实战

容器 & 服务:Docker 应用的 Jenkins 构建

容器 & 服务:Docker 应用的 Jenkins 构建 (二)

容器 & 服务:K8s 与 Docker 应用集群 (一)

容器 & 服务:K8s 与 Docker 应用集群 (二)

容器 & 服务:Kubernetes 构件及 Deployment 操作

容器 & 服务: ClickHouse 与 k8s 架构


一 摘要

距离上一篇的容器文章已经很久。。 最近由于其他重要事情,导致对容器的研究暂停了一段时间。今天开始继续,恢复对扩缩容的调研与尝试。这也是 k8s 最吸引人的部分。


二 关于 HPA

HPA,全称为 Horizontal Pod Autoscaling,它可以根据当前 pod 资源的使用率(如 CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个 pod 的压力。当 pod 负载达到一定的阈值后,会根据扩缩容的策略生成更多新的 pod 来分担压力,当 pod 的使用比较空闲时,在稳定空闲一段时间后,还会自动减少 pod 的副本数量。


若要实现自动扩缩容的功能,还需要部署 heapster 服务,用来收集及统计资源的利用率,支持 kubectl top 命令,heapster 服务集成在 prometheus(普罗米修斯) MertricServer 服务中,所以说,为了方便,我这里基于 prometheus 服务的环境上进行部署 HPA(动态扩缩容)的服务。


Prometheus 的安装和使用可以参考文章:Mac 下 brew 更新及安装 Prometheus+Grafana。在 Docker/K8s 下安装更为简单,直接使用 docker pull / docker run 即可完成安装。


或者也可以部署 heapster 服务,参考 git 地址。


总言而之,要想实现 pod 副本数量的一个扩缩容,就必须保证,可以在 master 上执行下面的命令:

[root@master ~]# kubectl top node      #查看节点的资源使用情况NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master 218m 10% 1362Mi 79%
node01 113m 5% 1116Mi 64%
node02 127m 6% 1287Mi 74%
复制代码


三 扩缩容示例

3.1 生成 HPA 控制器

#运行这个hpa-example,请求CPU的资源为200m,暴露一个80端口[root@master ~]# kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80#当deployment资源对象的CPU使用率达到50%时,就进行扩容,最多可以扩容到10个[root@master ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10#上面的命令作用是生成了一个HPA的控制器,用于控制自动扩缩容[root@master ~]# kubectl get svc | grep php-apache   #查看php-apache对应的svc群集IPphp-apache   ClusterIP   10.99.60.48   <none>        80/TCP    15m[root@master ~]# kubectl get pod | grep php-apa    #确定当前的pod数量php-apache-867f97c8cb-vw74k      1/1     Running   0          17m
复制代码


3.2 使用 apache 压测,验证效果

新开启多个终端,对 pod 进行死循环请求,如下(如果你的系统资源比较充足,可以选择开启多个终端,对 pod 进行死循环请求,我这里开启了三个终端,同时请求 php-apache 的 pod):

[root@master ~]# while true; do wget -q -O- 10.99.60.48; done   #每个终端都执行此命令
复制代码

当停止死循环请求后,也并不会立即减少 pod 数量,会等一段时间后减少 pod 数量,防止流量再次激增。

[root@master ~]# kubectl top pod      #可以通过此命令随时查看pod的负载情况NAME                             CPU(cores)   MEMORY(bytes)   load-generator-7d549cd44-xm98c   0m           1Mi             php-apache-867f97c8cb-vw74k      208m         20Mi           #也可以不定时的查看pod的数量是否有变化[root@master ~]# kubectl get pod    #在运行死循环请求一段时间后,查看pod数量#可以发现php-apache的pod数量变成了10个,并且不会再增加,因为在上面的命令对其限制了最大数NAME                             READY   STATUS              RESTARTS   AGEload-generator-7d549cd44-xm98c   1/1     Running             1          25mphp-apache-867f97c8cb-4r6sk      1/1     Running             0          19mphp-apache-867f97c8cb-4rcpk      1/1     Running             0          13mphp-apache-867f97c8cb-5pbxf      1/1     Running             0          16mphp-apache-867f97c8cb-8htth      1/1     Running             0          13mphp-apache-867f97c8cb-d94h9      0/1     ContainerCreating   0          13mphp-apache-867f97c8cb-drh52      1/1     Running             0          18mphp-apache-867f97c8cb-f67bs      0/1     ContainerCreating   0          17mphp-apache-867f97c8cb-nxc2r      1/1     Running             0          19mphp-apache-867f97c8cb-vw74k      1/1     Running             0          39mphp-apache-867f97c8cb-wb6l5      0/1     ContainerCreating   0          15m
复制代码

至此,pod 副本数量的自动扩缩容就实现了。


参考文章:

k8s群集之动态扩缩容——HPA

发布于: 2021 年 04 月 24 日阅读数: 16
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
容器 & 服务: 扩容