Kubernetes教程FG068-Kubernetes水平Pod自动缩放(HPA)实战
内容简介
本篇文章主要介绍Kubernetes中水平Pod自动缩放(HPA)的配置与使用方法。风哥教程参考Kubernetes官方文档HPA相关内容,结合生产环境实际操作场景,详细讲解HPA的配置方法、缩放策略以及最佳实践。
目录大纲
Part01-基础概念与理论知识
1.1 HPA概述
水平Pod自动缩放(Horizontal Pod Autoscaler,HPA)是Kubernetes中用于自动调整Pod数量的控制器,它可以:
- 根据资源使用情况自动缩放:根据CPU、内存等资源的使用情况自动调整Pod数量
- 维持应用性能:当负载增加时,自动增加Pod数量;当负载减少时,自动减少Pod数量
- 提高资源利用率:根据实际需求分配资源,避免资源浪费
1.2 HPA工作原理
HPA的工作原理如下:
- 监控指标:定期收集Pod的资源使用指标
- 计算需求:根据设定的目标值计算所需的Pod数量
- 调整副本数:根据计算结果调整Deployment或ReplicaSet的副本数
- 持续监控:持续监控资源使用情况,动态调整Pod数量
Part02-生产环境规划与建议
2.1 自动缩放策略
- 目标值设置:
- CPU:一般设置为50-70%,避免资源浪费和性能下降
- 内存:一般设置为60-80%,考虑内存使用的特性
- 缩放范围:
- 最小副本数:确保基本可用性
- 最大副本数:考虑集群资源限制
- 缩放行为:
- 缩放冷却时间:避免频繁缩放
- 缩放步长:控制每次缩放的数量
,风哥提示:。
2.2 资源配置建议
- 设置资源请求和限制:为Pod设置合理的资源请求和限制
- 配置监控:确保监控系统正常工作,提供准确的指标数据
- 测试缩放策略:在生产环境部署前,测试缩放策略的有效性
- 考虑应用启动时间:对于启动时间较长的应用,应适当调整缩放策略
Part03-生产环境项目实施方案
3.1 HPA配置
配置HPA,风哥提示:。
创建Deployment
# 创建Deployment配置文件
[root@fgedu-master ~]# cat > deployment-hpa.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-app namespace: default spec: replicas: 3 selector: matchLabels: app: fgedu-app template: metadata: labels: app: fgedu-app spec: containers: - name: fgedu-app image: nginx:latest ports: - containerPort: 80 resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi EOF
[root@fgedu-master ~]# cat > deployment-hpa.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-app namespace: default spec: replicas: 3 selector: matchLabels: app: fgedu-app template: metadata: labels: app: fgedu-app spec: containers: - name: fgedu-app image: nginx:latest ports: - containerPort: 80 resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi EOF
# 应用Deployment配置
[root@fgedu-master ~]# kubectl apply -f deployment-hpa.yaml
[root@fgedu-master ~]# kubectl apply -f deployment-hpa.yaml
deployment.apps/fgedu-app created
创建HPA
# 创建HPA配置文件
[root@fgedu-master ~]# cat > hpa.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: fgedu-hpa,学习交流加群风哥微信: itpux-com。 namespace: default spec:scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fgedu-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 EOF
[root@fgedu-master ~]# cat > hpa.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: fgedu-hpa,学习交流加群风哥微信: itpux-com。 namespace: default spec:scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fgedu-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 EOF
# 应用HPA配置
[root@fgedu-master ~]# kubectl apply -f hpa.yaml
[root@fgedu-master ~]# kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/fgedu-hpa created
查看HPA状态
# 查看HPA状态
[root@fgedu-master ~]# kubectl get hpa
[root@fgedu-master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
fgedu-hpa Deployment/fgedu-app 0%/50% 2 10 3 1m
fgedu-hpa Deployment/fgedu-app 0%/50% 2 10 3 1m
3.2 基于CPU的自动缩放
测试基于CPU的自动缩放。
增加负载
# 创建负载测试Pod
[root@fgedu-master ~]# kubectl run -i –tty load-generator –image=busybox /bin/sh
[root@fgedu-master ~]# kubectl run -i –tty load-generator –image=busybox /bin/sh
# 在负载测试Pod中执行负载测试
/ # while true; do wget -q -O- http://fgedu-app.default.svc.cluster.local; done
/ # while true; do wget -q -O- http://fgedu-app.default.svc.cluster.local; done
查看HPA状态
# 查看HPA状态
[root@fgedu-master ~]# kubectl get hpa -w
[root@fgedu-master ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
fgedu-hpa Deployment/fgedu-app 0%/50% 2 10 3 1m
fgedu-hpa Deployment/fgedu-app 30%/50% 2 10 3 2m
fgedu-hpa Deployment/fgedu-app 60%/50% 2 10 3 3m
fgedu-hpa Deployment/fgedu-app 70%/50% 2 10 5 4m
fgedu-hpa Deployment/fgedu-app 65%/50% 2 10 7 5m
fgedu-hpa Deployment/fgedu-app 55%/50% 2 10 8 6m
fgedu-hpa Deployment/fgedu-app 50%/50% 2 10 10 7m
fgedu-hpa Deployment/fgedu-app 0%/50% 2 10 3 1m
fgedu-hpa Deployment/fgedu-app 30%/50% 2 10 3 2m
fgedu-hpa Deployment/fgedu-app 60%/50% 2 10 3 3m
fgedu-hpa Deployment/fgedu-app 70%/50% 2 10 5 4m
fgedu-hpa Deployment/fgedu-app 65%/50% 2 10 7 5m
fgedu-hpa Deployment/fgedu-app 55%/50% 2 10 8 6m
fgedu-hpa Deployment/fgedu-app 50%/50% 2 10 10 7m
3.3 基于内存的自动缩放
配置基于内存的自动缩放。
更新HPA配置
,学习交流加群风哥QQ113257174。
# 更新HPA配置
[root@fgedu-master ~]# cat > hpa-memory.yaml << EOFapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: fgedu-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fgedu-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 EOF
# 更新HPA配置
[root@fgedu-master ~]# cat > hpa-memory.yaml << EOFapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: fgedu-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fgedu-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 EOF
# 应用HPA配置
[root@fgedu-master ~]# kubectl apply -f hpa-memory.yaml
[root@fgedu-master ~]# kubectl apply -f hpa-memory.yaml
horizontalpodautoscaler.autoscaling/fgedu-hpa configured
Part04-生产案例与实战讲解
4.1 企业级应用自动缩放
某企业需要为其Web应用配置自动缩放,以应对不同时段的流量变化。
案例背景
- 应用类型:Web应用,基于Nginx
- 流量模式:
- 高峰期:每秒1000个请求
- 低峰期:每秒100个请求
- 响应时间要求:P95响应时间小于500ms
部署方案
# 1. 创建Deployment
cat > deployment-webapp.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: webapp namespace: fgedu-production spec: replicas: 5 selector: matchLabels: app: webapp template: metadata:,更多视频教程www.fgedu.net.cn。 labels: app: webapp spec: containers: - name: webapp image: nginx:latest ports: - containerPort: 80 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 1000m memory: 1024Mi EOF # 应用Deployment配置 kubectl apply -f deployment-webapp.yaml # 2. 创建HPA cat > hpa-webapp.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: webapp-hpa namespace: fgedu-production spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: webapp minReplicas: 5 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 behavior: scaleUp: stabilizationWindowSeconds: 60 policies: - type: Pods value: 5 periodSeconds: 60 scaleDown: stabilizationWindowSeconds: 300 policies: - type: Pods value: 3 periodSeconds: 60 EOF # 应用HPA配置 kubectl apply -f hpa-webapp.yaml # 3. 监控HPA状态 kubectl get hpa -n fgedu-production -w
cat > deployment-webapp.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: webapp namespace: fgedu-production spec: replicas: 5 selector: matchLabels: app: webapp template: metadata:,更多视频教程www.fgedu.net.cn。 labels: app: webapp spec: containers: - name: webapp image: nginx:latest ports: - containerPort: 80 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 1000m memory: 1024Mi EOF # 应用Deployment配置 kubectl apply -f deployment-webapp.yaml # 2. 创建HPA cat > hpa-webapp.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: webapp-hpa namespace: fgedu-production spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: webapp minReplicas: 5 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 behavior: scaleUp: stabilizationWindowSeconds: 60 policies: - type: Pods value: 5 periodSeconds: 60 scaleDown: stabilizationWindowSeconds: 300 policies: - type: Pods value: 3 periodSeconds: 60 EOF # 应用HPA配置 kubectl apply -f hpa-webapp.yaml # 3. 监控HPA状态 kubectl get hpa -n fgedu-production -w
4.2 微服务架构自动缩放实战
某企业采用微服务架构,需要为各个微服务配置自动缩放。。
案例背景
- 微服务数量:5个微服务
- 流量模式:
- 用户服务:稳定流量
- 订单服务:高峰期流量大
- 支付服务:低流量
,更多学习教程公众号风哥教程itpux_com。
- 资源需求:
- 用户服务:CPU密集型
- 订单服务:内存密集型
- 支付服务:低资源需求
部署方案
# 1. 为用户服务配置HPA
[root@fgedu-master ~]# cat > hpa-user-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: user-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: user-service minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 EOF
[root@fgedu-master ~]# cat > hpa-user-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: user-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: user-service minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 EOF
# 应用HPA配置
[root@fgedu-master ~]# kubectl apply -f hpa-user-service.yaml
[root@fgedu-master ~]# kubectl apply -f hpa-user-service.yaml
# 2. 为订单服务配置HPA
[root@fgedu-master ~]# cat > hpa-order-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: order-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: order-service minReplicas: 5 maxReplicas: 15 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 EOF
[root@fgedu-master ~]# cat > hpa-order-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: order-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: order-service minReplicas: 5 maxReplicas: 15 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 EOF
# 应用HPA配置
[root@fgedu-master ~]# kubectl apply -f hpa-order-service.yaml
[root@fgedu-master ~]# kubectl apply -f hpa-order-service.yaml
,from K8S+DB视频:www.itpux.com。
。
# 3. 为支付服务配置HPA
[root@fgedu-master ~]# cat > hpa-payment-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: payment-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: payment-service minReplicas: 2 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 EOF
[root@fgedu-master ~]# cat > hpa-payment-service.yaml << EOF apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: payment-service-hpa namespace: fgedu-microservices spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: payment-service minReplicas: 2 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 EOF
# 应用HPA配置
[root@fgedu-master ~]# kubectl apply -f hpa-payment-service.yaml
[root@fgedu-master ~]# kubectl apply -f hpa-payment-service.yaml
Part05-风哥经验总结与分享
5.1 HPA配置最佳实践
- 设置合理的资源请求和限制:为Pod设置准确的资源请求和限制,确保HPA能够正确计算资源使用情况
- 选择合适的缩放指标:根据应用的特性选择合适的缩放指标,如CPU、内存或自定义指标
- 设置合理的目标值:根据应用的性能要求和资源情况设置合理的目标值
- 配置缩放行为:设置合理的缩放冷却时间和缩放步长,避免频繁缩放
- 测试缩放策略:在生产环境部署前,测试缩放策略的有效性
- 监控HPA状态:定期监控HPA的运行状态,确保其正常工作
- 考虑应用启动时间:对于启动时间较长的应用,应适当调整缩放策略
- 设置合理的副本范围:根据集群资源和应用需求设置合理的最小和最大副本数
5.2 常见问题与解决方案
问题 原因 解决方案
HPA不缩放 指标数据不可用 检查监控系统和指标数据
HPA缩放过于频繁 缩放冷却时间过短 增加缩放冷却时间
HPA缩放不足 目标值设置过高 调整目标值
HPA缩放过度 目标值设置过低 调整目标值
Pod启动时间长 应用启动时间长 调整缩放策略,增加最小副本数
资源请求设置不合理 资源请求与实际使用不符 调整资源请求设置
HPA不缩放 指标数据不可用 检查监控系统和指标数据
HPA缩放过于频繁 缩放冷却时间过短 增加缩放冷却时间
HPA缩放不足 目标值设置过高 调整目标值
HPA缩放过度 目标值设置过低 调整目标值
Pod启动时间长 应用启动时间长 调整缩放策略,增加最小副本数
资源请求设置不合理 资源请求与实际使用不符 调整资源请求设置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
