在Kubernetes EKS集群上使用水平Pod自动缩放器
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自动缩放应用程序。