k8s中如何实现pod自动扩缩容详解

在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试对服务压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作)。,K8S 从 1.8 版本开始,各节点CPU、内存等资源的 metrics 信息可以通过 Metrics API 来获取,用户可以直接获取这些 metrics 信息(例如通过执行 kubect top 命令),HPA 使用这些 metics 信息来实现动态伸缩。,基于1.23.1版kubernetes,HPA官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/,metrics-server 是一个集群范围内的资源数据集和工具,同样的,metrics-server 也只是显示数据,并不提供数据存储服务,主要关注的是资源度量 API 的实现,比如 CPU、文件描述符、内存、请求延时等指标,metric-server 收集数据给 k8s 集群内使用,如 kubectl,hpa,scheduler 等。,github地址:https://github.com/kubernetes-sigs/metrics-server/,不同k8s版本根据官网安装对应版本的metrics-server,k8s中如何实现pod自动扩缩容详解,1、镜像下载,所用镜像可提前自行下载:registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.1,2、导入镜像,3、修改apiserver配置,注意:会中断业务,生产环境谨慎操作!,这个是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。这个参数的作用是 Aggregation 允许在不修改 Kubernetes 核心代码的同时扩展 Kubernetes API。,增加如下内容:,添加后的效果如下图所示:,k8s中如何实现pod自动扩缩容详解,修改完成后重启kubelet,4、部署metrics-server 服务,用到的yaml文件到github下载,地址:https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml,5、验证metrics-server是否部署成功,可以看到pod处于Running状态:,k8s中如何实现pod自动扩缩容详解,k8s中如何实现pod自动扩缩容详解,k8s中如何实现pod自动扩缩容详解,1、镜像准备,使用 dockerfile 构建一个新的镜像,在 k8s 的 xuegod63 节点构建,dockerfile内容如下:,创建index.php文件,内容如下:,在工作节点导入镜像:,2、通过 deployment 部署一个 php-apache 服务,k8s中如何实现pod自动扩缩容详解,1、通过deployment部署一个nginx服务,注意:nginx 的 pod 里需要有如下字段,否则 hpa 会采集不到内存指标,创建资源并查看:,k8s中如何实现pod自动扩缩容详解,php-apache 服务正在运行,使用 kubectl autoscale 创建自动缩放器,实现对 php-apache 这个deployment 创建的 pod 自动扩缩容,下面的命令将会创建一个 HPA,HPA 将会根据 CPU资源指标增加或减少副本数,创建一个可以实现如下目的的 hpa:,(1)让副本数维持在 1-10 个之间(这里副本数指的是通过 deployment 部署的 pod 的副本数),(2)将所有 Pod 的平均 CPU 使用率维持在 50%(通过 kubectl run 运行的每个 pod 如果是 200毫核,这意味着平均 CPU 利用率为 100 毫核),创建:,查看:,k8s中如何实现pod自动扩缩容详解,可以看到cpu目标及当前状态,最大、最小、当前副本数。,重新打开一个master节点的终端,进行如下操作:,在原master终端查看hpa情况:,k8s中如何实现pod自动扩缩容详解,k8s中如何实现pod自动扩缩容详解,可以看到平均cpu使用率达到了98%,副本数已经变为5个。,注意:可能需要几分钟来稳定副本数。由于不以任何方式控制负载量,因此最终副本数可能会与此示例不同。,停止向 php-apache 这个服务发送查询请求,在 busybox 镜像创建容器的终端中,通过 Ctrl+ C 把刚才 while 请求停止,然后,我们将验证结果状态(大约一分钟后):,k8s中如何实现pod自动扩缩容详解,可以看到平均cpu使用率降为0%,副本数降为1。,nginx 服务正在运行,使用 kubectl autoscale 创建自动缩放器,实现对 nginx 这个deployment 创建的 pod 自动扩缩容,下面的命令将会创建一个 HPA,HPA 将会根据内存资源指标增加或减少副本数,创建一个可以实现如下目的的 hpa:,(1)让副本数维持在 1-10 个之间(这里副本数指的是通过 deployment 部署的 pod 的副本数),(2)将所有 Pod 的平均内存使用率维持在 60%,hpa-v1.yaml 内容如下:,k8s中如何实现pod自动扩缩容详解,可以看到当前内存使用率、目标内存使用率,最大、最小、当前副本数。,使用master节点的终端2登录到上面通过 pod 创建的 nginx,并生成一个文件,增加内存,使用终端1查看hpa情况:,k8s中如何实现pod自动扩缩容详解,可以看到平均内存使用率达到了238%,,副本数达到了4个。,到终端2使用 Ctrl + C 中断dd进程,删除/tmp/a这个文件,在终端1查看hpa的情况:,k8s中如何实现pod自动扩缩容详解,可以看到平均内存使用率已经降到5%,副本数也降为1。(需要等几分钟才能看到),项目地址:https://github.com/kubernetes/autoscaler,在以下情况下,集群自动扩容或者缩放:,扩容:由于资源不足,某些 Pod 无法在任何当前节点上进行调度。,缩容: Node 节点资源利用率较低时,且此 node 节点上存在的 pod 都能被重新调度到其他 node节点上运行。,1、节点上有 pod 被 PodDisruptionBudget 控制器限制。,2、节点上有命名空间是 kube-system 的 pods。,3、节点上的 pod 不是被控制器创建,例如不是被 deployment, replica set, job, stateful set 创建。,4、节点上有 pod 使用了本地存储。,5、节点上 pod 驱逐后无处可去,即没有其他 node 能调度这个 pod。,6、节点有注解:“cluster-autoscaler.kubernetes.io/scale-down-disabled”: “true”(在 CA 1.0.3 或更高版本中受支持)。,Horizontal Pod Autoscaler 会根据当前 CPU 负载更改部署或副本集的副本数。如果负载增加,则 HPA 将创建新的副本,集群中可能有足够的空间,也可能没有足够的空间。如果没有足够的资源,CA将尝试启动一些节点,以便 HPA 创建的 Pod 可以运行。如果负载减少,则 HPA 将停止某些副本。结果,某些节点可能变得利用率过低或完全为空,然后 CA 将终止这些不需要的节点。,
返回顶部
跳到底部

Copyright 2011-2024 南京追名网络科技有限公司 苏ICP备2023031119号-6 乌徒帮 All Rights Reserved Powered by Z-BlogPHP Theme By open开发

请先 登录 再评论,若不是会员请先 注册