> 文档中心 > 自动化进行Pod的扩缩容-HPA

自动化进行Pod的扩缩容-HPA

自动扩缩容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 -ANAMESPACENAME      CPU(cores)   MEMORY(bytes)   default  busybox   0m    0Mi      kube-system     calico-kube-controllers-5dffd5886b-4blh6     3m    18Mi     kube-system     calico-node-fvbdq42m   135Mi    kube-system     calico-node-g8nqd52m   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 svcNAME  TYPE CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGEhpa-nginx    ClusterIP   10.98.236.134   <none> 80/TCP    3m17skubernetes   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!<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!<p>If you see this page, the nginx web server is successfully installed andworking. 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=10horizontalpodautoscaler.autoscaling/hpa-nginx autoscaled

看一下hpa的规则情况:

[root@k8s-master01 ~]# kubectl get hpaNAME REFERENCETARGETS   MINPODS   MAXPODS   REPLICAS   AGEhpa-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 hpaNAME REFERENCETARGETS    MINPODS   MAXPODS   REPLICAS   AGEhpa-nginx   Deployment/hpa-nginx   640%/10%   1  10 1   7m14s[root@k8s-master01 ~]# kubectl top pod NAME   CPU(cores)   MEMORY(bytes)   busybox0m    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-master01 ~]# kubectl get hpaNAME REFERENCETARGETS   MINPODS   MAXPODS   REPLICAS   AGEhpa-nginx   Deployment/hpa-nginx   2%/10%    1  10 10  11m[root@k8s-master01 ~]# kubectl get podNAME   READY   STATUS    RESTARTSAGEbusybox1/1     Running   26 (46m ago)   8dhpa-nginx-bd88bdd8f-h8vx7   1/1     Running   027m

这个功能虽然好用,但在实际生成中一定要结合实际的情况使用!!!