关于k8s关闭swap分区与swappiness设置的问题
1、基于其出发点,k8s希望将资源限制在一个严格,精确可控范围内:
Kubernetes 云原生的实现目的是将运行实例紧密包装到尽可能接近 100%:
所有的部署、运行环境应该与 CPU 以及内存限定在一个可控的空间内。所以如果调度程序发送一个 Pod 到某一台节点机器,它不应该使用 Swap。如果使用swap,则其实node的pod使用内存总和可能超过了node的内存,这样其实就达不到资源的严格限制和管理的目的
2、为了性能和服务的稳定性
若开启 Swap ,将会减慢速度。因此,关闭 Swap 也有一部分是为了性能考虑。
原因是kubelet不是为了处理交换情况而设计的,Kubernetes团队不打算实现这一点,因为目标是pod应该适合主机的内存。打开这个之后,不稳定,pod可能使用内存也可以使用交换,这样对服务不稳定,而且无法保证pod申请的内存应该是真正使用的内存,
还可能运行运行着,服务用的内存越来越多,导致已有服务可能部分内存不用的时候释放掉,再申请的时候是被分配到swap了,效率就变了,
这样引发的问题很难定位,也很难确定,出现未定义行为
3、默认不允许,如果需要也确实可以打开,kubelet的–fail-swap-on flag可以控制:
这个flag表示为:Makes the Kubelet fail to start if swap is enabled on the node.
如果为true(默认值)就要求必须要关闭swap,false是表示即使宿主开启了swap,kubelet也是可以成功启动,但是pod是允许使用swap了,这部分代码因为经常出问题,所以直接swap在宿主上禁用会比较好。
参数配置:
永久生效:
echo "vm.swappiness = 0">> /etc/sysctl.conf (尽量不使用交换分区,注意不是禁用)
刷新SWAP
可以执行命令刷新一次SWAP(将SWAP里的数据转储回内存,并清空SWAP里的数据)
swapoff -a && swapon -a
sysctl -p (执行这个使其生效,不用重启)