前提条件
安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供
文档:https://github.com/kubernetes-sigs/metrics-server?tab=readme-ov-file#readme
-
快速自动缩放,每15秒收集一次指标(可配置)。
资源效率,为集群中的每个节点使用1 milli核心CPU和2 MB内存。
可扩展支持多达5000个节点群集。
需要替换成国内的阿里云镜像::
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4
在yaml文件中的 增加 :–kubelet-insecure-tls 跳过TLS(生产环境不建议使用次参数)
生产中建议:启用TLS Bootstrap 证书签发
containers:- args:...- --kubelet-insecure-tls
工作流程
HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。PAH属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数。
HorizontalPodAutoscaler 控制器访问支持扩缩的相应工作负载资源(例如:Deployment 和 StatefulSet)。 这些资源每个都有一个名为 scale
的子资源,该接口允许你动态设置副本的数量并检查它们的每个当前状态。 有关 Kubernetes API 子资源的一般信息
缩扩容算法:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/
#ceil函数表示返回大于或者等于指定表达式的最小整数
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
支持指标:
resource: 核心指标,包含**cpu和memory**两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)
object: k8s内置对象的特定指标(需自己实现适配器)
pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)
external: 非k8s内置对象的自定义指标(需自己实现适配器)
部署测试
1.部署一个测试服务
apiVersion: apps/v1
kind: Deployment
metadata:name: php
spec:selector:matchLabels:run: php-apachereplicas: 1template:metadata:labels:run: php-apachespec:containers:- name: php-apacheimage: nginxports:- containerPort: 80resources:limits:cpu: 500mrequests:cpu: 200m
---
apiVersion: v1
kind: Service
metadata:name: php-apachelabels:run: php-apache
spec:ports:- port: 80selector:run: php
2.创建一个PHA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: php-apachenamespace: default
spec:maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:averageUtilization: 10type: Utilization- type: Resourceresource:name: memorytarget:averageValue : 200Mitype: AverageValueminReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: php-apache######或者通过 创建HPA
kubectl autoscale <ResouceType> <ResourceName> --cpu-percent=50 --min=1 --max=10
#例子:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
#表示按照资源的百分比
metrics:- resource:name: cputarget:averageUtilization: 10type: Utilization
#如果是想采用绝对值采用
metrics:- resource:name: cputarget:averageValue : 10type: AverageValue
3.压力测试
#启动一个容器循环调用后台服务,模拟压测 http://10.233.26.224 改为后端svc地址
kubectl run -i --tty load-generator2 --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://10.233.26.224; done"
4.观察deployment 的pod的变化以及PHA的变化
#观察pha
kubectl get pha --watch
#观察pod
kubectl get po