WEBKT

基于 CPU 使用率的 Kubernetes HPA 自动伸缩实战:配置、监控与最佳实践

22 0 0 0

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 的步骤如下:

  1. 下载 Metrics Server 的部署文件:

    wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    
  2. 修改 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
  3. 部署 Metrics Server:

    kubectl apply -f components.yaml
    
  4. 验证 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.requestsresources.limits 是非常重要的配置,它们分别指定了 Pod 运行所需的最小资源和最大资源。HPA 会根据 resources.requests.cpu 的值来计算 CPU 使用率。
  • 建议根据实际情况为 Pod 设置合理的 resources.requestsresources.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.requestsresources.limits 这对于 HPA 的正常工作至关重要。建议根据实际情况为 Pod 设置合理的资源限制,避免资源浪费或 Pod 被 OOMKilled。
  • 选择合适的监控指标: CPU 使用率是一个常用的监控指标,但并非所有应用都适合使用 CPU 使用率作为扩缩容的依据。建议根据应用的特点选择合适的监控指标,例如 QPS、请求延迟等。
  • 调整 HPA 参数: minReplicasmaxReplicastargetAverageUtilization 等参数会影响 HPA 的扩缩容行为。建议根据实际情况调整这些参数,以达到最佳的性能和资源利用率。
  • 监控 HPA 的状态: 定期检查 HPA 的状态,确保其正常工作。可以使用 kubectl get hpakubectl describe hpa 命令查看 HPA 的状态信息。

10. 总结

本文详细介绍了如何使用 Kubernetes 的 Horizontal Pod Autoscaler (HPA) 基于 CPU 使用率自动伸缩 Pod 数量。通过本文的学习,读者可以快速上手 HPA,并将其应用于实际生产环境中,从而提高应用的可用性和资源利用率。

K8S探索者 KubernetesHPA自动伸缩

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/10080