目录
参考文章:(97条消息) Kubernetes-自动扩展器HPA、VPA、CA_hpa vpa_SRE运维充电站的博客-CSDN博客
HPA
VPA
官方网址:autoscaler/vertical-pod-autoscaler at master · kubernetes/autoscaler · GitHub
HPA和VPA进行扩缩容的区别:
metrics server
官方网址:autoscaler/vertical-pod-autoscaler at master · kubernetes/autoscaler · GitHub
安装Metrics Server
1、下载官方的yaml文件,并修改image为阿里云的地址
2、执行安装命令
3、测试效果
安装HPA
参考文章:(117条消息) k8s - 容器类型 - logrotate日志轮转工具 - HPA的部署 - Dashboard安装部署_k8s logrotate_Wangsh@的博客-CSDN博客
1、安装好metrics-server
2、创建HPA功能
2、生成镜像文件
3、创建php-apache.yaml
4、创建HPA
4.1、导出hpa-example镜像,并传到每一台node节点服务器上去
4.2、然后删除pod(删除php-apache.yaml),又重启pod
5、增加负载
6、停止产生负载
参考文章:(97条消息) Kubernetes-自动扩展器HPA、VPA、CA_hpa vpa_SRE运维充电站的博客-CSDN博客
HPA
HPA 是 Horizontal Pod Autoscaler(自动扩缩容)。
它是 Kubernetes 中的一个功能,用于根据 CPU 使用率或其他指标自动调整同一 Deployment 或 ReplicaSet 中运行的 Pod 的副本数量。
在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的 Pods。 这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩(VPA)意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。
如果负载减少,并且 Pod 的数量高于配置的最小值,HPA会指示工作负载资源( Deployment、StatefulSet 或其他类似资源)缩减。
水平 Pod 自动扩缩不适用于无法扩缩的对象(例如:DaemonSet。)
HPA 被实现为 Kubernetes API 资源和控制器。
资源决定了控制器的行为。在 Kubernetes 控制平面内运行的水平 Pod 自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标, 例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。
VPA
官方网址:autoscaler/vertical-pod-autoscaler at master · kubernetes/autoscaler · GitHub
使用户无需设置最新的资源限制和对容器中容器的请求。什么时候配置,它将根据使用情况自动设置请求,从而允许对节点进行适当的调度,以便适当的资源量可用于每个容器。它还将保持限制和 在初始容器配置中指定的请求。
它既可以缩小过度请求资源的 pod,也可以根据资源的使用情况请求不足的升级Pod,这些Pod 在时间。
VPA 全称 Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,可以根据容器资源使用情况自动设置 CPU 和 内存 的请求值,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。
通过扩缩pod的cpu和内存的大小来提高/降低pod的处理能力
通过对pod的硬件的资源得到调整,来达到提升pod的处理能力
HPA和VPA进行扩缩容的区别:
HPV是通过改变Pod(副本)数量的
VPA是通过改变启动的Pod的cpu使用率和内存大小的
metrics server
官方网址:autoscaler/vertical-pod-autoscaler at master · kubernetes/autoscaler · GitHub
Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展、高效的容器资源指标来源。
Metrics Server 从 Kubelets 收集资源指标,并通过Metrics API在 Kubernetes apiserver 中公开它们, 以供Horizontal Pod Autoscaler(HPA )和Vertical Pod Autoscaler(VPA)使用。还可以通过 访问指标 API kubectl top,从而更轻松地调试自动缩放管道
Metrics Server基于内存存储,重启后数据将全部丢失,而且它仅能留存最近收集到的指标数据,因此,如果用户期望访问历史数据, 就不得不借助于第三方的监控系统(如 Prometheus等)。
安装Metrics Server
1、下载官方的yaml文件,并修改image为阿里云的地址
安装路径:https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
下载后需要修改components.yaml
原因是我们不能在外网下载metrics镜像
添加参数
修改后:
2、执行安装命令
传输到master上去
运行components.yaml文件
[root@master ~]# kubectl apply -f components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@master ~]#
查看是否启动成功
[root@master ~]# kubectl get deployment -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 31h
metrics-server 1/1 1 1 12m
3、测试效果
[root@master ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
my-nginx-575db987b-5h7xn 0m 2Mi
my-nginx-575db987b-nwl5h 0m 2Mi
my-nginx-575db987b-vqngh 0m 2Mi
myapp-pod 0m 0Mi
redis 2m 7Mi
scnginx 0m 1Mi
[root@master ~]#
[root@master ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 123m 6% 1040Mi 60%
node1 48m 2% 899Mi 52%
node2 41m 2% 580Mi 33%
node3 90m 4% 740Mi 43%
[root@master ~]#
#能够使用上面的命令查看到Pod的效果,说明metrics server已经安装成功
安装HPA
参考文章:(117条消息) k8s - 容器类型 - logrotate日志轮转工具 - HPA的部署 - Dashboard安装部署_k8s logrotate_Wangsh@的博客-CSDN博客
1、安装好metrics-server
2、创建HPA功能
编辑Dockerfile和index.php
Dockerfiel文件:
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
index.php:(测试HPA扩缩额能力的文件)
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
2、生成镜像文件
[root@master hpa]# docker build -t clay-hpa:1.0 .
创建一个链接的镜像hpa-example指向我们自己创建的clay-hpa镜像
docker tag clay-hpa:1.0 hpa-example:latest
3、创建php-apache.yaml
[root@master hpa]# cat php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: clay-hpa:1.0
ports:
- containerPort: 80
resources:
limits:
cpu: 200m
requests:
cpu: 100m
---
apiVersion: v1
kind: Service
metadata:
namespace: default
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
[root@master hpa]#
启动php-apache.yaml文件
[root@master hpa]# kubectl apply -f php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
[root@master hpa]#
4、创建HPA
[root@master hpa]# kubectl autoscale deployment php-apache --cpu-percent=10 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
[root@master hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache <unknown>/10% 1 10 0 13s
[root@master hpa]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-apache-779bc4fcc9-2qgm4 0/1 ContainerCreating 0 61s
[root@master hpa]#
发现没有创建成功
原因是其他的node节点服务器上没有所需的hpa镜像导致的
4.1、导出hpa-example镜像,并传到每一台node节点服务器上去
[root@master ~]# docker save >hpa-example.tar clay-hpa:1.0
将它scp到每一台node节点服务器上去,防止启动的副本数量过多,其他的node节点上没有镜像
[root@master ~]# scp hpa-example.tar root@192.168.2.212:/root
传输成功
docker导入hpa-example镜像(每台node都导入)
[root@node1 ~]# docker load < hpa-example.tar
3c816b4ead84: Loading layer [==================================================>] 58.47MB/58.47MB
b87a266e6a9c: Loading layer [==================================================>] 3.584kB/3.584kB
82bded2c3a7c: Loading layer [==================================================>] 213.6MB/213.6MB
6eb3cfd4ad9e: Loading layer [==================================================>] 3.584kB/3.584kB
b1841504f6c8: Loading layer [==================================================>] 43.04MB/43.04MB
4dd88f8a7689: Loading layer [==================================================>] 11.78kB/11.78kB
9311481e1bdc: Loading layer [==================================================>] 9.728kB/9.728kB
d89c229e40ae: Loading layer [==================================================>] 7.68kB/7.68kB
5ce59bfe8a3a: Loading layer [==================================================>] 13.82MB/13.82MB
bebcda512a6d: Loading layer [==================================================>] 4.096kB/4.096kB
588ee8a7eeec: Loading layer [==================================================>] 34.42MB/34.42MB
13ab94c9aa15: Loading layer [==================================================>] 11.78kB/11.78kB
1aab22401f12: Loading layer [==================================================>] 4.608kB/4.608kB
6f974e73bdb1: Loading layer [==================================================>] 3.584kB/3.584kB
5995ac88ad01: Loading layer [==================================================>] 4.096kB/4.096kB
Loaded image: hpa-example:latest
[root@node1 ~]#
4.2、然后删除pod(删除php-apache.yaml),又重启pod
[root@master hpa]# kubectl delete -f php-apache.yaml
deployment.apps "php-apache" deleted
service "php-apache" deleted
[root@master hpa]#
[root@master hpa]# kubectl apply -f php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
[root@master hpa]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-apache-779bc4fcc9-4ct7p 1/1 Running 0 12s
5、增加负载
接下来,看看自动扩缩器如何对增加的负载做出反应。 为此,你将启动一个不同的 Pod 作为客户端。 客户端 Pod 中的容器在无限循环中运行,向 php-apache 服务发送查询。
# 在单独的终端中运行它
# 以便负载生成继续,你可以继续执行其余步骤
[root@k8s-master hpa]# kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -"while sleep 0.01; do wget -q -O- http://10.244.2.4; done"
在增加负载的同时,使用kubectl get hpa php-apache --watch观察cpu负载情况,pod数量
可以看到,一分钟左右,cpu的负载在不断升高,而HPA也在不断的增加pod的数量,一致到设置的最大pod数
同时,k8s集群中的php-apache的pod数量也和HPA增加的pod数一致
[root@k8s-master hpa]# kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 1%/10% 1 10 1 18m
php-apache Deployment/php-apache 63%/10% 1 10 1 21m
php-apache Deployment/php-apache 199%/10% 1 10 4 21m
php-apache Deployment/php-apache 107%/10% 1 10 8 21m
php-apache Deployment/php-apache 51%/10% 1 10 10 22m
php-apache Deployment/php-apache 24%/10% 1 10 10 22m
php-apache Deployment/php-apache 22%/10% 1 10 10 22m
php-apache Deployment/php-apache 15%/10% 1 10 10 22m
php-apache Deployment/php-apache 1%/10% 1 10 10 23m
[root@k8s-master hpa]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READISS GATES
php-apache-7c97954b84-27zc5 1/1 Running 0 4m11s 10.244.3.8 k8s-node3 <none> <none
php-apache-7c97954b84-2xp8r 1/1 Running 0 4m41s 10.244.1.4 k8s-node1 <none> <none
php-apache-7c97954b84-5tnfx 1/1 Running 0 4m26s 10.244.3.7 k8s-node3 <none> <none
php-apache-7c97954b84-64vn7 1/1 Running 0 4m11s 10.244.1.6 k8s-node1 <none> <none
php-apache-7c97954b84-c8wbq 1/1 Running 0 4m26s 10.244.2.4 k8s-node2 <none> <none
php-apache-7c97954b84-gw5x8 1/1 Running 0 4m41s 10.244.2.3 k8s-node2 <none> <none
php-apache-7c97954b84-lkk9p 1/1 Running 0 4m26s 10.244.2.5 k8s-node2 <none> <none
php-apache-7c97954b84-lvqsj 1/1 Running 0 21m 10.244.1.3 k8s-node1 <none> <none
php-apache-7c97954b84-rhqcv 1/1 Running 0 4m26s 10.244.1.5 k8s-node1 <none> <none
php-apache-7c97954b84-rmx9x 1/1 Running 0 4m41s 10.244.3.6 k8s-node3 <none> <none
6、停止产生负载
在我们创建 busybox 容器的终端中,输入 <Ctrl> + C 来终止负载的产生。
然后验证结果状态(大约一分钟后):pod的数量显示它已经缩小了
[root@k8s-master HPA]# kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 1%/10% 1 10 1 18m
php-apache Deployment/php-apache 63%/10% 1 10 1 21m
php-apache Deployment/php-apache 199%/10% 1 10 4 21m
php-apache Deployment/php-apache 107%/10% 1 10 8 21m
php-apache Deployment/php-apache 51%/10% 1 10 10 22m
php-apache Deployment/php-apache 24%/10% 1 10 10 22m
php-apache Deployment/php-apache 22%/10% 1 10 10 22m
php-apache Deployment/php-apache 15%/10% 1 10 10 22m
php-apache Deployment/php-apache 1%/10% 1 10 10 23m
php-apache Deployment/php-apache 1%/10% 1 10 10 27m
php-apache Deployment/php-apache 1%/10% 1 10 1 28m
[root@k8s-master HPA]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
php-apache-7c97954b84-77fgv 1/1 Running 0 7m2s 10.244.1.13 k8s-node1 <none> <none>
[root@k8s-master HPA]#
一旦 CPU 利用率降至 0,HPA 会自动将副本数缩减为 1。
自动扩缩完成副本数量的改变可能需要几分钟的时间。