自动扩缩容
需求背景
为了处理突发而不可预测的流量增长
Kubernetes 可以监控你的 pod
并在检测到 CPU 使用率或其他度量增长时自动对它们扩容
k8s提供的解决方案
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640586109446-image.png)
1、每个节点上的cAdvisor组件收集每pod上的监控数据
2、Heapster聚集每个cAdvisor收集到的监控数据
3、Autoscaler从Heapster得到监控数据
根据计算结果调整副本数量
4、计算出最新的 pod 数量后
它会去更新 Scale 资源的 replicas 字段
剩下的工作就由 Replication 控制器、调度器、kublet 来完成
如何计算副本数
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640587357286-image.png)
集群扩容-增加新节点
HPA 在需要的时候会创建更多的 pod 实例
但万一所有的节点都满了,放不下更多 pod 了
则集群需要扩容了即往集群中增加新的节点
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640588590378-image.png)
-
发现未被调度的pod -
找可用节点 -
在该节点上调度该pod
autoscaler减少节点数目
如果某个节点上所有 pod 请求的CPU、内存都不到 50%,
该节点即被认定为不再需要
什么情况下该节点不可被回收
如果节点上有系统 pod 在运行、
对非托管 pod,、以及有本地存储的 pod
该节点不可被归还
否则就会造成这些 pod 提供的服务中断
即只有当 Cluster Autoscaler 知道节点上运行的 pod 能够重新调度到其他节点
该节点才会被归还
节点被选中下线的流程
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640590072709-image.png)
当一个节点被选中下线
它首先会被标记为不可调度
ReplicaSet或者其他控制器
创建替代pod并调度到其他剩下的节点
污点和容忍机制
节点声明一个NoSchedule类型的污点
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640591045764-image.png)
类似于 男女朋友要结婚之前
男朋友身上有很多缺点
女朋友要考虑下我是否能够容忍男朋友上的缺点
如果容忍则结婚
不能容忍则分手
节点声明一个PreferNoSchedule类型的污点
表示尽量阻止 pod 被调度到这个节点上
但是如果没有其他节点可以调度
pod 依然会被调度到这个节点上
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640591636497-image.png)
pod1: 和节点2说 我可以调度该这个节点嘛?
节点2: 我这边没有房间了 都住满了
pod1: 和节点1说 没有其他节点"收留"我了
您就行行好吧
节点1: 勉为其难的说那好吧
也类比
大学生刚出校门
能不给家里要钱就不要钱
实际挣不到钱 没办法生存了
再向家里要钱
节点声明一个NoExecute类型的污点
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640592152743-image.png)
节点运行期间
如果在一个节点上添加了 NoExecute 污点
那些在该节点上运行着的 pod,
如果没有容忍这个 NoExecute 污点
将会从这个节点去除
类比
一位将军有几个心腹
某一次打了败仗
将军性情大变
这些心腹中如果能容忍将军的这一变化
就继续跟着将军
如果忍受不了
则会离开将军
另谋高就
亲缘性机制
nodeSelector
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640592486284-image.png)
类比:
你对象有很多备胎
但她就一心一意想嫁给你
亲缘性机制
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640592646886-image.png)
类比:
你对象有很多备胎
她有80%嫁给你的概率
有20%嫁给备胎的概率
补充
1、还有非亲缘性机制让pod调度在不同的节点上
2、可以给节点设置机架标签 让所有pod调度在同一个机架上
联合集群
需求背景
为确保你不受数据中心级别故障的影响
应用程序应同时部署在多个数据中心或云可用区域中
当其中一个数据中心或可用区域变得不可用时
可将客户端请求路由到运行在其余健康数据中心或区域中的应用程序
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640594011178-image.png)
1、数据中心1中有一个k8s集群
数据中心2中有一个k8s集群(目的做数据灾备使用)
2、通过公共的控制面板来管理超级集群中的2个节点(每个节点代表一个k8s集群)
3、超级集群的唯一的访问入口是ingress
两种数据处理模式
数据同步
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640594274577-image.png)
控制面板在集群1上做资源操作
集群1将数据同步到集群2
统一分配
![](https://gitee.com/pingfanrenbiji/pictures/raw/master/2021-12-27/1640594357318-image.png)
通过控制面板发出创建10个pod的指令
每个集群分别创建5个