前提条件
-
已创建注册集群,具体操作参见 订购注册集群 章节。若已有集群,无需重复操作。
-
已安装cube-prometheus组件,开通应用性能监控服务,监控指标上报。参见 Prometheus监控开启监控服务。
-
已安装metrics-server插件,获取基础资源度量指标。插件安装请前往插件市场。
-
已安装cube-metrics-adapter插件,获取自定义度量指标。插件安装请前往插件市场。
支持两种类型指标:
-
基础资源度量指标,默认情况下仅支持CPU、内存这两种资源指标,不仅支持资源百分比也支持平均值;
-
自定义度量指标,包含Pod度量和Object度量两大类。
通过控制台创建HPA
-
登录分布式容器云平台控制台,在集群管理页面,点击目标集群;
-
在集群详情页面左侧导航栏,选择插件市场,根据需要的指标对象类型,安装对应的metrics-server插件、cube-metrics-adapter插件。
-
插件安装成功之后,在集群详情页面左侧导航栏,选择工作负载->无状态->更多->水平伸缩,选择伸缩的配置。

-
选择度量指标,支持两种类型:资源度量指标、自定义度量指标(Pod度量、Obeject度量)。

-
安装cube-prometheus插件,上报监控指标;
-
安装metrics-server插件获取基础资源度量指标,测试是否正确安装,返回基础度量指标:
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/xxx |jq .
以CPU配置为例,声明工作负载和HPA对象,配置如下:
---
apiVersion: v1
kind: Service
metadata:
name: hap-nginx
spec:
type: NodePort
ports:
- name: "http"
port: 80
targetPort: 80
nodePort: 30080
selector:
service: hap-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hap-nginx
spec:
replicas: 1
selector:
matchLabels:
service: hap-nginx
template:
metadata:
labels:
service: hap-nginx
spec:
containers:
- name: hap-nginx
image: registry-crs-huadong1.ctyun.cn/library/nginx:alpine
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
HPA对象
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hap-nginx
spec:
maxReplicas: 5 # 最大扩容到5个副本(pod)
minReplicas: 1 # 最小扩容1个副本(pod)
metrics:
- resource:
name: cpu
target:
averageUtilization: 40 # CPU 平均资源使用率达到40%就开始扩容,低于40%就是缩容
# 设置内存
# AverageValue:40
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hap-nginx
使用ab工具进行压测
yum install httpd -y ab -n 1000000 -c 100 http://
查看pod动态扩容
kubectl get po -w |grep hpa
-
安装cube-prometheus插件,开通应用性能服务。
-
在插件市场 安装cube-metrics-adapter插件,测试是否正确安装,返回已配置的自定义指标:
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq .
-
声明工作负载和HPA对象,以CPU利用率自定义指标为例
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-nginx
namespace: default
spec:
minReplicas: 1
maxReplicas: 5
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-nginx
metrics:
- type: Pods
pods:
metric:
name: k8s_pod_rate_cpu_core_used_node
target:
averageValue: 50
type: AverageValue
CPU预置指标
| 指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
|---|---|---|---|---|
| k8s_pod_cpu_core_used | Pod |
CPU使用量 |
核 | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) |
| k8s_pod_rate_cpu_core_used_node | Pod |
CPU利用率(占节点) |
% | (label_replace(sum(rate(container_cpu_usage_seconds_total{name =~ ".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 |
| k8s_pod_rate_cpu_core_used_request | Pod |
CPU利用率(占request) |
% | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) / (sum (kube_pod_container_resource_requests{resource="cpu",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
| k8s_pod_rate_cpu_core_used_limit | Pod |
CPU利用率(占limit) |
% | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) / (sum (kube_pod_container_resource_limits{resource="cpu",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
内存预置指标
| 指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
|---|---|---|---|---|
| k8s_pod_mem_usage_bytes | Pod | 内存使用量 | Byte | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) |
| k8s_pod_mem_no_cache_bytes | Pod | 内存使用量(不含Cache) | Byte | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) |
| k8s_pod_rate_mem_usage_node | Pod | 内存利用率(占节点) | % | (label_replace(sum(container_memory_usage_bytes{name =~ ".+",pod=~"$Pod",namespace="$namespace") by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 |
| k8s_pod_rate_mem_no_cache_node | Pod | 内存利用率(占节点,不含Cache) | % | (label_replace(sum(container_memory_working_set_bytes{name =~ ".+",pod=~"$Pod",namespace="$namespace"}) by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 |
| k8s_pod_rate_mem_usage_request | Pod | 内存利用率(占request) | % | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_requests{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
| k8s_pod_rate_mem_no_cache_request | Pod | 内存利用率(占request,不含Cache | % | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_requests{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
| k8s_pod_rate_mem_usage_limit | Pod | 内存利用率(占limit) | % | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_limits{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
| k8s_pod_rate_mem_no_cache_limit | Pod | 内存利用率(占limit,不含Cache) | % | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_limits{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
网络预置指标
| 指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
|---|---|---|---|---|
| k8s_pod_network_receive_bytes_bw | Pod | 网络入带宽 | Byte/s | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) |
| k8s_pod_network_transmit_bytes_bw | Pod | 网络出带宽 | Byte/s | sum(irate(container_network_transmit_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_network_receive_bytes | Pod | 网络入流量 | Byte/s | sum(rate(container_network_receive_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_network_transmit_bytes | Pod | 网络出流量 | Byte/s | sum(rate(container_network_transmit_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_network_receive_packets | Pod | 网络入包量 | 个/s | sum(irate(container_network_receive_packets_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_network_transmit_packets | Pod | 网络出包量 | 个/s | sum(irate(container_network_transmit_packets_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
硬盘预置指标
| 指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
|---|---|---|---|---|
| k8s_pod_fs_read_times | Pod | 硬盘读IOPS | 次/s | sum (irate(container_fs_reads_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_fs_write_times | Pod | 硬盘写IOPS | 次/s | sum (irate(container_fs_writes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
| k8s_pod_fs_read_bytes | Pod | 硬盘读流量 | Byte/s | sum (rate(container_fs_reads_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m]))by (pod) |
| k8s_pod_fs_write_bytes | Pod | 硬盘写流量 | Byte/s | sum (rate(container_fs_writes_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
如需自定义指标,请确保指标已通过cube-prometheus采集上报到应用性能服务(APM),在安装cube-metrics-adapter插件时,在values.yaml内自定义指标内容。