HorizontalPodAutoscaler 实战演练

半兽人 发表于: 2024-05-11   最后更新时间: 2024-05-11 19:06:51  
{{totalSubscript}} 订阅, 77 游览

本案例利用 Kubernetes 官方提供的 Metrics Server 中的 CPU 指标,进行自动扩缩容测试。

准备工作

确保metrics-server已经安装。

Kubernetes Metrics Server 从集群中的 kubelets 收集资源指标,并通过 Kubernetes API 公开这些指标,使用 APIService 添加代表指标读数的新资源。

运行 php-apache 服务器并暴露服务

首先启动一个 Deployment 用 hpa-example 镜像运行一个容器, 然后使用以下清单文件将其暴露为一个 服务(Service):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

创建 HorizontalPodAutoscaler

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
  name: php-apache-hpa
  namespace: my-space
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  targetCPUUtilizationPercentage: 50

或通过命令创建:

kubectl autoscale deployment php-apache-hpa -n my-space --cpu-percent=50 --min=1 --max=10

你可以通过运行以下命令检查新制作的 HorizontalPodAutoscaler 的当前状态:

# kubectl get hpa

输出类似于:

NAME         REFERENCE                     TARGET    MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   0% / 50%  1

增加负载

接下来,看看自动扩缩器如何对增加的负载做出反应。为此,你将启动一个不同的 Pod 作为客户端。 客户端 Pod 中的容器在无限循环中运行,向 php-apache 服务发送查询。

# 在单独的终端中运行它
# 以便负载生成继续,你可以继续执行其余步骤
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
# 准备好后按 Ctrl+C 结束观察
kubectl get hpa php-apache --watch

一分钟时间左右之后,通过以下命令,我们可以看到 CPU 负载升高了;例如:

NAME         REFERENCE                     TARGET      MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   305% / 50%  1         10        1          3m

然后,多个副本被创建。如:

NAME         REFERENCE                     TARGET      MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   305% / 50%  1         10        7          3m

这时,由于请求增多,CPU 利用率已经升至请求值的 305%。 可以看到,Deployment 的副本数量已经增长到了 7:

kubectl get deployment php-apache

你应该会看到与 HorizontalPodAutoscaler 中的数字与副本数匹配

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   7/7      7           7           19m

停止产生负载

要完成该示例,请停止发送负载。

在我们创建 busybox 容器的终端中,输入 <Ctrl> + C 来终止负载的产生。

然后验证结果状态(大约一分钟后):

# 准备好后按 Ctrl+C 结束观察
kubectl get hpa php-apache --watch

输出类似于:

NAME         REFERENCE                     TARGET       MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   0% / 50%     1         10        1          11m

Deployment 也显示它已经缩小了:

kubectl get deployment php-apache
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   1/1     1            1           27m

一旦 CPU 利用率降至 0,HPA 会自动将副本数缩减为 1。

自动扩缩完成副本数量的改变可能需要几分钟的时间。

更新于 2024-05-11

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章