WEBKT

手把手教你用 Kubernetes HPA 实现 Deployment 自动伸缩(附配置示例)

21 0 0 0

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。

云原生小当家 KubernetesHPA自动伸缩

评论点评

打赏赞助
sponsor

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

分享

QRcode

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