<返回目录     Powered by claud/xia兄

第12课: 自动扩缩容

HPA、VPA、CA的配置与最佳实践

学习目标

自动扩缩容的基本概念

自动扩缩容是Kubernetes中根据应用负载自动调整资源的机制。Kubernetes提供了三种主要的自动扩缩容方式:

自动扩缩容工作流程

监控指标 → 评估负载 → 计算所需资源 → 执行扩缩容操作

Horizontal Pod Autoscaler (HPA)

HPA的工作原理

HPA通过监控Pod的CPU、内存使用率或自定义指标,根据预设的目标值自动调整Pod副本数量。

HPA配置示例

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  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

基于自定义指标的HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests-per-second
      target:
        type: AverageValue
        averageValue: 100m

Vertical Pod Autoscaler (VPA)

VPA的工作原理

VPA通过分析Pod的资源使用情况,自动调整Pod的CPU和内存资源请求和限制,以优化资源利用率。

VPA配置示例

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: nginx-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  updatePolicy:
    updateMode: "Auto"  # 可选: "Off", "Initial", "Recreate", "Auto"
  resourcePolicy:
    containerPolicies:
    - containerName: nginx
      minAllowed:
        cpu: 100m
        memory: 256Mi
      maxAllowed:
        cpu: 1
        memory: 2Gi
      controlledResources: ["cpu", "memory"]

Cluster Autoscaler (CA)

CA的工作原理

CA通过监控集群中的Pod调度情况,当发现有Pod因资源不足而无法调度时,自动向集群中添加新节点;当发现节点资源利用率过低时,自动从集群中移除节点。

CA配置示例

Cluster Autoscaler通常在集群创建时配置,或通过云提供商的管理控制台进行配置。以下是在AWS EKS中启用Cluster Autoscaler的示例:

# 部署Cluster Autoscaler
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

# 修改Cluster Autoscaler部署,添加集群名称
eksca=$(kubectl get deploy -n kube-system cluster-autoscaler -o name)
kubectl patch $eksca -n kube-system --type=strategic --patch '{"spec":{"template":{"spec":{"containers":[{"name":"cluster-autoscaler","args":["--v=4","--stderrthreshold=info","--cloud-provider=aws","--skip-nodes-with-local-storage=false","--expander=least-waste","--node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/"]}]}}}'

命令行操作

# 查看HPA
kubectl get hpa
kubectl get hpa -n <namespace>

# 查看HPA详情
kubectl describe hpa <hpa-name>

# 创建HPA
kubectl autoscale deployment <deployment-name> --cpu-percent=50 --min=2 --max=10

# 通过YAML创建HPA
kubectl apply -f hpa.yaml

# 删除HPA
kubectl delete hpa <hpa-name>

# 查看VPA
kubectl get vpa
kubectl describe vpa <vpa-name>

# 查看CA状态
kubectl get deploy cluster-autoscaler -n kube-system
kubectl logs deploy/cluster-autoscaler -n kube-system

基于自定义指标的扩缩容

除了CPU和内存使用率外,HPA还支持基于自定义指标进行扩缩容,如请求数、队列长度等。要使用自定义指标,需要部署Metrics Server或Prometheus Adapter。

# 部署Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 验证Metrics Server是否正常运行
kubectl get apiservices | grep metrics
kubectl top nodes
kubectl top pods
最佳实践:

常见问题与解决方案

问题1:HPA不触发扩缩容

可能原因:

解决方案:检查Metrics Server状态,确保Pod设置了资源请求,验证指标数据是否正确收集

问题2:扩缩容过于频繁

可能原因:负载波动较大,扩缩容阈值设置过于敏感

解决方案:调整扩缩容阈值,增加扩缩容的冷却期,考虑使用更稳定的指标

问题3:Pod无法成功扩缩容

可能原因:集群资源不足,Pod调度失败

解决方案:使用Cluster Autoscaler自动扩容集群,或手动添加节点

实践练习

练习任务:
  1. 基础练习:为一个Deployment创建HPA,基于CPU使用率进行扩缩容
  2. 进阶练习:配置基于内存使用率和自定义指标的HPA
  3. 挑战练习:部署和配置VPA,观察其对Pod资源配置的调整
  4. 综合练习:设计并实现一个完整的自动扩缩容方案,包括HPA、VPA和CA的配置

总结

自动扩缩容是Kubernetes中实现应用高可用性和资源优化的重要机制,通过合理配置自动扩缩容策略,可以:

在实际应用中,需要根据应用的特性和需求,选择合适的自动扩缩容方式,并进行合理的配置。自动扩缩容策略的设计应该考虑应用的负载特性、资源需求、响应时间要求等因素。