一. 前言
我们可以通过–replicas的方式来扩缩容,或者是通过dashboard的方式界面化的扩缩容。其实都需要手动,如果kubernetes可以通过当时容器使用情况来自动的扩缩容,其实有的可以进行预知,有的根本就是不确定的,纯手工去做也是不现实的人海战术。
Horizontal Pod Autoscaling,简称HPA, Kubernetes通过HPA的设定,实现了容器的弹性伸缩功能。对于Kubernetes中的POD集群来说,HPA可以实现很多自动化功能,比如当POD中业务负载上升的时候,可以创建新的POD来保证业务系统稳定运行,当POD中业务负载下降的时候,可以销毁POD来减少资源的浪费。当前的弹性伸缩的指标包括:CPU,内存,并发数,包传输大小。HPA控制器默认每隔30秒就会运行一次,一旦创建的HPA,我们就可以通过命令查看获取到的当前指标信息。
二. 原理
metrics-server 通过 kube-apiserver 发现所有节点,然后调用 kubelet APIs(通过 https 接口)获得各节点(Node)和 Pod 的 CPU、Memory 等资源使用情况。因为k8s的api-server将所有的数据持久化到了etcd中,显然k8s本身不能处理这种频率的采集,而且这种监控数据变化快且都是临时数据,因此需要有一个组件单独处理他们,k8s版本只存放部分在内存中,于是metric-server的概念诞生了。
三. Metrics-Server部署
1. 查看官网指导说明
2. 下载components.yaml文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
3. 修改配置文件components.yaml
4. 执行
kubectl apply components.yaml
5. 查看
kubectl top node
kubectl top pods -n kube-system
kubectl cluster-info
四. 自动扩容
1. 在docker-project的代码中增加测试用例,重新打包镜像,上传到伺服
2. 修改docker-project.yaml配置文件,增加资源限制
3. 运行
kubectl apply -f docker-project.yaml
4. 创建自动扩容的hpa
kubectl autoscale deployment docker-project --min=1 --max=3
5. 查看hpa
kubectl get hpa
6. cpu测试
通过shell脚本调用:http://192.168.214.128:31000/api/testCpu
#!/bin/bash
int=1
while(( $int<=10000 ))
do
let "int++"
curl "http://192.168.214.128:31000/api/testCpu";
done
观察hpa的变化:
五. 常见错误
1. Error: error creating self-signed certificates: mkdir apiserver.local.config: read-only file system
解决办法:设置对应的证书目录
2. Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
解决办法:/etc/kubernetes/manifests/kube-apiserver.yaml中增加- --enable-aggregator-routing=true,重启kubelet即可
3. 如果资源限制部分设置的参数过大时,导致一个pod占用node的资源过多,其他副本就不能放在此节点上了,如果系统只配置了一个node节点,那么其他副本就只能处于pending状态,并且分配不到ip地址; 如果资源限制设置过小的话,放不下一个容器,导致服务本身都无法启动。
4. 允许master节点作为工作节点
使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载。
允许master节点部署pod,使用命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
输出如下错误:(可以忽略)
node/master132 untainted
error: taint “node-role.kubernetes.io/master” not found
禁止master部署pod
kubectl taint nodes master132 node-role.kubernetes.io/master=true:NoSchedule