手把手教你用 Kubernetes HPA 实现 Deployment 自动伸缩(附配置示例)
HPA 是什么?
前提条件
步骤 1:创建 Deployment
步骤 2:创建 HPA
步骤 3:测试 HPA
HPA 配置详解
基于内存利用率伸缩
基于自定义指标伸缩
总结
在云原生应用中,自动伸缩能力至关重要。当应用负载增加时,自动增加 Pod 副本数以应对流量高峰;当负载降低时,自动减少 Pod 副本数以节省资源。Kubernetes 的 Horizontal Pod Autoscaler (HPA) 就是实现这一目标的利器。本文将带你了解如何使用 HPA 自动调整 Deployment 的副本数量,并提供一个基于 CPU 利用率的伸缩示例。
HPA 是什么?
HPA 会定期监控 Deployment 或 ReplicaSet 中 Pod 的资源使用情况,例如 CPU 或内存利用率。如果实际利用率超过或低于预设的目标值,HPA 会自动调整 Pod 的副本数量,以维持应用性能和资源利用率的平衡。
前提条件
已安装 Kubernetes 集群 (例如 Minikube, Kind, 或云厂商提供的 Kubernetes 服务)
kubectl 命令行工具已配置并连接到集群
metrics-server 已安装(用于提供资源指标)
metrics-server 是一个集群范围的资源使用情况数据聚合器。可以通过以下命令安装:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
安装完成后,等待一段时间,确保 metrics-server 正常运行:
kubectl get deployment metrics-server -n kube-system
如果 STATUS 列显示
Available
,则表示 metrics-server 已经准备就绪。
步骤 1:创建 Deployment
首先,我们需要创建一个 Deployment 作为示例。这里我们使用一个简单的 Nginx Deployment:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 resources: requests: cpu: 100m memory: 256Mi limits: cpu: 200m memory: 512Mi
这个 Deployment 定义了一个 Nginx Pod,并设置了 CPU 和内存的 requests 和 limits。requests
定义了 Pod 启动时请求的最小资源,limits
定义了 Pod 可以使用的最大资源。
使用以下命令创建 Deployment:
kubectl apply -f nginx-deployment.yaml
步骤 2:创建 HPA
接下来,我们创建一个 HPA 来自动伸缩 Nginx Deployment。以下是一个 HPA 的配置示例:
# nginx-hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
这个 HPA 配置的含义如下:
scaleTargetRef
:指定要伸缩的目标对象,这里是名为nginx-deployment
的 Deployment。minReplicas
:最小副本数为 1。maxReplicas
:最大副本数为 10。metrics
:定义伸缩的指标。这里使用 CPU 利用率,目标是 50%。这意味着 HPA 会尝试维持所有 Pod 的 CPU 平均利用率在 50% 左右。
使用以下命令创建 HPA:
kubectl apply -f nginx-hpa.yaml
步骤 3:测试 HPA
现在,我们可以测试 HPA 是否正常工作。为了模拟 CPU 负载,我们可以使用 busybox
镜像创建一个 Pod,并运行一个 CPU 密集型任务:
# busybox-pod.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - name: busybox image: busybox command: ['sh', '-c', 'while true; do yes > /dev/null; done']
创建 Pod:
kubectl apply -f busybox-pod.yaml
这个 Pod 会持续占用 CPU 资源,从而触发 HPA 的伸缩机制。
过一段时间后,可以通过以下命令查看 HPA 的状态:
kubectl get hpa nginx-hpa
输出结果类似于:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-deployment 150%/50% 1 10 3 1m
TARGETS
列显示了当前的 CPU 利用率(150%)和目标利用率(50%)。REPLICAS
列显示了当前的 Pod 副本数(3)。可以看到,由于 CPU 利用率超过了目标值,HPA 自动增加了 Pod 的副本数量。
删除 busybox pod 停止施加负载:
kubectl delete pod busybox
过一段时间后,HPA 会检测到 CPU 利用率降低,并自动减少 Pod 的副本数量。
HPA 配置详解
除了 CPU 利用率,HPA 还可以基于其他指标进行伸缩,例如内存利用率、自定义指标等。
基于内存利用率伸缩
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80
这个 HPA 配置会根据内存利用率进行伸缩,目标是 80%。
基于自定义指标伸缩
如果需要基于自定义指标进行伸缩,需要使用 Custom Metrics API 或 External Metrics API。这需要更复杂的配置,超出本文范围,可以参考 Kubernetes 官方文档。
总结
本文介绍了如何使用 Kubernetes HPA 实现 Deployment 的自动伸缩,并提供了一个基于 CPU 利用率的伸缩示例。HPA 是一个强大的工具,可以帮助你构建弹性、可扩展的云原生应用。通过合理配置 HPA,可以根据实际负载自动调整 Pod 的副本数量,从而优化资源利用率和应用性能。
希望本文能帮助你理解和使用 Kubernetes HPA。