Kubernetes常见优化之内存策略

为了使kubernetes更高效更稳定,往往需要针对操作系统层或Kubernetes本身在内存调度策略、磁盘使用策略、网络策略等方面进行优化,本节内容将讲述如何优化内存调度策略。

0x01 调整内存策略

基于应用在申请内存后并不会立刻完全使用的原理,为了能够运行更多更大的应用,Linux允许所有被应用申请的内存超过物理和交换空间的总内存,这种技术就是Overcommit。

当内存不足时,Linux会发生 OOM killer (OOM=out-of-memory),系统根据mm/oom_kill.c中的oom_badness函数选择相应的进程并对其斩杀。oom_badness函数计算每个进程的点数(0~1000),进程点数跟oom_score_adj有关,点数越高的进程越可能被杀死。

因此,为了避免系统发生OOM自动杀死进程,将overcommit_memory设置为“0”。

echo "vm.overcommit_memory = 0" >> /etc/sysctl.conf
sysctl -p
说明
0 检查是否有足够的可用内存供应用进程使用,仅当有足够的可用内存时允许申请,可用内存不足时申请失败并把错误返回给应用进程。
1 允许分配所有物理内存,不管当前的内存状态。
2 允许分配超过所有物理内存和交换空间总和的内存。

0x02 设置预留内存

修改配置/var/lib/kubelet/config.yaml

eventRecordQPS: 5
evictionHard:
  imagefs.available: 15%
  # 根据主机性能调整节点预留内存
  # memory.available: 100Mi
  memory.available: 1Gi
  nodefs.available: 10%
  nodefs.inodesFree: 5%

先掌握一些Kubelet Eviction Policy工作机制的知识:

  • kubelet预先监控本节点的资源使用,并且阻止资源被耗尽,以保证node的稳定性。
  • kubelet会预先Fail N(>= 1)个Pod以回收出现紧缺的资源。
  • kubelet在Fail一个Node时,会将Pod内所有Containners都kill,并把PodPhase设为Failed。
  • kubelet通过事先设定的 Eviction Thresholds 来触发Eviction动作以回收资源。

有了 Kubelet Eviction 后,Kubelet通过pro-actively监控节点资源并阻止资源被耗尽,一旦触发 Eviction Signals,就会直接Fail一些Pod以回收资源,同时在其他节点重新调度。

如果使用操作系统的OOM Killer,在杀掉某些容器后,Scheduler会在该节点上调度一个新的Pod或者直接重启容器,然而,该操作又会马上触发 OOM Killing Process,如此循环……

原创文章禁止转载:技术学堂 » Kubernetes常见优化之内存策略

精彩评论

8+6=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏