💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
现在我们先来运行一个自动扩缩容的例子进行实际的体验。 首先在系统中部署资源监控 metrics-server: ~~~bash cd /home/shiyanlou wget https://labfile.oss.aliyuncs.com/courses/1104/metrics-server.zip unzip metrics-server.zip ~~~ 进入 metrics-server 目录,修改`metrics-server-deployment.yaml`文件最后如下面所示: ~~~yaml ...... containers: - name: metrics-server #image: k8s.gcr.io/metrics-server-amd64:v0.3.4 image: mirrorgooglecontainers/metrics-server-amd64:v0.3.4 #imagePullPolicy: Always imagePullPolicy: IfNotPresent command: - /metrics-server - --kubelet-preferred-address-types=InternalIP # 使用 node 的 IP 地址连接 kubelet - --kubelet-insecure-tls # 跳过验证 Kubelet CA 证书 volumeMounts: - name: tmp-dir mountPath: /tmp ~~~ 应用所有的配置文件: ~~~bash cd /home/shiyanlou/metrics-server kubectl apply -f . ~~~ 稍等几分钟,当能够成功获取 Pod 的 CPU 和 MEMORY 信息时说明 metrics-server 已经部署好: ~~~bash $ kubectl top pods -n kube-system NAME CPU(cores) MEMORY(bytes) coredns-5c98db65d4-cpf7x 2m 17Mi etcd-kube-master 13m 84Mi kube-apiserver-kube-master 20m 222Mi kube-controller-manager-kube-master 7m 49Mi kube-proxy-cw9vm 1m 19Mi kube-proxy-vdtfr 1m 16Mi kube-proxy-w559s 1m 18Mi kube-scheduler-kube-master 1m 17Mi kubernetes-dashboard-5ff478f859-qt5v4 1m 20Mi metrics-server-5b64fcd7bc-khxcl 1m 13Mi ~~~ 本次实验中我们将会运行一个自定义的 hpa-example 镜像,本镜像由基础镜像 php-apache 修改制作而成,Dockerfile 的内容如下所示: ~~~yaml FROM php:5-apache ADD index.php /var/www/html/index.php RUN chmod a+rx index.php ~~~ 其中使用到的 index.php 页面的内容如下: ~~~php <?php $x = 0.0001; for ($i = 0; $i <= 1000000; $i++) { $x += sqrt($x); } echo "OK!"; ?> ~~~ 我们已经将这个镜像 build 并上传到仓库,大家可以通过仓库地址`registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/hpa-example:1.0`进行使用。 使用 hpa-example 镜像运行一个 Deployment,并使用 80 端口对外提供服务: ~~~bash $ kubectl run php-apache --image=registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/hpa-example:1.0 --requests=cpu=200m --limits=cpu=500m --expose --port=80 service/php-apache created deployment.apps/php-apache created ~~~ 查看是否创建好: ~~~bash # 获取到 php-apache 服务的虚拟集群 IP 地址:10.106.36.239,后面将会使用到 $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 52d php-apache ClusterIP 10.106.36.239 <none> 80/TCP 48s # 可以发现这个时候只运行了一个 Pod $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE php-apache 1/1 1 1 57s ~~~ 当服务创建好以后,使用`kubectl autoscale`命令创建 Pod 水平自动伸缩,下面的命令指定了 php-apache Deployment 的 Pod 副本数量范围:最少为 1 个,最多为 10 个;同时我们指定平均 CPU 利用率为 50%,简单的说 HPA 会通过增加或是减少 Pod 的副本数量,来维持所有 Pod 的平均 CPU 利用率为 50%(前面在创建 Deployment 时指定最少的 CPU 为 200m,所以平均 CPU 的利用率为 100m)。 ~~~bash $ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 horizontalpodautoscaler.autoscaling/php-apache autoscaled ~~~ 查看刚刚创建的 HPA: ~~~bash # 由于目前没有向服务器发送请求,所以当前 CPU 的消耗为 0%,这里的数值为所有 Pod 的 CPU 消耗平均值 $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 1 69s ~~~ 接下来将会增加服务的工作负荷,以此来观察 Pod 水平自动伸缩的效果。使用 busybox 镜像创建并启动一个名为 load-generator 的 Pod,并执行命令无限循环的向 php-apache 服务发送查询请求,新开一个终端执行如下命令:(可以看到每一次查询成功都会有一个 OK!输出) ~~~bash $ kubectl run -it load-generator --image=busybox /bin/sh / # while true;do wget -q -O- http://10.106.36.239;done OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK! ... ~~~ 大概等半分钟左右,查看 php-apache HPA 的信息可以发现由于持续不断的查询请求导致 CPU 负载变高,现在已经超过定义的平均值 50% 成为 53% 了: ~~~bash $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 53%/50% 1 10 5 9m41s ~~~ 由于 CPU 平均消耗超过了预设值,这个时候就会触发 kubernetes 系统 Pod 的水平自动扩容,但是扩容范围也必须少于设定的最大值 10: ~~~bash # 这个时候已经将 Pod 的数量从 1 扩容到 5 了 $ kubectl get deployment php-apache NAME READY UP-TO-DATE AVAILABLE AGE php-apache 5/5 5 5 26m # 查看具体的 Pod 列表,可以看到新创建的 4 个 Pod 名称 $ kubectl get pods NAME READY STATUS RESTARTS AGE load-generator-7d549cd44-p42n5 1/1 Running 0 9m19s php-apache-7dd4fd89d8-2m2zb 1/1 Running 0 7m18s php-apache-7dd4fd89d8-9pztx 1/1 Running 0 7m18s php-apache-7dd4fd89d8-k5s6x 1/1 Running 0 31m php-apache-7dd4fd89d8-przv5 1/1 Running 0 7m18s php-apache-7dd4fd89d8-r995w 1/1 Running 0 7m3s ~~~ 现在停止服务请求的发送,在运行 busybox 镜像的终端按`Ctrl+C`停止。当请求停止,CPU 工作负载降低,这个时候就会触发 kubernetes 系统 Pod 的水平自动缩容,缩容范围也不能小于设定的最小值 1:(这个自动缩容的过程可能需要持续好几分钟的时间才能完成,请耐心等待一下才能够查看到效果。) ~~~bash # 由于停止了请求,最终 HPA 显示的 CPU 平均负载会固定到 0% $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 1 17m # HPA 完成了自动缩容,现在 php-apache Deployment 只有一个 Pod 在运行中了,其余的四个 Pod 都被系统 kill 掉了 $ kubectl get deployment php-apache NAME READY UP-TO-DATE AVAILABLE AGE php-apache 1/1 1 1 33m # 查看最终剩下的一个 Pod 的名称 $ kubectl get pods NAME READY STATUS RESTARTS AGE load-generator-7d549cd44-p42n5 1/1 Running 0 11m php-apache-7dd4fd89d8-k5s6x 1/1 Running 0 32m # 查看整个 php-apache Deployment 的 Events,可以发现 Pod 的数量变化过程为:1 -> 4 -> 5 -> 1 $ kubectl describe deployment/php-apache ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 32m deployment-controller Scaled up replica set php-apache-7dd4fd89d8 to 1 Normal ScalingReplicaSet 8m52s deployment-controller Scaled up replica set php-apache-7dd4fd89d8 to 4 Normal ScalingReplicaSet 8m37s deployment-controller Scaled up replica set php-apache-7dd4fd89d8 to 5 Normal ScalingReplicaSet 2s deployment-controller Scaled down replica set php-apache-7dd4fd89d8 to 1 ~~~ 查看当前 php-apache HPA 的详细信息: ~~~bash $ kubectl describe hpa php-apache Name: php-apache Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: Wed, 09 Oct 2019 13:37:01 +0800 Reference: Deployment/php-apache Metrics: ( current / target ) resource cpu on pods (as a percentage of request): 0% (1m) / 50% Min replicas: 1 Max replicas: 10 Deployment pods: 1 current / 1 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ReadyForNewScale recommended size matches current size ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request) ScalingLimited True TooFewReplicas the desired replica count is increasing faster than the maximum scale rate Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 59m horizontal-pod-autoscaler New size: 1; reason: All metrics below target ~~~ 上面的整个过程就向我们完整的展示了 HPA 自动扩缩容的过程。