在Kubernetes EKS集群上使用水平Pod自动缩放器

时间:2020-02-23 14:31:50  来源:igfitidea点击:

Horizontal Pod Autoscaler是Kubernetes资源控制器,它允许根据观察到的CPU利用率或者使用自定义指标支持来自动缩放复制控制器,部署,副本集或者有状态集中的pod数量。水平窗格自动缩放仅适用于可以缩放的对象。对于无法缩放的对象(如DaemonSets),将无法使用。

Horizontal Pod Autoscaler被实现为Kubernetes API资源和控制器。该资源确定控制器的行为。控制器会定期调整复制控制器或者部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。

在Kubernetes EKS集群上使用水平Pod自动缩放器

我们必须先安装Metrics Server,然后才能在EKS Cluster上使用Horizontal Pod Autoscaler。请按照以下教程进行完整的安装步骤。

在Amazon EKS集群上安装Kubernetes Metrics Server

使用以下命令验证指标服务器是否正常运行。

$kubectl get apiservice v1beta1.metrics.k8s.io -o yaml

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apiregistration.k8s.io/v1beta1","kind":"APIService","metadata":{"annotations":{},"name":"v1beta1.metrics.k8s.io"},"spec":{"group":"metrics.k8s.io","groupPriorityMinimum":100,"insecureSkipTLSVerify":true,"service":{"name":"metrics-server","namespace":"kube-system"},"version":"v1beta1","versionPriority":100}}
  creationTimestamp: "2017-08-12T11:27:13Z"
  name: v1beta1.metrics.k8s.io
  resourceVersion: "130943"
  selfLink: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
  uid: 83c44e41-6346-4dff-8ce2-aff665199209
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
    port: 443
  version: v1beta1
  versionPriority: 100
status:
  conditions:
  - lastTransitionTime: "2017-08-12T11:27:18Z"
    message: all checks passed
    reason: Passed
    status: "True"
    type: Available

部署示例应用程序以测试HPA

让我们部署一个很好的测试应用程序,以演示Horizontal Pod Autoscaler的工作原理。

创建演示演示名称空间:

$kubectl create ns demo
namespace/demo created

$kubectl get ns
NAME              STATUS   AGE
default           Active   2d20h
demo              Active   22s
kube-node-lease   Active   2d20h
kube-public       Active   2d20h
kube-system       Active   2d20h

通过在终端中运行以下命令来部署示例Apache Web服务器应用程序。

$kubectl apply -f https://k8s.io/examples/application/php-apache.yaml -n demo
deployment.apps/php-apache created
service/php-apache created

我们还可以使用kubectl run命令来部署应用程序并创建服务。

$kubectl run php-apache \
  --generator=run-pod/v1 \
  --image=k8s.gcr.io/hpa-example \
  --requests=cpu=200m \
  --limits=cpu=500m \
  --expose \
  --port=80

检查应用程序状态。

$kubectl get pods -n demo
NAME                          READY   STATUS    RESTARTS   AGE
php-apache-79544c9bd9-wccnj   1/1     Running   0          40s

创建Kubernetes HPA资源

当应用程序运行时,我们可以创建HPA资源。

$kubectl autoscale deployment php-apache --cpu-percent=70 --min=1 --max=5 -n demo
horizontalpodautoscaler.autoscaling/php-apache autoscaled

上面的命令创建一个自动缩放器,当CPU利用率超过70%时,该缩放器将扩展Pod。Pod的最小数量设置为1,最大数量设置为5.

使用以下命令获取自动定标器的详细信息:

$kubectl get hpa -n demo
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/70%    1         5         1          80s

$kubectl describe hpa -n demo
Name:                                                  php-apache
Namespace:                                             demo
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Fri, 14 Aug 2017 21:38:12 +0300
Reference:                                             Deployment/php-apache
Metrics:                                               ( current/target )
  resource cpu on pods  (as a percentage of request):  0% (1m)/70%
Min replicas:                                          1
Max replicas:                                          5
Deployment pods:                                       1 current/1 desired
Conditions:
  Type            Status  Reason               Message
  ----            ------  ------               ------
  AbleToScale     True    ScaleDownStabilized  recent recommendations were higher than current one, applying the highest recent recommendation
  ScalingActive   True    ValidMetricFound     the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange   the desired count is within the acceptable range
Events:           <none>

负荷增加

现在让我们通过从多个位置访问我们在Kubernetes上部署的服务来增加负载。为此目的,使用busybox容器生成负载。

kubectl run -it --rm load-generator --image=busybox /bin/sh --generator=run-pod/v1 -n demo

我们已登录到集装箱码头。运行以下命令以执行while循环,该循环会到达http:///php-apache上的服务端点

/# while true; do wget -q -O - http://php-apache; done

打开一个单独的终端,查看随着负载增加,自动缩放器如何在部署中创建更多Pod。

$kubectl get hpa -n demo
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   83%/70%   1         5         5          9m

只要实际CPU百分比高于目标百分比,副本数就会增加,最多为5. 在这种情况下,副本数为83%,因此REPLICAS的数量会继续增加。

使用CTRL + C停止加载

观看自动缩放器按比例缩减部署:

$kubectl get hpa -n demo -w

运行Pod可能需要几分钟,然后恢复为1. 一旦完成,请清洁设置。

$kubectl delete -f https://k8s.io/examples/application/php-apache.yaml -n demo
deployment.apps "php-apache" deleted
service "php-apache" deleted

删除自动定标器。

$kubectl delete hpa php-apache -n demo
horizontalpodautoscaler.autoscaling "php-apache" deleted

最后删除演示名称空间。

$kubectl delete ns demo
namespace "demo" deleted

我们将使用相同的方法通过Metrics Server通过HPA自动缩放应用程序。