K8s HPA(自动伸缩)解读
作者:大新屋
HPA(HorizontalPodAutoscaler)根据CPU/内存使用率自动调整Pod数量,实现水平扩展,与垂直扩展不同,需安装MetricsServer,支持Deployment、StatefulSet等资源,但不适用于DaemonSet
HPA简介
提示:Kubernetes官方HPA说明文档 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale
在 Kubernetes 中,HPA(Horizontal Pod Autoscaler)自动伸缩工作负载资源 (例如Deployment、StatefulSet等), 目的是自动伸缩工作负载以满足需求。水平扩展意味着对增加的负载的响应是部署更多的pod。这与垂直扩展不同,垂直扩展对于Kubernetes来说意味着将更多的资源(例如:内存或CPU)分配给已经为工作负载运行的pod。如果负载减少,并且pod的数量高于配置的最小值,则HPA会指示工作负载资源(Deployment、StatefulSet或其他类似资源)缩减。
在新版的Kubernetes中系统资源的采集均使用Metrics Server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。HPA通过Metrics采集Pod资源的内存、CPU等使用情况,如果发现某个Pod资源硬件资源负载过高或过低,会自动伸缩Pod资源,以达到Pod硬件资源的负载均衡。
一、HPA接口类型
- v1 # 稳定版自动水平伸缩,只支持CPU指标
- v2beta1 # 支持CPU、内存和自定义指标
- v2beta2 # 支持CPU、内存、自定义指标Custom和额外指标ExternalMetrics
### 查看K8s集群是否已安装部署Metrics Server root@k8s-master01:~# kubectl get pods -n kube-system -o wide| grep metrics-server metrics-server-5f9cfc9f9-7kkf4 1/1 Running 2 (4d5h ago) 4d23h 172.30.122.133 k8s-master02 <none> <none> ### 查看K8s集群所支持的HPA接口类型 root@k8s-master01:~# kubectl api-resources | grep HorizontalPodAutoscaler horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
二、基于CPU使用率创建HPA
- 注意:水平pod自动缩放无法缩放的对象,例如:守护进程类的工作负载DaemonSet
- 注意:K8s集群必须安装部署Metrics Server才可以使用HPA功能
- 注意:HPA是根据Delpoyment工作负载.spec.resources.requests参数实现自动伸缩
1、Deployment resources参数说明
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: default spec: replicas: 1 selector: matchLabels: run: nginx-pod template: metadata: name: nginx labels: run: nginx-pod spec: containers: - name: nginx01 image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24 imagePullPolicy: IfNotPresent ports: - containerPort: 80 resources: # 配置Pod资源请求和资源限制 requests: # 配置Pod资源请求 cpu: 10m # 配置CPU资源请求10m(毫核),1颗物理CPU等于1000m memory: 64Mi # 配置内存资源请求64M limits: # 配置Pod资源限制 cpu: 100m # 配置CPU资源限制100m(毫核) ,1颗物理CPU等于1000m memory: 128Mi # 配置内存资源限制128M
2、创建Deployment
cat > /data/yaml/hpa/deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: default spec: replicas: 1 selector: matchLabels: run: nginx-pod template: metadata: name: nginx labels: run: nginx-pod spec: containers: - name: nginx01 image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24 imagePullPolicy: IfNotPresent ports: - containerPort: 80 resources: requests: cpu: 10m memory: 64Mi limits: cpu: 100m memory: 128Mi EOF kubectl create -f /data/yaml/hpa/deployment.yaml kubectl get pods -n default -owide kubectl get deploy -n default
3、创建Service暴露 Nginx服务80端口
### 创建Service kubectl get deploy -n default kubectl expose deploy nginx-deploy --port=80 kubectl get service -n default –owide ### 访问Nginx 80端口 curl 10.96.249.147
4、查看当前Pod资源使用率
kubectl top pods -n default
5、HPA参数说明
apiVersion: autoscaling/v2 # 填写API资源版本号,通过kubectl api-resources | grep HorizontalPodAutoscaler命令查询API资源版本号 kind: HorizontalPodAutoscaler # 指定资源类型,HorizontalPodAutoscaler资源类型是HorizontalPodAutoscaler metadata: # 包含HorizontalPodAutoscaler的元数据 name: nginx-deploy-hpa # 自定义HorizontalPodAutoscaler的名称 namespace: default # 指定HPA运行的命名空间,与Deployment命名空间相同,默认default spec: scaleTargetRef: # 指定HPA要监控的目标,包括API版本、类型(如Deployment)、名称 apiVersion: apps/v1 # 指定要监控目标的Deployment API资源版本号 kind: Deployment # 指定要监控目标的Deployment资源类型 name: nginx-deploy # 指定要监控目标Deployment的名称 minReplicas: 1 # Pod副本的最小数量 maxReplicas: 10 # Pod副本的最大数量 metrics: # 定义触发Pod数量调整的指标 - type: Resource # 指标类型,如Resource(资源使用率)或Pods(基于Pods的数量) resource: name: cpu # 资源名称,如cpu或memory target: type: Utilization # 目标类型,如Unilization(利用率)或AverageValue(平均值) averageUtilization: 50 # 目标利用率百分比(例如 50表示50%) # averageValue: 100Mi # 目标平均值(例如100Mi表示100MB)
6、创建HPA(根据CPU使用率)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF' apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-deploy-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deploy minReplicas: 1 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 EOF kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml kubectl get hpa -n default
7、创建HPA(根据CPU平均值)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF' apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-deploy-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deploy minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: AverageValue averageValue: 50m EOF kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml kubectl get hpa -n default
8、创建HPA(根据Memory使用率)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF' apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-deploy-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deploy minReplicas: 1 maxReplicas: 5 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 50 EOF kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml kubectl get hpa -n default
9、创建HPA(根据Memory平均值)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF' apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-deploy-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deploy minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: memory target: type: AverageValue averageValue: 6Mi EOF kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml kubectl get hpa -n default
10、模拟压力测试Nginx容器
### 当前只运行了一个Pod root@k8s-master01:~# kubectl get pod -n default NAME READY STATUS RESTARTS AGE nginx-deploy-6998946c5b-g2h8c 1/1 Running 0 64m ### 查看Deployment Service root@k8s-master01:~# kubectl get service -n default | grep nginx-deploy nginx-deploy ClusterIP 10.96.249.147 <none> 80/TCP 37m ### 模拟压力测试Nginx容器 while true; do wget -q -O- http://10.96.249.147 > /dev/null; done ### 打开另一个窗口查看Pod CPU资源使用率和自动伸缩 for i in `seq 100`;do sleep 2;kubectl top pods;kubectl get pods -n default;echo;done
11、使用kubectl autoscale命令创建HPA
--cpu-percent=50 # 指定 Deployment 目标 CPU 使用率百分比 --min=1 # 指定 Deployment 应具有的最小副本数。即使 CPU 利用率很低,水平 Pod 自动缩放器也不会将 Deployment 缩小到此数值以下 --max=5 # 指定 Deployment 应具有的最大副本数。如果 CPU 利用率非常高,水平 Pod 自动缩放器也不会将 Deployment 扩展到此数值以上 kubectl autoscale deploy nginx-deploy --cpu-percent=50 --min=1 --max=5 kubectl get hpa -n default
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。