Kubernetes1.6新特性-不回收静态POD

一、静态POD介绍

在Kubernetes中有一个DaemonSet类型的POD,这种类型的POD可以在某个节点上长期运行,这种类型的POD就是静态POD。

静态POD直接由某个节点上的kubelet程序进行管理,不需要api server介入,静态POD也不需要关联任何RC,完全是由kubelet程序来监控,当kubelet发现静态POD停止掉的时候,重新启动静态POD。

二、Kubernetes回收策略

当kubernetes集群中某个节点上可用资源比较小时,kubernetes提供了资源回收策略来保证节点上POD正常运行。因为如果节点上的内存或者CPU资源耗尽时,这个节点上运行的POD就会变成不稳定。

Kubernetes通过kubelet来进行回收策略控制,保证节点上POD在节点资源比较小时可以稳定运行。

Kubelet提供QoS服务质量管理,支持系统级别的OOM控制。

在Kubernetes中,POD的QoS服务质量一共有三个级别,如下图所示:

Kubernetes1.6新特性-不回收静态POD_第1张图片

这三个QoS级别介绍,可以看下面表格:

QoS级别

QoS介绍

BestEffort

POD中的所有容器都没有指定CPU和内存的requests和limits,那么这个POD的QoS就是BestEffort级别

Burstable

POD中只要有一个容器,这个容器requests和limits的设置同其他容器设置的不一致,那么这个POD的QoS就是Burstable级别

Guaranteed

POD中所有容器都必须统一设置了limits,并且设置参数都一致,如果有一个容器要设置requests,那么所有容器都要设置,并设置参数同limits一致,那么这个POD的QoS就是Guaranteed级别

对于kubernetes来说,通过cgroup就可以给POD设置QoS级别,当资源不够使用时,先kill优先级低的POD,在实际使用时,是通过OOM(Out of Memory)分数值来实现的,OOM分数值从0到1000。OOM分数值是根据OOM_ADJ参数计算出来的,对于Guaranteed级别的POD,OOM_ADJ参数设置成了-998,对于BestEffort级别的POD,OOM_ADJ参数设置成了1000,对于Burstable级别的POD,OOM_ADJ参数取值从2到999,对于kube保留的资源,比如kubelet,OOM_ADJ参数设置成了-999。OOM_ADJ参数设置的越大,通过OOM_ADJ参数计算出来的OOM分数越高,OOM分数越高,这个POD的优先级就越低,在出现资源竞争的时候,就越早被kill掉,对于OOM_ADJ参数是-999的代表kubernetes永远不会因为OOM而被kill掉。如下图所示:

Kubernetes1.6新特性-不回收静态POD_第2张图片

kubelet可以提前监控到节点上资源减少,并且及时做出控制操作,可以停止某些POD,然后让调度来在其他节点上启动这些POD,这样就可以保证节点上资源足够POD使用。

三、1.6阿尔法版本新特性-不回收静态POD

在kubernetes1.6第一个阿尔法版本中提供了一个新特性,不回收静态POD。

在代码eviction_manager.go中可以看到

for i := range activePods {

             pod := activePods[i]

+            ifkubepod.IsStaticPod(pod) {

+                   //The eviction manager doesn't evict static pods. To stop a static

+                   //pod, the admin needs to remove the manifest from kubelet's

+                   //--config directory.

+                   //TODO(39124): This is a short term fix, we can't assume static pods

+                   //are always well behaved.

+                   glog.Infof("evictionmanager: NOT evicting static pod %v", pod.Name)

+                   continue

+            }

             status := v1.PodStatus{

                    Phase:   v1.PodFailed,

                    Message: fmt.Sprintf(message,resourceToReclaim),

如果判断POD属于静态POD,那么跳过处理步骤,通过这种方式来保证静态POD只能运行在对应的kubernetes集群某个节点上。

你可能感兴趣的:(容器)