Kubernetes学习笔记(1):Allocatable资源

  1. 什么是Allocatable

        在Kebernetes的结点状态(NodeStatus)中有个属性Capacity,它统计结点的资源(比如CPU、内存)的总容量。结点中的部分资源可能预留给Kubernetes的部件(Kube-Reserved)或者其他部件使用(System-Reserved)。从资源总容量里减去这些预留的资源就是可分配的资源。这些可分配的资源就是结点状态中的Allocatable属性。

        如果在结点上部署一个或者多个容器,尽管在结点中剩下的真正可供分配给容器的资源减少了,但Allocatable属性的值并不会减少。这可能和我们最初的预计并不一致。

  1. 目前Allocatable实现的问题

        在Kebernetes版本1.6中,所有Windows结点的AllocatableCPU和内存都是0

        如果我们在部署Windows容器时没有成功,就有可能是由这个Allocatable属性的问题造成的。Kubernetes在选择结点部署容器的时候会根据结点可分配资源的多少来决定结点能否部署更多的容器。相应的代码如下(https://github.com/kubernetes/kubernetes/blob/master/plugin/pkg/scheduler/algorithm/predicates/predicates.go):

allocatable := nodeInfo.AllocatableResource()
if allocatable.MilliCPU < podRequest.MilliCPU+nodeInfo.RequestedResource().MilliCPU {
    predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceCPU, podRequest.MilliCPU, nodeInfo.RequestedResource().MilliCPU, allocatable.MilliCPU))
}
if allocatable.Memory < podRequest.Memory+nodeInfo.RequestedResource().Memory {
    predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceMemory, podRequest.Memory, nodeInfo.RequestedResource().Memory, allocatable.Memory))
}

        上述代码中allocatable就是结点状态中Allocatable属性,podRequest是待部署容器所需要的资源,而nodeInfo.RequestResource是结点上已经部署的所有容器需要的资源的总和。只有结点剩余足够多的资源才能部署新的容器。

        由于Windows结点的Allocatable属性始终是0,这导致如果我们在配置容器资源需求(容器部署设置中Resources属性中的Requests属性)时不能要求Kubernetes给容器分配定额的资源,否则会导致Kubernetes找不到满足条件的结点来部署容器。

你可能感兴趣的:(技术杂谈)