验证[Kubernetes]水平Pod自动缩放器的操作

首先

这里我们想确认一下Horizontal Pod Autoscaler的运作情况。Horizontal Pod Autoscaler是一种根据CPU负载等情况自动扩展(增加)replication controller/deployment/replica set /stateful set的副本数量的功能。

(仅供参考)大规模扩展和增加规模

当要提高服务器性能时,主要有两种方式:横向扩展(Scale-out)和纵向扩展(Scale-up)。

规模扩大

扩展规模常被称为“横向扩展”。通常通过增加服务器数量来分散负载,从而提高系统的“吞吐量”。
吞吐量是指在一定时间内能够处理多少个进程。

水平Pod自动缩放器是一种能够扩展的功能。

扩大规模

在汉语中,「扩大规模」也可以称为「纵向扩展」。通常情况下,通过将CPU升级为更高性能(频率更高)的版本,可以提高系统的「响应速度」。
所谓的「响应速度」是指系统能够多快地处理一个进程。

前提条件 ( tí

要使用Horizontal Pod Autoscaler,必须预先部署metrics-server。

在集群中部署指标服务器监控以通过资源指标 API 提供指标,因为水平 Pod 自动伸缩器使用该 API 收集指标。

开始之前

以下是如何构建 metrics-server 的指南,请参考。

创建部署/服务

首先,我们将创建一个Deployment以及一个用于与外部连接的Service,这里我们将创建一个LoadBalancer。
请应用以下清单。

apiVersion: v1
kind: Service
metadata:
  name: load-balancer
spec:
  ports:
  - name: load-balancer
    port: 8080
    protocol: TCP
    targetPort: 80
    nodePort: 30002
  selector:
    app: nginx-dep
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-dep
  template:
    metadata:
      labels:
        app: nginx-dep
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 100m
            limits:
              cpu: 300m
$ kubectl apply -f nginx-hpa.yaml
service/load-balancer created
deployment.apps/nginx created
$ kubectl get svc
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
kubernetes      ClusterIP      10.96.0.1       <none>         443/TCP          93d
load-balancer   LoadBalancer   10.97.254.155   10.20.30.150   8080:30002/TCP   26s
$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-65585fc7c9-fb92v   1/1     Running   0          31s

创建水平Pod自动缩放器

对于上述创建的Deployment,我们将创建以下的水平Pod自动化缩放器。为了方便缩放,这次我们将阈值设得比较低(25%)。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 25
$ kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/nginx-hpa created
$ kubectl get horizontalpodautoscalers.autoscaling
NAME        REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx   0%/25%    1         10        1          59s

顺便说一下,Deployment需要设置limits/requests。如果未进行设置,则TARGETS的值将变为,即使负载增加也无法进行扩展,请注意。

$ kubectl get hpa
NAME        REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx   <unknown>/25%   2         10        2          12m
$ kubectl describe horizontalpodautoscalers.autoscaling nginx-hpa
Name:                                                  nginx-hpa
・・・
Events:
  Type     Reason                        Age                 From                       Message
  ----     ------                        ----                ----                       -------
  Warning  FailedComputeMetricsReplicas  18m (x12 over 21m)  horizontal-pod-autoscaler  invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: missing request for cpu
  Warning  FailedGetResourceMetric       72s (x81 over 21m)  horizontal-pod-autoscaler  missing request for cpu

确认动作

那么,我们将实际进行负载测试来验证其可扩展性。

通过负载均衡器从外部无限发送HTTP请求到容器。这就是拒绝服务攻击。

[client]$ while true; do curl -s http://10.20.30.150:8080 > /dev/null ;done

我們會在另一個終端中確認當時的負載狀況和相應的縮放情況。

$ kubectl get horizontalpodautoscalers.autoscaling -w
NAME        REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx   0%/25%    1         10        1          2m52s
nginx-hpa   Deployment/nginx   44%/25%   1         10        1          3m33s
nginx-hpa   Deployment/nginx   44%/25%   1         10        2          3m48s
nginx-hpa   Deployment/nginx   40%/25%   1         10        2          4m34s
nginx-hpa   Deployment/nginx   40%/25%   1         10        4          4m49s
nginx-hpa   Deployment/nginx   19%/25%   1         10        4          5m34s
nginx-hpa   Deployment/nginx   18%/25%   1         10        4          6m35s
nginx-hpa   Deployment/nginx   0%/25%    1         10        4          7m36s
nginx-hpa   Deployment/nginx   0%/25%    1         10        4          11m
nginx-hpa   Deployment/nginx   0%/25%    1         10        3          11m
nginx-hpa   Deployment/nginx   0%/25%    1         10        3          12m
nginx-hpa   Deployment/nginx   0%/25%    1         10        1          12m

当CPU负载超过阈值的25%时,我们可以看到它增加了副本以分散负载。
由于负载源的资源不足,因此它只能扩展到4个。

如果有多个容器,这次是一个Pod/一个容器,那么将以Pod内所有容器的平均值作为对象。

停止负载,副本也减少,最终恢复到1个。

我在另一个终端中确认了Pod的增减情况。虽然有些难以理解,但可以看出Pod根据负载进行部署,并在停止负载时被删除。

$ kubectl get pod -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-65585fc7c9-w8p92   1/1     Running   1          7h7m
nginx-65585fc7c9-fh6vm   0/1     Pending   0          0s
nginx-65585fc7c9-fh6vm   0/1     Pending   0          0s
nginx-65585fc7c9-fh6vm   0/1     ContainerCreating   0          0s
nginx-65585fc7c9-fh6vm   0/1     ContainerCreating   0          1s
nginx-65585fc7c9-fh6vm   1/1     Running             0          6s
nginx-65585fc7c9-xbb9n   0/1     Pending             0          0s
nginx-65585fc7c9-xbb9n   0/1     Pending             0          0s
nginx-65585fc7c9-c56nb   0/1     Pending             0          0s
nginx-65585fc7c9-c56nb   0/1     Pending             0          0s
nginx-65585fc7c9-xbb9n   0/1     ContainerCreating   0          0s
nginx-65585fc7c9-c56nb   0/1     ContainerCreating   0          0s
nginx-65585fc7c9-c56nb   0/1     ContainerCreating   0          1s
nginx-65585fc7c9-xbb9n   0/1     ContainerCreating   0          1s
nginx-65585fc7c9-xbb9n   1/1     Running             0          5s
nginx-65585fc7c9-c56nb   1/1     Running             0          6s
nginx-65585fc7c9-c56nb   1/1     Terminating         0          6m50s
nginx-65585fc7c9-c56nb   0/1     Terminating         0          6m51s
nginx-65585fc7c9-c56nb   0/1     Terminating         0          6m52s
nginx-65585fc7c9-c56nb   0/1     Terminating         0          6m52s
nginx-65585fc7c9-fh6vm   1/1     Terminating         0          8m52s
nginx-65585fc7c9-xbb9n   1/1     Terminating         0          7m51s
nginx-65585fc7c9-fh6vm   0/1     Terminating         0          8m53s
nginx-65585fc7c9-xbb9n   0/1     Terminating         0          7m52s
nginx-65585fc7c9-xbb9n   0/1     Terminating         0          7m53s
nginx-65585fc7c9-xbb9n   0/1     Terminating         0          7m53s
nginx-65585fc7c9-fh6vm   0/1     Terminating         0          8m54s
nginx-65585fc7c9-fh6vm   0/1     Terminating         0          8m54s

关于Horizontal Pod Autoscaler的运行机制

我已经查阅了手册,并整理如下。由于是英文手册,如果有错误,请谅解。

水平Pod自动扩展器

监视间隔

根据水平 Pod 自动缩放同步周期,默认每15秒进行监视。

副本数量的确定

必要な复制品数量根据设定值和当前度量值的比例,由以下公式决定。

必要的复制品数量=ceil(当前的复制品数量 *(当前的度量值 / 设置值))

※ceil:向上取整

扩展的对象

如果使用的是当前稳定版本的API(autoscaling/v1),仅支持CPU。如果使用的是测试版的API(autoscaling/v2beta2),还支持内存和自定义度量。

总结

本次我們確認了水平Pod自動調整器。
擴展操作對於處理相對輕量級業務,如Web服務等的系統非常適合。這是一種與Kubernetes微服務相融合的擴展方法。
根據手冊的內容,API版本從autoscaling/v2beta2變為autoscaling/v1後,功能和操作方式似乎有所不同。甚至配置清單的撰寫方式也稍有不同。由於開源項目的變化非常快速,所以必須經常檢查最新資訊。

广告
将在 10 秒后关闭
bannerAds