当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

k8s的资源分配

作者:小梦 来源: 网络 时间: 2024-07-18 阅读:

限制每个实例

在创建一个replicationcontroller(以下简称rc)时,我们可以在创建文件中指定pod的资源配额,如下面的json:
 {    "kind": "ReplicationController",    "apiVersion": "v1",    "metadata": {        "name": "eatcpu",        "creationTimestamp": null    },    "spec": {        "replicas": 2,        "selector": {"name": "huang"        },        "template": {"metadata": {    "name": "cpu",    "labels": {        "name": "huang"    }},"spec": {    "containers": [        {"name": "eatcpucontainer","image": "registry.hub.abc.com.cn/eatcpu:v1.1","resources": {"limits": {    "cpu": "1.2",    "memory": "1.1Gi"}},"command": ["/deadloop","-max_procs=4"]        }    ]}        }    },    "status": {        "replicas": 0    }}

当然实际上json不用写这么复杂,关键是:

 "resources": {"limits": {"cpu": "1.2","memory": "1.1Gi"  }         },     

这句的意思是给这个rc的每个pod分配cpu额度是1.2(具体什么意思呢?),内存额度1.1G。
当我们执行create命令的时候,若scheduler组件检查各个nodes发现没有满足1.2个空闲cpu和1.1G空闲内存的机器,那么这个pod就不能被创建,若rc要创建3个pod,整个集群只能满足创建2个,那么第三个pod会被放入队列中,等待集群有足够资源时再创建出来。

另外,比较有意思的是,若pod在运行过程中持续地消耗内存,超过了1.1G,pod会被销毁并重启,而当cpu消耗超过配额时,k8s不会做出相应的措施。

整个名称空间下的资源配额

利用k8s搭建部署服务,并在正式的场合使用时,几乎是肯定要引入一个“用户”概念的。可以使用namespace来实现用户的隔离。并使用quota为每个用户指定配额。
注:这里差不多是翻译github上原文,引用的几个yaml也出自于彼处,有兴趣的可以直接去看官文。

k8s下默认的namespace是default,我们可以手动添加一个namespace:

$ kubectl create -f namespace.yaml$ kubectl get namespacesNAMELABELS STATUSdefault         <none> Activequota-example   <none> Active

接着我们创建一个quota,quota可以指定某个namespace有多少的资源配额,包括cpu,内存,persistentvolumeclaims(据说是内存),pod数量,rc数量等等。
如下创建一个quota:

$ kubectl create -f quota.yaml --namespace=quota-example$ kubectl describe quota quota --namespace=quota-exampleName:       quotaNamespace:  quota-exampleResource    Used    Hard--------    ----    ----cpu         0       20memory      0       1Gipersistentvolumeclaims  0       10pods        0       10replicationcontrollers  0       20resourcequotas          1       1secrets     1       10services    0       5

创建了quota后我们每次创建一个rc(也即pods)都要指定它的资源配额,否则即便创建成功,容器也不能run起来。
指定配额的方法见标题1,但是那是对一个集群中的pod统一制定,我们也可以统一指定该namespace下的所有pods的配额,即创建一个limits:

$ kubectl create -f limits.yaml --namespace=quota-examplelimitranges/limits$ kubectl describe limits limits --namespace=quota-exampleName:           limitsNamespace:      quota-exampleTypeResource        Min     Max     Default------------        ---     ---     ---Container       memory          -       -       512MiContainer       cpu -       -       100m

现在我们可以正常地run一个rc了,并且,在容器成功跑起来后,我们可以统一地看到该namespace下的资源使用情况:

kubectl describe quota quota --namespace=quota-exampleName:       quotaNamespace:  defaultResource    UsedHard--------    --------cpu         100m20memory      536870912       1Gipersistentvolumeclaims  0   10pods        1   10replicationcontrollers  1   20resourcequotas          1   1secrets     1   10services    0   5

热点阅读

网友最爱