基于 CPU 使用率的 Kubernetes HPA 自动伸缩实战:配置、监控与最佳实践
1. HPA 工作原理
2. 前提条件
3. 部署 Metrics Server
4. 创建 Deployment
5. 创建 HPA
6. 验证 HPA
7. 模拟负载
8. 高级配置
9. 最佳实践
10. 总结
Kubernetes 的 Horizontal Pod Autoscaler (HPA) 能够根据 CPU 使用率等指标自动调整 Pod 的数量,从而应对流量高峰,提高资源利用率。本文将详细介绍如何使用 HPA 基于 CPU 使用率自动伸缩 Pod 数量,包括配置参数、监控指标以及最佳实践。
1. HPA 工作原理
HPA 通过周期性地监控 Deployment、ReplicaSet 或 ReplicationController 管理的 Pod 的 CPU 使用率,并与预设的目标值进行比较。如果实际 CPU 使用率超过目标值,HPA 就会增加 Pod 的数量;反之,则会减少 Pod 的数量。HPA 的调整过程是一个动态平衡的过程,它会不断地根据实际情况调整 Pod 的数量,以使 CPU 使用率尽可能接近目标值。
2. 前提条件
- 已安装 Kubernetes 集群(版本 >= 1.8,推荐 >= 1.10,以支持 autoscaling/v2beta2 API)。
- 集群中已部署 Metrics Server 或 Prometheus 等监控系统,用于收集 CPU 使用率等指标。
- kubectl 命令行工具已配置并能连接到 Kubernetes 集群。
3. 部署 Metrics Server
Metrics Server 是 Kubernetes 官方提供的资源监控工具,它可以从 kubelet 收集 CPU、内存等指标,并提供给 HPA 使用。部署 Metrics Server 的步骤如下:
下载 Metrics Server 的部署文件:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
修改
components.yaml
文件,添加--kubelet-insecure-tls
和--kubelet-preferred-address-types=InternalIP,Hostname
参数。这是因为某些 Kubernetes 集群的 kubelet 证书不受信任,需要跳过证书验证,并指定 kubelet 的首选地址类型。containers: - args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname image: registry.k8s.io/metrics-server/metrics-server:v0.6.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /livez port: https scheme: HTTPS periodSeconds: 10 name: metrics-server ports: - containerPort: 4443 name: https protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /readyz port: https scheme: HTTPS periodSeconds: 10 securityContext: readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1001 volumeMounts: - mountPath: /tmp name: tmp-dir 部署 Metrics Server:
kubectl apply -f components.yaml
验证 Metrics Server 是否正常运行:
kubectl get deployment metrics-server -n kube-system kubectl get pods -n kube-system -l k8s-app=metrics-server kubectl top node kubectl top pod
4. 创建 Deployment
接下来,我们需要创建一个 Deployment,用于部署我们的应用程序。这里我们使用一个简单的 Nginx Deployment 作为示例:
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: 200Mi limits: cpu: 200m memory: 400Mi
注意:
resources.requests
和resources.limits
是非常重要的配置,它们分别指定了 Pod 运行所需的最小资源和最大资源。HPA 会根据resources.requests.cpu
的值来计算 CPU 使用率。- 建议根据实际情况为 Pod 设置合理的
resources.requests
和resources.limits
,避免资源浪费或 Pod 被 OOMKilled。
5. 创建 HPA
有了 Deployment 之后,我们就可以创建 HPA 了。HPA 的配置如下:
apiVersion: autoscaling/v2beta2 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
参数解释:
scaleTargetRef
:指定 HPA 管理的目标对象,这里是nginx-deployment
Deployment。minReplicas
:最小 Pod 数量。maxReplicas
:最大 Pod 数量。metrics
:指定 HPA 监控的指标,这里是 CPU 使用率。type: Resource
:表示监控的是资源指标,例如 CPU、内存。resource.name: cpu
:指定监控的资源为 CPU。target.type: Utilization
:表示目标值为 CPU 使用率。target.averageUtilization: 50
:指定目标 CPU 使用率为 50%。这意味着 HPA 会尝试将所有 Pod 的平均 CPU 使用率维持在 50% 左右。
6. 验证 HPA
创建 HPA 后,可以使用以下命令查看 HPA 的状态:
kubectl get hpa nginx-hpa
输出结果类似于:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-deployment 0%/50% 1 10 1 2m
TARGETS
:显示当前的 CPU 使用率和目标 CPU 使用率。例如,0%/50%
表示当前的 CPU 使用率为 0%,目标 CPU 使用率为 50%。REPLICAS
:显示当前的 Pod 数量。
可以使用以下命令查看 HPA 的详细信息:
kubectl describe hpa nginx-hpa
7. 模拟负载
为了验证 HPA 是否正常工作,我们可以使用 stress
工具模拟 CPU 负载。首先,我们需要进入其中一个 Nginx Pod:
kubectl exec -it <pod-name> -- bash
然后,安装 stress
工具:
apt-get update apt-get install -y stress
最后,运行 stress
命令,模拟 CPU 负载:
stress --cpu 2 --timeout 600
这条命令会启动 2 个 CPU 密集型进程,持续 600 秒。观察 HPA 的状态,可以看到 TARGETS
中的 CPU 使用率逐渐升高,REPLICAS
中的 Pod 数量也随之增加。
8. 高级配置
除了上述基本配置外,HPA 还支持一些高级配置,例如:
- 使用多个指标: HPA 可以同时监控多个指标,例如 CPU 使用率和内存使用率。当任何一个指标超过目标值时,HPA 就会进行扩容。
- 自定义指标: HPA 可以监控自定义指标,例如 QPS、请求延迟等。这需要使用 Prometheus Adapter 或其他自定义指标适配器。
- 行为调整: HPA 允许用户自定义扩容和缩容的行为,例如设置扩容和缩容的步长、冷却时间等。
9. 最佳实践
- 合理设置
resources.requests
和resources.limits
: 这对于 HPA 的正常工作至关重要。建议根据实际情况为 Pod 设置合理的资源限制,避免资源浪费或 Pod 被 OOMKilled。 - 选择合适的监控指标: CPU 使用率是一个常用的监控指标,但并非所有应用都适合使用 CPU 使用率作为扩缩容的依据。建议根据应用的特点选择合适的监控指标,例如 QPS、请求延迟等。
- 调整 HPA 参数:
minReplicas
、maxReplicas
和targetAverageUtilization
等参数会影响 HPA 的扩缩容行为。建议根据实际情况调整这些参数,以达到最佳的性能和资源利用率。 - 监控 HPA 的状态: 定期检查 HPA 的状态,确保其正常工作。可以使用
kubectl get hpa
和kubectl describe hpa
命令查看 HPA 的状态信息。
10. 总结
本文详细介绍了如何使用 Kubernetes 的 Horizontal Pod Autoscaler (HPA) 基于 CPU 使用率自动伸缩 Pod 数量。通过本文的学习,读者可以快速上手 HPA,并将其应用于实际生产环境中,从而提高应用的可用性和资源利用率。