一. 前言

我们可以通过–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
Logo

开源、云原生的融合云平台

更多推荐