Pod的扩缩容-HPA
自动扩缩容HPA:全称是Horizontal Pod Autoscaler我们安装k8s集群的时候,安装过一个metrics-server的组件,这是一个监控数据组件,提供HPA和基础资源监控的能力。就是这面这个Pod:[root@k8s-master01 ~]# kubectl get pod -n kube-systemmetrics-server-6bf7dcd649-5fhrw1/1Run
自动扩缩容HPA:全称是Horizontal Pod Autoscaler
我们安装k8s集群的时候,安装过一个metrics-server的组件,这是一个监控数据组件,提供HPA和基础资源监控的能力。就是这面这个Pod:
[root@k8s-master01 ~]# kubectl get pod -n kube-system
metrics-server-6bf7dcd649-5fhrw 1/1 Running 2 (3d5h ago) 8d
通过这个组件可以看到节点或者Pod的内存和CPU的使用率:
[root@k8s-master01 ~]# kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default busybox 0m 0Mi
kube-system calico-kube-controllers-5dffd5886b-4blh6 3m 18Mi
kube-system calico-node-fvbdq 42m 135Mi
kube-system calico-node-g8nqd 52m 73Mi
除了可以进行简单的监控功能,还可以利用这个监控的数据做一些其他的操作。
比如我们可以给Pod的资源设定某个值,当资源的使用超过这个值,那么系统就会认为这个Pod当前存在压力,从而就行扩容。
一般使用CPU和自定义指标进行扩容,内存相对较少。
HPA实践:
注意事项:要想实现HPA的自动扩容,需要满足以下几个条件
- 必须安装metrics-server组件或其他自定义版本的metrics-server
- 必须配置requests参数
- 不能扩容无法缩放的对象,如DaemonSet 首先创建一个nginx的yaml文件:
kubectl create deployment hpa-nginx --image=nginx --dry-run=client -o yaml > hpa-nginx.yaml
然后进入yaml文件中进行配置:在配置镜像那里进行配置,下列代码的后三行,如果也想对基于内存扩容的话也可以将内存写上。
- resources:是资源的意思
- requests:是请求的意思,这里应该是请求资源的意思
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
cpu: 10m
执行yaml文件创建副本:
[root@k8s-master01 ~]# kubectl create -f hpa-nginx.yaml
deployment.apps/hpa-nginx created
暴露出一个service端口:
[root@k8s-master01 ~]# kubectl expose deployment hpa-nginx --port=80
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hpa-nginx ClusterIP 10.98.236.134 <none> 80/TCP 3m17s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
访问测试一下:证明这个Pod可以用了
[root@k8s-master01 ~]# curl 10.98.236.134
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
配置Hpa自动扩缩容的规则:这条命令是说当hpa-nginx这个Pod的cpu值达到10的时候,将进行自动扩容,最小扩容1个,最大扩容10个。
[root@k8s-master01 ~]# kubectl autoscale deployment hpa-nginx --cpu-percent=10 --min=1 --max=10
horizontalpodautoscaler.autoscaling/hpa-nginx autoscaled
看一下hpa的规则情况:
[root@k8s-master01 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-nginx Deployment/hpa-nginx 0%/10% 1 10 1 2m38s
下面进行一个循环访问hpa-nginx:观察hpa的cpu值会不会上升
[root@k8s-master01 ~]# while true; do wget -q -O- http://10.98.236.134 >/dev/null; done
观察是否已经进行扩容:可以看到hpa-nginx的副本数已经进行了自动扩容
[root@k8s-master01 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-nginx Deployment/hpa-nginx 640%/10% 1 10 1 7m14s
[root@k8s-master01 ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
busybox 0m 0Mi
hpa-nginx-bd88bdd8f-7gdwq 1m 3Mi
hpa-nginx-bd88bdd8f-8c6j6 1m 3Mi
hpa-nginx-bd88bdd8f-cfcjs 1m 7Mi
hpa-nginx-bd88bdd8f-h8vx7 74m 7Mi
hpa-nginx-bd88bdd8f-kpgl8 2m 3Mi
hpa-nginx-bd88bdd8f-lpf45 1m 3Mi
hpa-nginx-bd88bdd8f-lwc2h 1m 3Mi
hpa-nginx-bd88bdd8f-qkgfd 1m 3Mi
hpa-nginx-bd88bdd8f-t9fj9 1m 3Mi
hpa-nginx-bd88bdd8f-tbrl4 1m 7Mi
那么,接下来将访问测试停下,看副本是否会自动缩容到最初;等待一会发现副本回到了最原始的一个。注意这个时间可能会有点慢,稍微等一会,不是报错了。
[root@k8s-master ~]# kubectl get hpa -A
NAMESPACE NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
default hpa-nginx Deployment/hpa-nginx 0%/10% 1 10 1 14m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 26 (46m ago) 8d
hpa-nginx-bd88bdd8f-h8vx7 1/1 Running 0 27m
在实际生成中一定要结合实际的情况使用!!!
更多推荐
所有评论(0)