HPA:horizontal Pod Autoscaling的水平自动伸缩。
这是k8s自带的模块。
pod占用cpu比例到达一定阀值,会触发伸缩机制。
replication controller 副本控制器
deployment controller 节点控制器 部署pod
hpa控制副本的数量一键控制部署pod。
1,hpa基于kube-controll-manager服务,周期性的检测pod的cpu使用率 默认30秒
2,hpa和replication controller,deployment controller,都属于k8s的资源对象。通过跟踪分析副本和deployment的pod的负载变化,针对性的调整目标pod的副本数。
阀值:正常情况下,pod的副本数,以及到达阀值之后,pod的扩容做的数量。
3,metrics
targets:阀值 minpods 最小的pod数 maxpods最大的pod数,peplicas当前的pod数
实验
每个node节点拖入镜像
安装hpa
mkdir hpa
cd hpa
docker load -i metrics-server.tar
master放入yaml文件
kubectl apply -f components.yam
部署在kube-system命名空间
测试创建pod
kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3
查看top,节点占用主机的cpu的情况
查看pod占用cpu的情况
完成
查看HPA如何实现
vim hpa-test.yaml
命令行的方式指定(不推荐):
在容器内进行压力测试
没有进行限制资源
当没有获取到限制资源,无法监控
添加了资源限制之后
重新进行压力测试:
沾满了,开始扩容
最多会变成指定最大的5个
会慢慢缩容
在同一个节点上测试(作业)
在另一个上压力测试,
pod自扩容到最大的5个pod
HPA的规则:
1,定义的时候必须要有资源限制,否则HPA无法进行监控
2,扩容是及时的,只要超过阀值会立刻扩容,不是立刻扩容到最大副本数。他会在最小值和最大值波动。如果扩容的数量满足了需求,不会在扩容。
3,缩容是缓慢的。如果业务的峰值较高,回收的策略太积极的话,可能会产生业务的崩溃。缩容的速度是比较慢的。
周期性的获取数据,缩容的机制问题。
面试题:
pod的副本数扩缩容有两种方式:
1,手动方式,修改控制器的副本数
一,通过命令行修改
kubectl scale deployment centos-test --replicas=5
二,
kubectl edit deployments.apps centos-test
三,修改yaml文件,apply -f 再重新部署更新。
2,hpa自动扩缩容,hpa监控的是cpu
自动扩缩容的的机制,扩的快,缩的慢,快的话系统容易崩溃。
资源限制:
pod的资源限制:
resources:
limits:
cpu: "1"
memory: 512Mi
pod最大占用1个cpu ,内存最大为512Mi
命名空间的资源限制:
lucky-cloud项目----部署再test1的命名空间,如果lucky-cloud不做限制,或者命名空间不做限制,他依然会占满所有集群资源。
部署到指定的命名空间
其他配置
设置多个svc
到低三个就不能建了
查看命名空间的资源限制
kubectl describe ns default
通过命名空间来对pod进行资源限制:
最多就占1个
不需要对每一个pod进行进行资源限制。
type的类型有三种,Container Pod Pvc
总结:
HPA 自动扩缩容
命名空间
第一种:
ResourceQuota
可以对命名空间进行资源限制。
第二种:
LimitRange:
直接在命名空间当中创建pod,容器的资源限制,这是一种统一限制。所有的pod都受这个条件的制约。
pod的资源限制,一般是我们创建的时候就声明好的,生产中是必加选项
resources:
limit
命名空间资源限制 对命名空间实验cpu和内存一定会做限制。
ResourceQuota
命名空间统一资源限制
limitRange
面试:
在生成中,一定会对命名空间和命名空间中的pod做cpu和内存的限制
核心:防止整个集群的资源被一个服务或者一个命名空间占满。
HPA:自动伸缩
作业固定在一个pod,观察,扩容之后是否会下降。
k8s集群部署pod的最大数量:10000
哪些服务会部署再k8s当中
中间件:
kafka:6
redis:3
业务服务:
自定义的镜像创建的容器
前端:nginx 3-6
12个左右。每个都是一个独立的业务。
在容器内抓包
复制id
在指定节点上将id解析为数字
72055 就是容器是pid号
进入容器内的网络命名空间,
获取网络设备名称
开始抓包