k8s的资源分配
限制每个实例
在创建一个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