背景信息
从v1.18开始,K8s v2beta2 API允许通过HPA的behavior字段配置扩缩行为。在behavior字段中的scaleUp和scaleDown分别指定扩容和缩容行为。当您在使用HPA时,希望只进行扩容或者只进行缩容的Pod伸缩,则可以通过开启指标伸缩,单击禁止缩容或者禁止扩容来实现。
默认值:均不禁止
禁止扩容:selectPolicy的值Disabled会关闭给定方向的扩容。因此使用以下策略,将会阻止扩容。
behavior:
scaleUp:
selectPolicy: Disabled
禁用缩容:selectPolicy的值Disabled会关闭给定方向的缩容。因此使用以下策略,将会阻止缩容。
behavior:
scaleDown:
selectPolicy: Disabled
前提条件
已创建注册集群,具体操作参见 订购注册集群 章节。若已有集群,无需重复操作。
已安装metrics-server组件,提供metrics.k8s.io API,获取基础资源指标(单独此插件即可实现资源度量指标)
已安装metrics-adapter组件,提供custom.metrics.k8s.io API,获取自定义指标(此组件实现自定义度量指标)
已安装cube-prometheus组件,开通应用性能监控服务,监控指标上报。
伸缩规则
支持两种类型指标:
资源度量指标,默认情况下仅支持CPU、内存这两种资源指标,不仅支持资源百分比也支持平均值;
自定义度量指标,包含Pod度量和Object度量两大类。
通过控制台创建HPA
登录分布式容器云平台控制台,在集群管理页面,点击目标集群;
在集群详情页面左侧导航栏,选择工作负载->无状态->更多->水平伸缩,选择伸缩的配置。
选择度量指标,支持两种类型:资源度量指标、自定义度量指标(Pod度量、Obeject度量)。
通过Kubectl命令创建HPA
通过基础资源度量指标(CPU、内存)进行Pod的水平自动伸缩
以CPU配置为例,配置如下:
---
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
通过预置的自定义指标(网络、磁盘等)进行Pod的水平自动伸缩
参见 Pod 水平自动扩缩(HPA)-云容器引擎-用户指南-运维管理-监控 - 天翼云 和 prometheus-adapter 方案 | Kubernetes 实践指南
安装cube-prometheus插件,开通应用性能服务。
安装cube-metrics-adapter插件,填写prometheus url(该prometheus实例部署在预置区,仅支持内网通过VPCE访问)
adapter values.yaml 预定义指标+指定prometheus url
声明工作负载和HPA对象(定义与上述差不多)
预置指标列表
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) |
通过自定义度量指标进行Pod的水平自动伸缩
参见 Pod 水平自动扩缩(HPA)-云容器引擎-用户指南-运维管理-监控 - 天翼云 和 prometheus-adapter 方案 | Kubernetes 实践指南
安装cube-prometheus插件,开通应用性能服务。
业务暴露指标(针对用户自定义应用暴露指标采集上报方案,参见 单集群监控)
安装cube-metrics-adapter插件,如需自定义指标进行HPA,则在configmap中定义指标及计算公式。填写prometheus url(该prometheus实例部署在预置区,仅支持内网通过VPCE访问)
adapter values.yaml 定义指标+指定prometheus url
声明工作负载和HPA对象(定义与上述差不多)