kubernetes-pod分配CPU和RAM资源以及计算方法

  • Post author:
  • Post category:其他


计算方法:

例子:

Containers:
    cpu-ram-demo-container:
     ...
     image: busybox:latest
     resources:
       Limits:
         cpu: 1
         memory: 128Mi
       Requests:
         cpu: 250m
         memory: 64Mi
可以理解为:
cpu: 最多使用1个核,最低要求 250/1000 = 1/4 核 (1 = 1000m);可以使用top简单查看你的机器的cpu总共有多少个核;

memory: 最多使用128M,最低要求64 M;


CPU和RAM单元

CPU资源以cpus为单位。允许小数值。你可以用后缀m来表示mili。例如100m cpu等同于100 milicpu,意思是0.1cpu。

RAM资源以bytes为单位。你可以将RAM表示为纯整数或具有这些后缀之一的定点整数:

E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki。例如,以下代表大约相同的数值:

128974848, 129e6, 129M , 123Mi

如果你不确定需要请求多少资源,首先你可以发布应用不指定资源,使用资源监控来确定合适的值。

如果容器超出他的RAM限制,它将从内存不足状态死亡。你可以指定比你期望稍高点的值来提高可靠性。

如果你没有指定限制和请求:

如果没有指定RAM限制,Kubernetes对于容器可以使用的RAM没有上线。容器可以使用所在机器所有的可用RAM资源。类似,如果没有指定CPU限制,Kubernetes对于CPU资源没有限制,容器可以使用所在机器所有的可用CPU资源。

默认的限制应用参照默认命名空间的限制范围。你可以使用kubectl describe limitrange limits来查看默认的限制。

备注:

如果节点中有多个pod配置了Requests,那么后面分配到该节点的pod需要计算该节点是否有足够的资源为:

节点剩下资源 = 节点总资源 – 已存在pod的Requests资源总和(n * pod)

比如:节点可分配内存资源为2000Mi,如果需要部署nginx的内存资源为:

        resources:
          limits:
            cpu: "2"
            memory: 1700Mi
          requests:
            cpu: 100m
            memory: 800Mi

我们扩展nginx的副本数:

kubectl scale --replicas=3 deployment/nginx

这时,一个节点只能运行2个nginx(2 * 800 =1600Mi),第三个nginx会运行于另外一个节点。

kubectl get po -o wide -l app=nginx                                                                                                  19:27:59
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-6579459fd6-7s8l2   1/1     Running   0          27m   172.20.169.181   k8s-node2   <none>           <none>
nginx-6579459fd6-sdsht   1/1     Running   1          27m   172.20.107.246   k8s-node3   <none>           <none>
nginx-6579459fd6-xrk6j   1/1     Running   0          27m   172.20.169.191   k8s-node2   <none>           <none>

原因是:虽然nginx实际没有使用到800Mi内存,但是requests已经把它预算在内。这种计算方式,也可以让你控制在一个节点运行pod的数量。

参考:


https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/


http://www.jianshu.com/p/dfa3be545dd4


https://kubernetes.io/docs/tasks/administer-cluster/memory-default-namespace/