使用自定义指标进行Pod弹性伸缩

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Horizontal Pod Autoscaling,简称HPA,是Kubernetes中实现Pod水平自动伸缩功能的资源对象。Kubernetes 1.9 或更高版本支持HPA V2版本,允许我们是用自定义监控指标来控制Pod数目。

Horizontal Pod Autoscaling,简称HPA,是Kubernetes中实现Pod水平自动伸缩功能的资源对象。Kubernetes 1.9 或更高版本支持HPA V2版本,允许我们是用自定义监控指标来控制Pod数目。
本文用阿里云容器服务来介绍HPA使用自定义指标进行弹性伸缩的功能。

安装配置Prometheus和Prometheus adaptor

我们使用Prometheus收集指标,通过Prometheus adaptor来扩展Kubernetes 自定义监控指标。
使用阿里云容器服务控制台创建好集群,并创建monitoring命名空间。然后进行如下步骤:

安装Prometheus

在应用目录-App Hub中搜索prometheus可以看到如下组件
20190912164505_1

点击prometheus进入安装页面,点击参数进行查看并配置(本文persistentVolume enabled设置为false,即使用emptyDir),选择集群命名空间后点击安装。
20190912164859_2

安装Prometheus adaptor

安装过程同上,注意配置参数中prometheus url要使用之前部署好的prometheus地址
20190912165502_3

验证安装是否成功

使用控制台的cloudshell或kubectl连接集群,执行如下命令:

kubectl api-versions

结果中可以看到如下内容,表明集群支持hpa v2并可以使用自定义监控指标

autoscaling/v2beta1
custom.metrics.k8s.io/v1beta1

我们可以进一步查看监控项,如pod支持的监控指标

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" |jq . | grep "pods/"
      "name": "pods/start_time_seconds",
      "name": "pods/cpu_user",
      "name": "pods/fs_limit_bytes",
      "name": "pods/cpu_cfs_throttled",
      "name": "pods/memory_failcnt",
      "name": "pods/fs_writes_bytes",
      "name": "pods/kube_pod_created",
      "name": "pods/kube_pod_status_phase",
      "name": "pods/tasks_state",
      "name": "pods/last_seen",
      "name": "pods/kube_pod_container_status_running",
      "name": "pods/fs_reads_merged",
      "name": "pods/memory_swap",
      "name": "pods/spec_cpu_quota",
      "name": "pods/fs_io_current",
      "name": "pods/kube_pod_container_resource_requests_memory_bytes",
      "name": "pods/kube_pod_container_status_waiting",
      "name": "pods/fs_sector_reads",
      "name": "pods/kube_pod_status_scheduled",
      "name": "pods/kube_pod_container_status_waiting_reason",
      "name": "pods/fs_reads_bytes",
      "name": "pods/kube_pod_container_resource_requests_cpu_cores",
      "name": "pods/kube_pod_container_status_terminated_reason",
      "name": "pods/cpu_system",
      "name": "pods/fs_read",
      "name": "pods/fs_writes",
      "name": "pods/kube_pod_owner",
      "name": "pods/memory_mapped_file",
      "name": "pods/spec_cpu_shares",
      "name": "pods/kube_pod_container_resource_limits_cpu_cores",
      "name": "pods/cpu_usage",
      "name": "pods/kube_pod_container_resource_limits",
      "name": "pods/kube_pod_info",
      "name": "pods/memory_working_set_bytes",
      "name": "pods/fs_writes_merged",
      "name": "pods/memory_usage_bytes",
      "name": "pods/kube_pod_container_resource_requests",
      "name": "pods/fs_io_time_weighted",
      "name": "pods/spec_cpu_period",
      "name": "pods/spec_memory_reservation_limit_bytes",
      "name": "pods/cpu_cfs_throttled_periods",
      "name": "pods/kube_pod_container_resource_limits_memory_bytes",
      "name": "pods/cpu_cfs_periods",
      "name": "pods/kube_pod_status_ready",
      "name": "pods/kube_pod_container_status_terminated",
      "name": "pods/memory_failures",
      "name": "pods/memory_rss",
      "name": "pods/spec_memory_swap_limit_bytes",
      "name": "pods/memory_cache",
      "name": "pods/kube_pod_start_time",
      "name": "pods/fs_io_time",
      "name": "pods/fs_reads",
      "name": "pods/fs_inodes_free",
      "name": "pods/kube_pod_container_status_ready",
      "name": "pods/fs_sector_writes",
      "name": "pods/cpu_load_average_10s",
      "name": "pods/spec_memory_limit_bytes",
      "name": "pods/kube_pod_labels",
      "name": "pods/kube_pod_container_status_restarts",
      "name": "pods/kube_pod_container_info",
      "name": "pods/fs_usage_bytes",
      "name": "pods/kube_pod_completion_time",
      "name": "pods/kube_pod_container_status_last_terminated_reason",
      "name": "pods/kube_pod_status_scheduled_time",
      "name": "pods/memory_max_usage_bytes",
      "name": "pods/fs_inodes",
      "name": "pods/fs_write",

部署Deployment

在容器服务控制台中点击无状态->使用镜像创建,创建并部署一个nginx deployment,配置如下
20190912170958_4

在访问设置中配置服务
20190912171113_5

创建成功后可以在无状态列表中找到名为nginx的deployment,点击详情可以查看到相关信息
20190912171416_6

创建HPA

在上述详情页中点击容器组水平伸缩器,点击创建,配置相关内容(指标使用pods,参考上述自定义监控指标内容填写一项,这里使用memory_usage_bytes,阈值10485760=10M)
20190912171846_7

创建成功后可以在列表中查看到nginx-hpa
20190912172111_8

测试并触发自动伸缩

使用压测工具ab进行压测
20190912174736_8

for a in `seq 1 50`; do ab -rSqd -c 100 -n 2000 http://ng.cfc7d1315bdd14d529a7f102c2163736d.cn-beijing.alicontainer.com/;done

等待一段时间,可以看到pod数量的变化
20190912175334_10

总结

通过 Prometheus 来监控应用程序并暴露出用于弹性伸缩的指标,使用HPA利用这些监控指标对应用进行弹性伸缩,可以应对一些突发状况,提高应用的可用性。

目录
相关文章
|
弹性计算 Kubernetes 应用服务中间件
通过HPA进行Pod水平弹性伸缩
本场景带您体验如何使用阿里云指标完成Pods的自动伸缩。
|
弹性计算 监控 Kubernetes
k8s-对Pod自动弹性伸缩(HPA)
HPA介绍 部署metrics-server 案例自动缩容
k8s-对Pod自动弹性伸缩(HPA)
|
缓存 弹性计算 分布式计算
Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
弹性伸缩作为 Kubernetes 的核心能力之一,但它一直是围绕这无状态的应用负载展开。而 Fluid 提供了分布式缓存的弹性伸缩能力,可以灵活扩充和收缩数据缓存。 它基于 Runtime 提供了缓存空间、现有缓存比例等性能指标, 结合自身对于 Runtime 资源的扩缩容能力,提供数据缓存按需伸缩能力。
Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
|
缓存 弹性计算 分布式计算
Fluid给数据弹性一双隐形的翅膀 (1) -- 自定义弹性伸缩
弹性伸缩作为Kubernetes的核心能力之一,但它一直是围绕这无状态的应用负载展开。而Fluid提供了分布式缓存的弹性伸缩能力,可以灵活扩充和收缩数据缓存。 它基于Runtime提供了缓存空间、现有缓存比例等性能指标, 结合自身对于Runtime资源的扩缩容能力,提供数据缓存按需伸缩能力。
1949 0
Fluid给数据弹性一双隐形的翅膀 (1) -- 自定义弹性伸缩
|
弹性计算 容器 Kubernetes
Kubernetes弹性伸缩全场景解读(六) - 使用Ingress指标进行弹性伸缩
Ingress Controller(Nginx)是深受Kubernetes开发者欢迎的接入层网关方案,具有功能丰富、配置简单等特点,特别是对于从前使用Nginx的开发者而言,可以快速掌握驾轻就熟。本文中会为大家介绍如何通过Ingress的指标进行弹性伸缩。
5881 0
|
弹性计算 监控 Docker
如何实现Docker应用的自定义弹性伸缩
简介 现在有很多客户很关心应用的自动弹性伸缩,有些客户也有自己的监控框架,并希望能跟阿里云容器服务进行集成。阿里云容器服务提供了服务弹性伸缩触发器,并能够跟监控框架集成来实现自定义的服务自动弹性伸缩。 阿里云容器服务会自动采集容器的监控数据,并可以通过集成将监控数据发送到三方的监控框架中。
1782 0
|
17天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
弹性计算 缓存 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
220 0
|
6月前
|
弹性计算 监控 开发工具
【阿里云弹性计算】实战教程:如何高效利用阿里云ECS弹性伸缩应对业务高峰
【5月更文挑战第20天】本文介绍了如何使用阿里云ECS弹性伸缩服务应对业务高峰。通过自动调整云资源规模,弹性伸缩在流量增加时扩展实例,流量减少时收缩实例,实现成本与性能的优化。步骤包括开通服务、创建伸缩组、设定规则和监控指标。文中还提供了一个Python脚本示例,并强调了优化策略,如应用无状态设计、考虑冷却时间和结合云监控。通过实践和调整,企业可以有效应对业务波动。
159 5
|
弹性计算 缓存 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(二)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(二)
202 0

热门文章

最新文章